diff --git a/README.md b/README.md index e229137fe..f6d31103c 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,12 @@ Run the following commands in `Terminal` to Release Notes -------- +### 3.0 - 3 Mar 2015 +- New plug-in system is available +- Connection pooling by c3p0 +- New branch UI +- Compare between specified commit ids + ### 2.8 - 1 Feb 2015 - New logo and icons - New system setting options to control visibility diff --git a/build.xml b/build.xml index b0416d8ed..5b3e67c5d 100644 --- a/build.xml +++ b/build.xml @@ -5,7 +5,7 @@ - + diff --git a/etc/deploy-assemby-jar.sh b/etc/deploy-assemby-jar.sh old mode 100644 new mode 100755 index 11f276d1d..7c26b427d --- a/etc/deploy-assemby-jar.sh +++ b/etc/deploy-assemby-jar.sh @@ -1,9 +1,9 @@ #!/bin/sh mvn deploy:deploy-file \ - -DgroupId=jp.sf.amateras\ + -DgroupId=gitbucket\ -DartifactId=gitbucket-assembly\ - -Dversion=0.0.1\ + -Dversion=3.0.0\ -Dpackaging=jar\ - -Dfile=../target/scala-2.11/gitbucket-assembly-0.0.1.jar\ + -Dfile=../target/scala-2.11/gitbucket-assembly-3.0.0.jar\ -DrepositoryId=sourceforge.jp\ - -Durl=scp://shell.sourceforge.jp/home/groups/a/am/amateras/htdocs/mvn/ \ No newline at end of file + -Durl=scp://shell.sourceforge.jp/home/groups/a/am/amateras/htdocs/mvn/ diff --git a/project/build.scala b/project/build.scala index f29febf66..a1b6be1a1 100644 --- a/project/build.scala +++ b/project/build.scala @@ -8,9 +8,9 @@ import sbtassembly._ import sbtassembly.AssemblyKeys._ object MyBuild extends Build { - val Organization = "jp.sf.amateras" + val Organization = "gitbucket" val Name = "gitbucket" - val Version = "0.0.1" + val Version = "3.0.0" val ScalaVersion = "2.11.2" val ScalatraVersion = "2.3.0" @@ -66,6 +66,7 @@ object MyBuild extends Build { "com.typesafe" % "config" % "1.2.1", "com.typesafe.play" %% "twirl-compiler" % "1.0.2" ), + play.twirl.sbt.Import.TwirlKeys.templateImports += "gitbucket.core._", EclipseKeys.withSource := true, javacOptions in compile ++= Seq("-target", "7", "-source", "7"), testOptions in Test += Tests.Argument(TestFrameworks.Specs2, "junitxml", "console"), diff --git a/src/main/java/util/PatchUtil.java b/src/main/java/gitbucket/core/util/PatchUtil.java similarity index 99% rename from src/main/java/util/PatchUtil.java rename to src/main/java/gitbucket/core/util/PatchUtil.java index a316a75a4..3cc64ce3e 100644 --- a/src/main/java/util/PatchUtil.java +++ b/src/main/java/gitbucket/core/util/PatchUtil.java @@ -1,4 +1,4 @@ -package util; +package gitbucket.core.util; import org.eclipse.jgit.api.errors.PatchApplyException; import org.eclipse.jgit.diff.RawText; diff --git a/src/main/scala/ScalatraBootstrap.scala b/src/main/scala/ScalatraBootstrap.scala index ac8f57eb4..d61c1024a 100644 --- a/src/main/scala/ScalatraBootstrap.scala +++ b/src/main/scala/ScalatraBootstrap.scala @@ -1,11 +1,14 @@ -import _root_.servlet.{BasicAuthenticationFilter, TransactionFilter, AccessTokenAuthenticationFilter} -import app._ -import plugin.PluginRegistry -//import jp.sf.amateras.scalatra.forms.ValidationJavaScriptProvider -import org.scalatra._ -import javax.servlet._ +import gitbucket.core.controller._ +import gitbucket.core.plugin.PluginRegistry +import gitbucket.core.servlet.{AccessTokenAuthenticationFilter, BasicAuthenticationFilter, TransactionFilter} +import gitbucket.core.util.Directory + import java.util.EnumSet +import javax.servlet._ + +import org.scalatra._ + class ScalatraBootstrap extends LifeCycle { override def init(context: ServletContext) { @@ -39,9 +42,9 @@ class ScalatraBootstrap extends LifeCycle { context.mount(new RepositorySettingsController, "/*") // 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){ dir.mkdirs() } } -} \ No newline at end of file +} diff --git a/src/main/scala/api/ApiCombinedCommitStatus.scala b/src/main/scala/api/ApiCombinedCommitStatus.scala index 19f2ead5f..898b58a11 100644 --- a/src/main/scala/api/ApiCombinedCommitStatus.scala +++ b/src/main/scala/api/ApiCombinedCommitStatus.scala @@ -1,8 +1,7 @@ package api -import model.Account -import model.CommitStatus -import model.CommitState +import gitbucket.core.model.{Account, CommitState, CommitStatus} + /** * https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref diff --git a/src/main/scala/api/ApiComment.scala b/src/main/scala/api/ApiComment.scala index 34197f030..7ce23a410 100644 --- a/src/main/scala/api/ApiComment.scala +++ b/src/main/scala/api/ApiComment.scala @@ -1,7 +1,7 @@ package api import java.util.Date -import model.IssueComment +import gitbucket.core.model.IssueComment /** * https://developer.github.com/v3/issues/comments/ diff --git a/src/main/scala/api/ApiCommit.scala b/src/main/scala/api/ApiCommit.scala index 57ee02d44..71110cc6d 100644 --- a/src/main/scala/api/ApiCommit.scala +++ b/src/main/scala/api/ApiCommit.scala @@ -2,10 +2,10 @@ package api import java.util.Date import org.eclipse.jgit.diff.DiffEntry -import util.JGitUtil -import util.JGitUtil.CommitInfo +import gitbucket.core.util.JGitUtil +import gitbucket.core.util.JGitUtil.CommitInfo +import gitbucket.core.util.RepositoryName import org.eclipse.jgit.api.Git -import util.RepositoryName /** * https://developer.github.com/v3/repos/commits/ diff --git a/src/main/scala/api/ApiCommitListItem.scala b/src/main/scala/api/ApiCommitListItem.scala index 4a80d8cfc..d8f3b332c 100644 --- a/src/main/scala/api/ApiCommitListItem.scala +++ b/src/main/scala/api/ApiCommitListItem.scala @@ -1,8 +1,9 @@ package api -import util.JGitUtil.CommitInfo +import gitbucket.core.util.JGitUtil.CommitInfo +// TODO(tanacasino): Fix package name +import gitbucket.core.util.RepositoryName import ApiCommitListItem._ -import util.RepositoryName /** * https://developer.github.com/v3/repos/commits/ diff --git a/src/main/scala/api/ApiCommitStatus.scala b/src/main/scala/api/ApiCommitStatus.scala index 011be2649..7508477af 100644 --- a/src/main/scala/api/ApiCommitStatus.scala +++ b/src/main/scala/api/ApiCommitStatus.scala @@ -1,8 +1,8 @@ package api import java.util.Date -import model.CommitStatus -import util.RepositoryName +import gitbucket.core.model.CommitStatus +import gitbucket.core.util.RepositoryName /** * https://developer.github.com/v3/repos/statuses/#create-a-status diff --git a/src/main/scala/api/ApiIssue.scala b/src/main/scala/api/ApiIssue.scala index 1bbb55a0a..d50723bd4 100644 --- a/src/main/scala/api/ApiIssue.scala +++ b/src/main/scala/api/ApiIssue.scala @@ -1,7 +1,7 @@ package api import java.util.Date -import model.Issue +import gitbucket.core.model.Issue /** * https://developer.github.com/v3/issues/ diff --git a/src/main/scala/api/ApiPersonIdent.scala b/src/main/scala/api/ApiPersonIdent.scala index 010f5394a..393e69b95 100644 --- a/src/main/scala/api/ApiPersonIdent.scala +++ b/src/main/scala/api/ApiPersonIdent.scala @@ -1,7 +1,7 @@ package api import java.util.Date -import util.JGitUtil.CommitInfo +import gitbucket.core.util.JGitUtil.CommitInfo case class ApiPersonIdent( name: String, diff --git a/src/main/scala/api/ApiPullRequest.scala b/src/main/scala/api/ApiPullRequest.scala index 7ce6f6ddd..a4ddccbb2 100644 --- a/src/main/scala/api/ApiPullRequest.scala +++ b/src/main/scala/api/ApiPullRequest.scala @@ -1,8 +1,7 @@ package api import java.util.Date -import model.{Issue, PullRequest} -import ApiPullRequest._ +import gitbucket.core.model.{Issue, PullRequest} /** * https://developer.github.com/v3/pulls/ diff --git a/src/main/scala/api/ApiRepository.scala b/src/main/scala/api/ApiRepository.scala index 1962e4771..60410b06d 100644 --- a/src/main/scala/api/ApiRepository.scala +++ b/src/main/scala/api/ApiRepository.scala @@ -1,8 +1,8 @@ package api -import util.JGitUtil.CommitInfo -import service.RepositoryService.RepositoryInfo -import model.{Account, Repository} +import gitbucket.core.util.JGitUtil.CommitInfo +import gitbucket.core.service.RepositoryService.RepositoryInfo +import gitbucket.core.model.{Account, Repository} // https://developer.github.com/v3/repos/ case class ApiRepository( diff --git a/src/main/scala/api/ApiUser.scala b/src/main/scala/api/ApiUser.scala index f180a9d95..6ccc8af0b 100644 --- a/src/main/scala/api/ApiUser.scala +++ b/src/main/scala/api/ApiUser.scala @@ -1,7 +1,7 @@ package api import java.util.Date -import model.Account +import gitbucket.core.model.Account case class ApiUser( login: String, diff --git a/src/main/scala/api/CreateAStatus.scala b/src/main/scala/api/CreateAStatus.scala index 51b82a229..5e988a6ed 100644 --- a/src/main/scala/api/CreateAStatus.scala +++ b/src/main/scala/api/CreateAStatus.scala @@ -1,6 +1,6 @@ package api -import model.CommitState +import gitbucket.core.model.CommitState /** * https://developer.github.com/v3/repos/statuses/#create-a-status diff --git a/src/main/scala/api/JsonFormat.scala b/src/main/scala/api/JsonFormat.scala index 385a24cbe..12906f136 100644 --- a/src/main/scala/api/JsonFormat.scala +++ b/src/main/scala/api/JsonFormat.scala @@ -1,4 +1,5 @@ package api + import org.json4s._ import org.json4s.jackson.Serialization import scala.util.Try @@ -6,6 +7,8 @@ import org.joda.time.format._ import org.joda.time.DateTime import org.joda.time.DateTimeZone import java.util.Date + + object JsonFormat { case class Context(baseUrl:String) val parserISO = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'") diff --git a/src/main/scala/app/AccountController.scala b/src/main/scala/gitbucket/core/controller/AccountController.scala similarity index 94% rename from src/main/scala/app/AccountController.scala rename to src/main/scala/gitbucket/core/controller/AccountController.scala index b2650fce8..335d60c1a 100644 --- a/src/main/scala/app/AccountController.scala +++ b/src/main/scala/gitbucket/core/controller/AccountController.scala @@ -1,22 +1,28 @@ -package app +package gitbucket.core.controller -import service._ -import util._ -import util.StringUtil._ -import util.Directory._ -import util.ControlUtil._ -import util.Implicits._ -import ssh.SshUtil +import gitbucket.core.account.html +import gitbucket.core.helper +import gitbucket.core.model.GroupMember +import gitbucket.core.util._ +import gitbucket.core.util.Implicits._ +import gitbucket.core.util.Directory._ +import gitbucket.core.util.ControlUtil._ +import gitbucket.core.util.StringUtil._ +import gitbucket.core.ssh.SshUtil +import gitbucket.core.service._ +import gitbucket.core.service.WebHookService._ import jp.sf.amateras.scalatra.forms._ import org.apache.commons.io.FileUtils import org.scalatra.i18n.Messages import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib.{FileMode, Constants} import org.eclipse.jgit.dircache.DirCache -import model.GroupMember -import service.WebHookService._ + + +// TODO(tanacasino): Fix package name import api._ + class AccountController extends AccountControllerBase with AccountService with RepositoryService with ActivityService with WikiService with LabelsService with SshKeyService with OneselfAuthenticator with UsersAuthenticator with GroupManagerAuthenticator with ReadableUsersAuthenticator @@ -113,21 +119,21 @@ trait AccountControllerBase extends AccountManagementControllerBase { params.getOrElse("tab", "repositories") match { // Public Activity case "activity" => - _root_.account.html.activity(account, + gitbucket.core.account.html.activity(account, if(account.isGroupAccount) Nil else getGroupsByUserName(userName), getActivitiesByUser(userName, true)) // Members case "members" if(account.isGroupAccount) => { 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 })) } // Repositories case _ => { val members = getGroupMembers(account.userName) - _root_.account.html.repositories(account, + gitbucket.core.account.html.repositories(account, if(account.isGroupAccount) Nil else getGroupsByUserName(userName), getVisibleRepositories(context.loginAccount, context.baseUrl, Some(userName)), context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager })) @@ -174,7 +180,7 @@ trait AccountControllerBase extends AccountManagementControllerBase { get("/:userName/_edit")(oneselfOnly { val userName = params("userName") getAccountByUserName(userName).map { x => - account.html.edit(x, flash.get("info")) + html.edit(x, flash.get("info")) } getOrElse NotFound }) @@ -218,7 +224,7 @@ trait AccountControllerBase extends AccountManagementControllerBase { get("/:userName/_ssh")(oneselfOnly { val userName = params("userName") getAccountByUserName(userName).map { x => - account.html.ssh(x, getPublicKeys(x.userName)) + html.ssh(x, getPublicKeys(x.userName)) } getOrElse NotFound }) @@ -249,7 +255,7 @@ trait AccountControllerBase extends AccountManagementControllerBase { } case _ => None } - account.html.application(x, tokens, generatedToken) + html.application(x, tokens, generatedToken) } getOrElse NotFound }) @@ -274,7 +280,7 @@ trait AccountControllerBase extends AccountManagementControllerBase { if(context.loginAccount.isDefined){ redirect("/") } else { - account.html.register() + html.register() } } else NotFound } @@ -288,7 +294,7 @@ trait AccountControllerBase extends AccountManagementControllerBase { } 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 => @@ -304,7 +310,7 @@ trait AccountControllerBase extends AccountManagementControllerBase { get("/:groupName/_editgroup")(managersOnly { defining(params("groupName")){ groupName => - account.html.group(getAccountByUserName(groupName, true), getGroupMembers(groupName)) + html.group(getAccountByUserName(groupName, true), getGroupMembers(groupName)) } }) @@ -353,7 +359,7 @@ trait AccountControllerBase extends AccountManagementControllerBase { * Show the new repository form. */ get("/new")(usersOnly { - account.html.newrepo(getGroupsByUserName(context.loginAccount.get.userName), context.settings.isCreateRepoOptionPublic) + html.newrepo(getGroupsByUserName(context.loginAccount.get.userName), context.settings.isCreateRepoOptionPublic) }) /** @@ -429,7 +435,7 @@ trait AccountControllerBase extends AccountManagementControllerBase { val members = getGroupMembers(group) context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager }) } - _root_.helper.html.forkrepository( + helper.html.forkrepository( repository, (groups zip managerPermissions).toMap ) diff --git a/src/main/scala/app/AnonymousAccessController.scala b/src/main/scala/gitbucket/core/controller/AnonymousAccessController.scala similarity index 92% rename from src/main/scala/app/AnonymousAccessController.scala rename to src/main/scala/gitbucket/core/controller/AnonymousAccessController.scala index 35481ab58..180b16472 100644 --- a/src/main/scala/app/AnonymousAccessController.scala +++ b/src/main/scala/gitbucket/core/controller/AnonymousAccessController.scala @@ -1,4 +1,4 @@ -package app +package gitbucket.core.controller class AnonymousAccessController extends AnonymousAccessControllerBase diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/gitbucket/core/controller/ControllerBase.scala similarity index 95% rename from src/main/scala/app/ControllerBase.scala rename to src/main/scala/gitbucket/core/controller/ControllerBase.scala index a8b31fcc0..a1b732e71 100644 --- a/src/main/scala/app/ControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/ControllerBase.scala @@ -1,20 +1,25 @@ -package app +package gitbucket.core.controller + +import gitbucket.core.model.Account +import gitbucket.core.service.{AccountService, SystemSettingsService} +import gitbucket.core.util.ControlUtil._ +import gitbucket.core.util.Directory._ +import gitbucket.core.util.Implicits._ +import gitbucket.core.util._ -import _root_.util.Directory._ -import _root_.util.Implicits._ -import _root_.util.ControlUtil._ -import _root_.util.{StringUtil, FileUtil, Validations, Keys} -import org.scalatra._ -import org.scalatra.json._ -import org.json4s._ import jp.sf.amateras.scalatra.forms._ import org.apache.commons.io.FileUtils -import model._ -import service.{SystemSettingsService, AccountService, AccessTokenService} +import org.json4s._ +import org.scalatra._ +import org.scalatra.i18n._ +import org.scalatra.json._ + import javax.servlet.http.{HttpServletResponse, HttpServletRequest} import javax.servlet.{FilterChain, ServletResponse, ServletRequest} -import org.scalatra.i18n._ + import scala.util.Try + + /** * Provides generic features for controller implementations. */ @@ -110,10 +115,10 @@ abstract class ControllerBase extends ScalatraFilter contentType = formats("json") org.scalatra.NotFound(api.ApiError("Not Found")) } 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)){ org.scalatra.Unauthorized() } else if(request.hasAttribute(Keys.Request.APIv3)){ diff --git a/src/main/scala/app/DashboardController.scala b/src/main/scala/gitbucket/core/controller/DashboardController.scala similarity index 93% rename from src/main/scala/app/DashboardController.scala rename to src/main/scala/gitbucket/core/controller/DashboardController.scala index 7c445294b..713e9c09e 100644 --- a/src/main/scala/app/DashboardController.scala +++ b/src/main/scala/gitbucket/core/controller/DashboardController.scala @@ -1,9 +1,10 @@ -package app +package gitbucket.core.controller -import service._ -import util.{StringUtil, UsersAuthenticator, Keys} -import util.Implicits._ -import service.IssuesService.IssueSearchCondition +import gitbucket.core.dashboard.html +import gitbucket.core.service.{RepositoryService, PullRequestService, AccountService, IssuesService} +import gitbucket.core.util.{StringUtil, Keys, UsersAuthenticator} +import gitbucket.core.util.Implicits._ +import gitbucket.core.service.IssuesService._ class DashboardController extends DashboardControllerBase 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 page = IssueSearchCondition.page(request) - dashboard.html.issues( + html.issues( searchIssue(condition, false, (page - 1) * IssueLimit, IssueLimit, userRepos: _*), page, countIssue(condition.copy(state = "open" ), false, userRepos: _*), @@ -119,7 +120,7 @@ trait DashboardControllerBase extends ControllerBase { val allRepos = getAllRepositories(userName) val page = IssueSearchCondition.page(request) - dashboard.html.pulls( + html.pulls( searchIssue(condition, true, (page - 1) * PullRequestLimit, PullRequestLimit, allRepos: _*), page, countIssue(condition.copy(state = "open" ), true, allRepos: _*), diff --git a/src/main/scala/app/FileUploadController.scala b/src/main/scala/gitbucket/core/controller/FileUploadController.scala similarity index 88% rename from src/main/scala/app/FileUploadController.scala rename to src/main/scala/gitbucket/core/controller/FileUploadController.scala index 9798c0a2a..c3503ac7c 100644 --- a/src/main/scala/app/FileUploadController.scala +++ b/src/main/scala/gitbucket/core/controller/FileUploadController.scala @@ -1,8 +1,8 @@ -package app +package gitbucket.core.controller -import util.{Keys, FileUtil} -import util.ControlUtil._ -import util.Directory._ +import gitbucket.core.util.{Keys, FileUtil} +import gitbucket.core.util.ControlUtil._ +import gitbucket.core.util.Directory._ import org.scalatra._ import org.scalatra.servlet.{MultipartConfig, FileUploadSupport, FileItem} import org.apache.commons.io.FileUtils diff --git a/src/main/scala/app/IndexController.scala b/src/main/scala/gitbucket/core/controller/IndexController.scala similarity index 89% rename from src/main/scala/app/IndexController.scala rename to src/main/scala/gitbucket/core/controller/IndexController.scala index 598680736..3f0df298f 100644 --- a/src/main/scala/app/IndexController.scala +++ b/src/main/scala/gitbucket/core/controller/IndexController.scala @@ -1,8 +1,11 @@ -package app +package gitbucket.core.controller -import util._ -import util.Implicits._ -import service._ +import gitbucket.core.html +import gitbucket.core.helper.xml +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 api._ @@ -62,13 +65,13 @@ trait IndexControllerBase extends ControllerBase { get("/activities.atom"){ contentType = "application/atom+xml; type=feed" - helper.xml.feed(getRecentActivities()) + xml.feed(getRecentActivities()) } /** * Set account information into HttpSession and redirect. */ - private def signin(account: model.Account) = { + private def signin(account: Account) = { session.setAttribute(Keys.Session.LoginAccount, account) updateLastLoginDate(account.userName) diff --git a/src/main/scala/app/IssuesController.scala b/src/main/scala/gitbucket/core/controller/IssuesController.scala similarity index 95% rename from src/main/scala/app/IssuesController.scala rename to src/main/scala/gitbucket/core/controller/IssuesController.scala index 43e24f4ba..b598452e3 100644 --- a/src/main/scala/app/IssuesController.scala +++ b/src/main/scala/gitbucket/core/controller/IssuesController.scala @@ -1,18 +1,25 @@ -package app +package gitbucket.core.controller +import gitbucket.core.issues.html +import gitbucket.core.model.Issue +import gitbucket.core.service._ +import gitbucket.core.service.WebHookService._ +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 service._ import IssuesService._ -import util._ -import util.Implicits._ -import util.ControlUtil._ import org.scalatra.Ok -import model.Issue -import service.WebHookService._ -import scala.util.Try + + +// TODO(tanacasino): Fix package name import api._ + + class IssuesController extends IssuesControllerBase with IssuesService with RepositoryService with AccountService with LabelsService with MilestonesService with ActivityService with ReadableUsersAuthenticator with ReferrerAuthenticator with CollaboratorsAuthenticator with PullRequestService with WebHookIssueCommentService @@ -63,7 +70,7 @@ trait IssuesControllerBase extends ControllerBase { get("/:owner/:repository/issues/:id")(referrersOnly { repository => defining(repository.owner, repository.name, params("id")){ case (owner, name, issueId) => getIssue(owner, name, issueId) map { - issues.html.issue( + html.issue( _, getComments(owner, name, issueId.toInt), getIssueLabels(owner, name, issueId.toInt), @@ -90,7 +97,7 @@ trait IssuesControllerBase extends ControllerBase { get("/:owner/:repository/issues/new")(readableUsersOnly { repository => 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, getMilestones(owner, name), getLabels(owner, name), @@ -224,13 +231,13 @@ trait IssuesControllerBase extends ControllerBase { getIssue(repository.owner, repository.name, params("id")) map { x => if(isEditable(x.userName, x.repositoryName, x.openedUserName)){ 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) } getOrElse { contentType = formats("json") org.json4s.jackson.Serialization.write( 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)) )) } @@ -242,7 +249,7 @@ trait IssuesControllerBase extends ControllerBase { getComment(repository.owner, repository.name, params("id")) map { x => if(isEditable(x.userName, x.repositoryName, x.commentedUserName)){ 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) } getOrElse { contentType = formats("json") @@ -258,14 +265,14 @@ trait IssuesControllerBase extends ControllerBase { ajaxPost("/:owner/:repository/issues/:id/label/new")(collaboratorsOnly { repository => defining(params("id").toInt){ issueId => 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 => defining(params("id").toInt){ issueId => 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)) } }) @@ -279,7 +286,7 @@ trait IssuesControllerBase extends ControllerBase { milestoneId("milestoneId").map { milestoneId => getMilestonesWithIssueCount(repository.owner, repository.name) .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 Ok() }) @@ -333,7 +340,7 @@ trait IssuesControllerBase extends ControllerBase { val assignedUserName = (key: String) => params.get(key) filter (_.trim != "") 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 private def executeBatch(repository: RepositoryService.RepositoryInfo)(execute: Int => Unit) = { @@ -357,7 +364,7 @@ trait IssuesControllerBase extends ControllerBase { * @see [[https://github.com/takezoe/gitbucket/wiki/CommentAction]] */ 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))) = { defining(repository.owner, repository.name){ case (owner, name) => @@ -450,7 +457,7 @@ trait IssuesControllerBase extends ControllerBase { } else session.getAs[IssueSearchCondition](sessionKey).getOrElse(IssueSearchCondition()) ) - issues.html.list( + html.list( "issues", searchIssue(condition, false, (page - 1) * IssueLimit, IssueLimit, owner -> repoName), page, diff --git a/src/main/scala/app/LabelsController.scala b/src/main/scala/gitbucket/core/controller/LabelsController.scala similarity index 88% rename from src/main/scala/app/LabelsController.scala rename to src/main/scala/gitbucket/core/controller/LabelsController.scala index 7cd42bf83..fa6ef7ace 100644 --- a/src/main/scala/app/LabelsController.scala +++ b/src/main/scala/gitbucket/core/controller/LabelsController.scala @@ -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 service._ -import util.{ReferrerAuthenticator, CollaboratorsAuthenticator} -import util.Implicits._ import org.scalatra.i18n.Messages import org.scalatra.Ok @@ -23,7 +24,7 @@ trait LabelsControllerBase extends ControllerBase { )(LabelForm.apply) get("/:owner/:repository/issues/labels")(referrersOnly { repository => - issues.labels.html.list( + html.list( getLabels(repository.owner, repository.name), countIssueGroupByLabels(repository.owner, repository.name, IssuesService.IssueSearchCondition(), Map.empty), repository, @@ -31,12 +32,12 @@ trait LabelsControllerBase extends ControllerBase { }) 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) => 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, // TODO futility 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 => getLabel(repository.owner, repository.name, params("labelId").toInt).map { label => - issues.labels.html.edit(Some(label), repository) + html.edit(Some(label), repository) } getOrElse NotFound() }) 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)) - issues.labels.html.label( + html.label( getLabel(repository.owner, repository.name, params("labelId").toInt).get, // TODO futility countIssueGroupByLabels(repository.owner, repository.name, IssuesService.IssueSearchCondition(), Map.empty), diff --git a/src/main/scala/app/MilestonesController.scala b/src/main/scala/gitbucket/core/controller/MilestonesController.scala similarity index 89% rename from src/main/scala/app/MilestonesController.scala rename to src/main/scala/gitbucket/core/controller/MilestonesController.scala index 234ca071b..eb4b71404 100644 --- a/src/main/scala/app/MilestonesController.scala +++ b/src/main/scala/gitbucket/core/controller/MilestonesController.scala @@ -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 service._ -import util.{CollaboratorsAuthenticator, ReferrerAuthenticator} -import util.Implicits._ - class MilestonesController extends MilestonesControllerBase with MilestonesService with RepositoryService with AccountService with ReferrerAuthenticator with CollaboratorsAuthenticator @@ -23,7 +23,7 @@ trait MilestonesControllerBase extends ControllerBase { )(MilestoneForm.apply) get("/:owner/:repository/issues/milestones")(referrersOnly { repository => - issues.milestones.html.list( + html.list( params.getOrElse("state", "open"), getMilestonesWithIssueCount(repository.owner, repository.name), repository, @@ -31,7 +31,7 @@ trait MilestonesControllerBase extends ControllerBase { }) 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) => @@ -41,7 +41,7 @@ trait MilestonesControllerBase extends ControllerBase { get("/:owner/:repository/issues/milestones/:milestoneId/edit")(collaboratorsOnly { repository => 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 }) diff --git a/src/main/scala/app/PullRequestsController.scala b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala similarity index 90% rename from src/main/scala/app/PullRequestsController.scala rename to src/main/scala/gitbucket/core/controller/PullRequestsController.scala index f3c8cbade..edb165a8c 100644 --- a/src/main/scala/app/PullRequestsController.scala +++ b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala @@ -1,26 +1,35 @@ -package app +package gitbucket.core.controller + +import gitbucket.core.model.{Account, CommitStatus, CommitState, Repository, PullRequest, Issue} +import gitbucket.core.pulls.html +import gitbucket.core.service.CommitStatusService +import gitbucket.core.service.MergeService +import gitbucket.core.service.IssuesService._ +import gitbucket.core.service.PullRequestService._ +import gitbucket.core.service.WebHookService._ +import gitbucket.core.service._ +import gitbucket.core.util.ControlUtil._ +import gitbucket.core.util.Directory._ +import gitbucket.core.util.Implicits._ +import gitbucket.core.util.JGitUtil._ +import gitbucket.core.util._ +import gitbucket.core.view +import gitbucket.core.view.helpers -import util._ -import util.Directory._ -import util.Implicits._ -import util.ControlUtil._ -import service._ -import org.eclipse.jgit.api.Git import jp.sf.amateras.scalatra.forms._ -import org.eclipse.jgit.transport.RefSpec -import scala.collection.JavaConverters._ -import org.eclipse.jgit.lib.{ObjectId, CommitBuilder, PersonIdent} -import service.IssuesService._ -import service.PullRequestService._ -import org.slf4j.LoggerFactory -import org.eclipse.jgit.merge.MergeStrategy +import org.eclipse.jgit.api.Git import org.eclipse.jgit.errors.NoMergeBaseException -import service.WebHookService._ -import util.JGitUtil.DiffInfo -import util.JGitUtil.CommitInfo -import model.{PullRequest, Issue, CommitState} +import org.eclipse.jgit.lib.{ObjectId, CommitBuilder, PersonIdent} +import org.eclipse.jgit.merge.MergeStrategy +import org.eclipse.jgit.transport.RefSpec +import org.slf4j.LoggerFactory +import scala.collection.JavaConverters._ + + +// TODO(tanacasino): Fix package name import api._ + class PullRequestsController extends PullRequestsControllerBase with RepositoryService with AccountService with IssuesService with PullRequestService with MilestonesService with LabelsService with CommitsService with ActivityService with WebHookPullRequestService with ReferrerAuthenticator with CollaboratorsAuthenticator @@ -79,7 +88,7 @@ trait PullRequestsControllerBase extends ControllerBase { // TODO: more api spec condition val condition = IssueSearchCondition(request) val baseOwner = getAccountByUserName(repository.owner).get - val issues:List[(model.Issue, model.Account, Int, model.PullRequest, model.Repository, model.Account)] = searchPullRequestByApi(condition, (page - 1) * PullRequestLimit, PullRequestLimit, repository.owner -> repository.name) + val issues:List[(Issue, Account, Int, PullRequest, Repository, Account)] = searchPullRequestByApi(condition, (page - 1) * PullRequestLimit, PullRequestLimit, repository.owner -> repository.name) JsonFormat(issues.map{case (issue, issueUser, commentCount, pullRequest, headRepo, headOwner) => ApiPullRequest( issue, @@ -97,7 +106,7 @@ trait PullRequestsControllerBase extends ControllerBase { using(Git.open(getRepositoryDir(owner, name))){ git => val (commits, diffs) = getRequestCompareInfo(owner, name, pullreq.commitIdFrom, owner, name, pullreq.commitIdTo) - pulls.html.pullreq( + html.pullreq( issue, pullreq, (commits.flatten.map(commit => getCommitComments(owner, name, commit.id, true)).flatten.toList ::: getComments(owner, name, issueId)) .sortWith((a, b) => a.registeredDate before b.registeredDate), @@ -147,7 +156,7 @@ trait PullRequestsControllerBase extends ControllerBase { using(Git.open(getRepositoryDir(owner, name))){ git => val oldId = git.getRepository.resolve(pullreq.commitIdFrom) val newId = git.getRepository.resolve(pullreq.commitIdTo) - val repoFullName = util.RepositoryName(repository) + val repoFullName = RepositoryName(repository) val commits = git.log.addRange(oldId, newId).call.iterator.asScala.map(c => ApiCommitListItem(new CommitInfo(c), repoFullName)).toList JsonFormat(commits) } @@ -165,7 +174,7 @@ trait PullRequestsControllerBase extends ControllerBase { checkConflict(owner, name, pullreq.branch, issueId) } val hasProblem = hasConfrict || (!statuses.isEmpty && CommitState.combine(statuses.map(_.state).toSet) != CommitState.SUCCESS) - pulls.html.mergeguide( + html.mergeguide( hasConfrict, hasProblem, issue, @@ -272,8 +281,8 @@ trait PullRequestsControllerBase extends ControllerBase { get("/:owner/:repository/compare/*...*")(referrersOnly { forkedRepository => val Seq(origin, forked) = multiParams("splat") - val (originOwner, tmpOriginBranch) = parseCompareIdentifie(origin, forkedRepository.owner) - val (forkedOwner, tmpForkedBranch) = parseCompareIdentifie(forked, forkedRepository.owner) + val (originOwner, originId) = parseCompareIdentifie(origin, forkedRepository.owner) + val (forkedOwner, forkedId) = parseCompareIdentifie(forked, forkedRepository.owner) (for( originRepositoryName <- if(originOwner == forkedOwner){ @@ -289,21 +298,24 @@ trait PullRequestsControllerBase extends ControllerBase { Git.open(getRepositoryDir(originRepository.owner, originRepository.name)), Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name)) ){ case (oldGit, newGit) => - val originBranch = JGitUtil.getDefaultBranch(oldGit, originRepository, tmpOriginBranch).get._2 - val forkedBranch = JGitUtil.getDefaultBranch(newGit, forkedRepository, tmpForkedBranch).get._2 + val (oldId, newId) = + if(originRepository.branchList.contains(originId) && forkedRepository.branchList.contains(forkedId)){ + // Branch name + val rootId = JGitUtil.getForkedCommitId(oldGit, newGit, + originRepository.owner, originRepository.name, originId, + forkedRepository.owner, forkedRepository.name, forkedId) - val forkedId = JGitUtil.getForkedCommitId(oldGit, newGit, - originRepository.owner, originRepository.name, originBranch, - forkedRepository.owner, forkedRepository.name, forkedBranch) - - val oldId = oldGit.getRepository.resolve(forkedId) - val newId = newGit.getRepository.resolve(forkedBranch) + (oldGit.getRepository.resolve(rootId), newGit.getRepository.resolve(forkedId)) + } else { + // Commit id + (oldGit.getRepository.resolve(originId), newGit.getRepository.resolve(forkedId)) + } val (commits, diffs) = getRequestCompareInfo( originRepository.owner, originRepository.name, oldId.getName, forkedRepository.owner, forkedRepository.name, newId.getName) - pulls.html.compare( + html.compare( commits, diffs, (forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match { @@ -311,8 +323,8 @@ trait PullRequestsControllerBase extends ControllerBase { case _ => (forkedRepository.owner, forkedRepository.name) :: getForkedRepositories(forkedRepository.owner, forkedRepository.name) }, commits.flatten.map(commit => getCommitComments(forkedRepository.owner, forkedRepository.name, commit.id, false)).flatten.toList, - originBranch, - forkedBranch, + originId, + forkedId, oldId.getName, newId.getName, forkedRepository, @@ -344,12 +356,11 @@ trait PullRequestsControllerBase extends ControllerBase { ){ case (oldGit, newGit) => val originBranch = JGitUtil.getDefaultBranch(oldGit, originRepository, tmpOriginBranch).get._2 val forkedBranch = JGitUtil.getDefaultBranch(newGit, forkedRepository, tmpForkedBranch).get._2 - val conflict = LockUtil.lock(s"${originRepository.owner}/${originRepository.name}"){ checkConflict(originRepository.owner, originRepository.name, originBranch, forkedRepository.owner, forkedRepository.name, forkedBranch) } - pulls.html.mergecheck(conflict) + html.mergecheck(conflict) } }) getOrElse NotFound }) @@ -421,7 +432,7 @@ trait PullRequestsControllerBase extends ControllerBase { val commits = newGit.log.addRange(oldId, newId).call.iterator.asScala.map { revCommit => new CommitInfo(revCommit) }.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) @@ -440,7 +451,7 @@ trait PullRequestsControllerBase extends ControllerBase { else session.getAs[IssueSearchCondition](sessionKey).getOrElse(IssueSearchCondition()) ) - issues.html.list( + gitbucket.core.issues.html.list( "pulls", searchIssue(condition, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName), page, diff --git a/src/main/scala/app/RepositorySettingsController.scala b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala similarity index 93% rename from src/main/scala/app/RepositorySettingsController.scala rename to src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala index 233b1ef93..5be11dd1f 100644 --- a/src/main/scala/app/RepositorySettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala @@ -1,18 +1,21 @@ -package app +package gitbucket.core.controller -import service._ -import util.Directory._ -import util.Implicits._ -import util.{LockUtil, UsersAuthenticator, OwnerAuthenticator} +import gitbucket.core.settings.html +import gitbucket.core.model.WebHook +import gitbucket.core.service.{RepositoryService, AccountService, WebHookService} +import gitbucket.core.service.WebHookService._ +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 org.apache.commons.io.FileUtils import org.scalatra.i18n.Messages -import service.WebHookService.WebHookPushPayload -import util.JGitUtil.CommitInfo -import util.ControlUtil._ import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib.Constants + class RepositorySettingsController extends RepositorySettingsControllerBase with RepositoryService with AccountService with WebHookService with OwnerAuthenticator with UsersAuthenticator @@ -63,7 +66,7 @@ trait RepositorySettingsControllerBase extends ControllerBase { * Display the Options page. */ get("/:owner/:repository/settings/options")(ownerOnly { - settings.html.options(_, flash.get("info")) + html.options(_, flash.get("info")) }) /** @@ -105,7 +108,7 @@ trait RepositorySettingsControllerBase extends ControllerBase { * Display the Collaborators page. */ get("/:owner/:repository/settings/collaborators")(ownerOnly { repository => - settings.html.collaborators( + html.collaborators( getCollaborators(repository.owner, repository.name), getAccountByUserName(repository.owner).get.isGroupAccount, repository) @@ -135,7 +138,7 @@ trait RepositorySettingsControllerBase extends ControllerBase { * Display the web hook page. */ 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 +170,7 @@ trait RepositorySettingsControllerBase extends ControllerBase { getAccountByUserName(repository.owner).foreach { ownerAccount => callWebHook("push", - List(model.WebHook(repository.owner, repository.name, form.url)), + List(WebHook(repository.owner, repository.name, form.url)), WebHookPushPayload(git, ownerAccount, "refs/heads/" + repository.repository.defaultBranch, repository, commits.toList, ownerAccount) ) } @@ -181,7 +184,7 @@ trait RepositorySettingsControllerBase extends ControllerBase { * Display the danger zone. */ get("/:owner/:repository/settings/danger")(ownerOnly { - settings.html.danger(_) + html.danger(_) }) /** @@ -271,4 +274,4 @@ trait RepositorySettingsControllerBase extends ControllerBase { } } } -} \ No newline at end of file +} diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala similarity index 93% rename from src/main/scala/app/RepositoryViewerController.scala rename to src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index 821900c77..8062f4613 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -1,26 +1,33 @@ -package app +package gitbucket.core.controller -import _root_.util.JGitUtil.CommitInfo -import util.Directory._ -import util.Implicits._ -import _root_.util.ControlUtil._ -import _root_.util._ -import service._ -import org.scalatra._ -import java.io.File +import gitbucket.core.repo.html +import gitbucket.core.helper +import gitbucket.core.service._ +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 gitbucket.core.model.{Account, CommitState} +import gitbucket.core.service.CommitStatusService +import gitbucket.core.service.WebHookService._ +import gitbucket.core.view +import gitbucket.core.view.helpers +import jp.sf.amateras.scalatra.forms._ +import org.apache.commons.io.FileUtils import org.eclipse.jgit.api.{ArchiveCommand, Git} import org.eclipse.jgit.archive.{TgzFormat, ZipFormat} -import org.eclipse.jgit.lib._ -import org.apache.commons.io.FileUtils -import org.eclipse.jgit.treewalk._ -import jp.sf.amateras.scalatra.forms._ import org.eclipse.jgit.dircache.DirCache +import org.eclipse.jgit.lib._ import org.eclipse.jgit.revwalk.RevCommit -import service.WebHookService._ -import model.CommitState +import org.eclipse.jgit.treewalk._ +import org.scalatra._ + +// TODO(tanacasino) Fix package name import api._ + class RepositoryViewerController extends RepositoryViewerControllerBase with RepositoryService with AccountService with ActivityService with IssuesService with WebHookService with CommitsService with ReadableUsersAuthenticator with ReferrerAuthenticator with CollaboratorsAuthenticator with PullRequestService with CommitStatusService @@ -95,7 +102,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { */ post("/:owner/:repository/_preview")(referrersOnly { repository => contentType = "text/html" - view.helpers.markdown(params("content"), repository, + helpers.markdown(params("content"), repository, params("enableWikiLink").toBoolean, params("enableRefsLink").toBoolean, params("enableTaskList").toBoolean, @@ -138,7 +145,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git => JGitUtil.getCommitLog(git, branchName, page, 30, path) match { 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) => view.helpers.date(commit1.commitTime) == view.helpers.date(commit2.commitTime) }, page, hasNext, hasWritePermission(repository.owner, repository.name, context.loginAccount)) @@ -156,7 +163,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { sha <- JGitUtil.getShaByRef(repository.owner, repository.name, ref) data <- extractFromJsonBody[CreateAStatus] if data.isValid creator <- context.loginAccount - state <- model.CommitState.valueOf(data.state) + state <- CommitState.valueOf(data.state) statusId = createCommitStatus(repository.owner, repository.name, sha, data.context.getOrElse("default"), state, data.target_url, data.description, new java.util.Date(), creator) status <- getCommitStatus(repository.owner, repository.name, statusId) @@ -199,7 +206,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { get("/:owner/:repository/new/*")(collaboratorsOnly { repository => 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"))) }) @@ -211,7 +218,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { getPathObjectId(git, path, revCommit).map { objectId => 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)) } getOrElse NotFound } @@ -224,7 +231,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { getPathObjectId(git, path, revCommit).map { objectId => 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)) } getOrElse NotFound } @@ -278,7 +285,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { RawData(FileUtil.getContentType(path, bytes), bytes) } } 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)) } } getOrElse NotFound @@ -294,7 +301,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git => defining(JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))){ revCommit => 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.getTagsOfCommit(git, revCommit.getName), getCommitComments(repository.owner, repository.name, id, false), @@ -321,7 +328,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { val oldLineNumber = params.get("oldLineNumber") map (_.toInt) val newLineNumber = params.get("newLineNumber") map (_.toInt) val issueId = params.get("issueId") map (_.toInt) - repo.html.commentform( + html.commentform( commitId = id, fileName, oldLineNumber, newLineNumber, issueId, hasWritePermission = hasWritePermission(repository.owner, repository.name, context.loginAccount), @@ -345,7 +352,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { getCommitComment(repository.owner, repository.name, params("id")) map { x => if(isEditable(x.userName, x.repositoryName, x.commentedUserName)){ 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) } getOrElse { contentType = formats("json") @@ -387,7 +394,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { .sortBy(br => (br.mergeInfo.isEmpty, br.commitTime)) .map(br => br -> getPullRequestByRequestCommit(repository.owner, repository.name, repository.repository.defaultBranch, br.name, br.commitId)) .reverse - repo.html.branches(branches, hasWritePermission(repository.owner, repository.name, context.loginAccount), repository) + html.branches(branches, hasWritePermission(repository.owner, repository.name, context.loginAccount), repository) }) /** @@ -427,7 +434,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { * Displays tags. */ get("/:owner/:repository/tags")(referrersOnly { - repo.html.tags(_) + html.tags(_) }) /** @@ -444,7 +451,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { }) get("/:owner/:repository/network/members")(referrersOnly { repository => - repo.html.forked( + html.forked( getRepository( repository.repository.originUserName.getOrElse(repository.owner), repository.repository.originRepositoryName.getOrElse(repository.name), @@ -455,7 +462,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { 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 { case branch if(path == branch || path.startsWith(branch + "/")) => branch } orElse repository.tags.collectFirst { @@ -478,7 +485,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { */ private def fileList(repository: RepositoryService.RepositoryInfo, revstr: String = "", path: String = ".") = { 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 { using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git => // get specified commit @@ -497,11 +504,11 @@ trait RepositoryViewerControllerBase extends ControllerBase { 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 context.loginAccount match { case None => List() - case account: Option[model.Account] => getGroupsByUserName(account.get.userName) + case account: Option[Account] => getGroupsByUserName(account.get.userName) }, // groups of current user new JGitUtil.CommitInfo(lastModifiedCommit), // last modified commit files, readme, hasWritePermission(repository.owner, repository.name, context.loginAccount), @@ -512,7 +519,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], content: String, charset: String, message: String) = { @@ -618,6 +625,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 } diff --git a/src/main/scala/app/SearchController.scala b/src/main/scala/gitbucket/core/controller/SearchController.scala similarity index 85% rename from src/main/scala/app/SearchController.scala rename to src/main/scala/gitbucket/core/controller/SearchController.scala index dc71b0bb7..85f3907b7 100644 --- a/src/main/scala/app/SearchController.scala +++ b/src/main/scala/gitbucket/core/controller/SearchController.scala @@ -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 Implicits._ -import service._ import jp.sf.amateras.scalatra.forms._ class SearchController extends SearchControllerBase @@ -34,12 +35,12 @@ trait SearchControllerBase extends ControllerBase { self: RepositoryService } target.toLowerCase match { - case "issue" => search.html.issues( + case "issue" => html.issues( searchIssues(repository.owner, repository.name, query), countFiles(repository.owner, repository.name, query), query, page, repository) - case _ => search.html.code( + case _ => html.code( searchFiles(repository.owner, repository.name, query), countIssues(repository.owner, repository.name, query), query, page, repository) diff --git a/src/main/scala/app/SystemSettingsController.scala b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala similarity index 93% rename from src/main/scala/app/SystemSettingsController.scala rename to src/main/scala/gitbucket/core/controller/SystemSettingsController.scala index efa952a2d..6c558ba50 100644 --- a/src/main/scala/app/SystemSettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala @@ -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 util.AdminAuthenticator import jp.sf.amateras.scalatra.forms._ -import ssh.SshServer class SystemSettingsController extends SystemSettingsControllerBase with AccountService with AdminAuthenticator @@ -59,7 +60,7 @@ trait SystemSettingsControllerBase extends ControllerBase { case class PluginForm(pluginIds: List[String]) get("/admin/system")(adminOnly { - admin.html.system(flash.get("info")) + html.system(flash.get("info")) }) post("/admin/system", form)(adminOnly { form => diff --git a/src/main/scala/app/UserManagementController.scala b/src/main/scala/gitbucket/core/controller/UserManagementController.scala similarity index 92% rename from src/main/scala/app/UserManagementController.scala rename to src/main/scala/gitbucket/core/controller/UserManagementController.scala index d98d70366..26c9f880a 100644 --- a/src/main/scala/app/UserManagementController.scala +++ b/src/main/scala/gitbucket/core/controller/UserManagementController.scala @@ -1,11 +1,12 @@ -package app +package gitbucket.core.controller -import service._ -import util.AdminAuthenticator -import util.StringUtil._ -import util.ControlUtil._ -import util.Directory._ -import util.Implicits._ +import gitbucket.core.service.{RepositoryService, AccountService} +import gitbucket.core.admin.users.html +import gitbucket.core.util._ +import gitbucket.core.util.ControlUtil._ +import gitbucket.core.util.StringUtil._ +import gitbucket.core.util.Implicits._ +import gitbucket.core.util.Directory._ import jp.sf.amateras.scalatra.forms._ import org.scalatra.i18n.Messages import org.apache.commons.io.FileUtils @@ -75,11 +76,11 @@ trait UserManagementControllerBase extends AccountManagementControllerBase { account.userName -> getGroupMembers(account.userName).map(_.userName) }.toMap - admin.users.html.list(users, members, includeRemoved) + html.list(users, members, includeRemoved) }) get("/admin/users/_newuser")(adminOnly { - admin.users.html.user(None) + html.user(None) }) post("/admin/users/_newuser", newUserForm)(adminOnly { form => @@ -90,7 +91,7 @@ trait UserManagementControllerBase extends AccountManagementControllerBase { get("/admin/users/:userName/_edituser")(adminOnly { val userName = params("userName") - admin.users.html.user(getAccountByUserName(userName, true)) + html.user(getAccountByUserName(userName, true)) }) post("/admin/users/:name/_edituser", editUserForm)(adminOnly { form => @@ -124,7 +125,7 @@ trait UserManagementControllerBase extends AccountManagementControllerBase { }) get("/admin/users/_newgroup")(adminOnly { - admin.users.html.group(None, Nil) + html.group(None, Nil) }) post("/admin/users/_newgroup", newGroupForm)(adminOnly { form => @@ -140,7 +141,7 @@ trait UserManagementControllerBase extends AccountManagementControllerBase { get("/admin/users/:groupName/_editgroup")(adminOnly { defining(params("groupName")){ groupName => - admin.users.html.group(getAccountByUserName(groupName, true), getGroupMembers(groupName)) + html.group(getAccountByUserName(groupName, true), getGroupMembers(groupName)) } }) @@ -193,7 +194,7 @@ trait UserManagementControllerBase extends AccountManagementControllerBase { protected def disableByNotYourself(paramName: String): Constraint = new Constraint() { override def validate(name: String, value: String, messages: Messages): Option[String] = { params.get(paramName).flatMap { userName => - if(userName == context.loginAccount.get.userName) + if(userName == context.loginAccount.get.userName && params.get("removed") == Some("true")) Some("You can't disable your account yourself") else None diff --git a/src/main/scala/app/WikiController.scala b/src/main/scala/gitbucket/core/controller/WikiController.scala similarity index 89% rename from src/main/scala/app/WikiController.scala rename to src/main/scala/gitbucket/core/controller/WikiController.scala index c273018d0..2bdc7a079 100644 --- a/src/main/scala/app/WikiController.scala +++ b/src/main/scala/gitbucket/core/controller/WikiController.scala @@ -1,14 +1,14 @@ -package app +package gitbucket.core.controller -import service._ -import util._ -import util.Directory._ -import util.ControlUtil._ -import util.Implicits._ +import gitbucket.core.wiki.html +import gitbucket.core.service.{RepositoryService, WikiService, ActivityService, AccountService} +import gitbucket.core.util._ +import gitbucket.core.util.ControlUtil._ +import gitbucket.core.util.Implicits._ +import gitbucket.core.util.Directory._ import jp.sf.amateras.scalatra.forms._ import org.eclipse.jgit.api.Git import org.scalatra.i18n.Messages -import java.util.ResourceBundle class WikiController extends WikiControllerBase 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 => 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)) } getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/Home/_edit") }) @@ -45,7 +45,7 @@ trait WikiControllerBase extends ControllerBase { val pageName = StringUtil.urlDecode(params("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)) } 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 => 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 } } @@ -66,7 +66,7 @@ trait WikiControllerBase extends ControllerBase { val Array(from, to) = params("commitId").split("\\.\\.\\.") 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")) } }) @@ -75,7 +75,7 @@ trait WikiControllerBase extends ControllerBase { val Array(from, to) = params("commitId").split("\\.\\.\\.") 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")) } }) @@ -105,7 +105,7 @@ trait WikiControllerBase extends ControllerBase { get("/:owner/:repository/wiki/:page/_edit")(collaboratorsOnly { repository => 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) => @@ -120,7 +120,7 @@ trait WikiControllerBase extends ControllerBase { }) get("/:owner/:repository/wiki/_new")(collaboratorsOnly { - wiki.html.edit("", None, _) + html.edit("", None, _) }) post("/:owner/:repository/wiki/_new", newForm)(collaboratorsOnly { (form, repository) => @@ -147,14 +147,14 @@ trait WikiControllerBase extends ControllerBase { }) 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)) }) get("/:owner/:repository/wiki/_history")(referrersOnly { repository => using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))){ git => 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 } } diff --git a/src/main/scala/model/AccessToken.scala b/src/main/scala/gitbucket/core/model/AccessToken.scala similarity index 95% rename from src/main/scala/model/AccessToken.scala rename to src/main/scala/gitbucket/core/model/AccessToken.scala index 2695c2fbb..de298577c 100644 --- a/src/main/scala/model/AccessToken.scala +++ b/src/main/scala/gitbucket/core/model/AccessToken.scala @@ -1,4 +1,5 @@ -package model +package gitbucket.core.model + trait AccessTokenComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/Account.scala b/src/main/scala/gitbucket/core/model/Account.scala similarity index 97% rename from src/main/scala/model/Account.scala rename to src/main/scala/gitbucket/core/model/Account.scala index 012c559cc..cd2190a8f 100644 --- a/src/main/scala/model/Account.scala +++ b/src/main/scala/gitbucket/core/model/Account.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait AccountComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/Activity.scala b/src/main/scala/gitbucket/core/model/Activity.scala similarity index 97% rename from src/main/scala/model/Activity.scala rename to src/main/scala/gitbucket/core/model/Activity.scala index 8e3960ef2..0f49ee3c8 100644 --- a/src/main/scala/model/Activity.scala +++ b/src/main/scala/gitbucket/core/model/Activity.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait ActivityComponent extends TemplateComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/BasicTemplate.scala b/src/main/scala/gitbucket/core/model/BasicTemplate.scala similarity index 98% rename from src/main/scala/model/BasicTemplate.scala rename to src/main/scala/gitbucket/core/model/BasicTemplate.scala index 1d012c12a..db3e1b43c 100644 --- a/src/main/scala/model/BasicTemplate.scala +++ b/src/main/scala/gitbucket/core/model/BasicTemplate.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model protected[model] trait TemplateComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/Collaborator.scala b/src/main/scala/gitbucket/core/model/Collaborator.scala similarity index 95% rename from src/main/scala/model/Collaborator.scala rename to src/main/scala/gitbucket/core/model/Collaborator.scala index 88311e188..55ae80f14 100644 --- a/src/main/scala/model/Collaborator.scala +++ b/src/main/scala/gitbucket/core/model/Collaborator.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait CollaboratorComponent extends TemplateComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/Comment.scala b/src/main/scala/gitbucket/core/model/Comment.scala similarity index 98% rename from src/main/scala/model/Comment.scala rename to src/main/scala/gitbucket/core/model/Comment.scala index 956987170..5a1144092 100644 --- a/src/main/scala/model/Comment.scala +++ b/src/main/scala/gitbucket/core/model/Comment.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait Comment { val commentedUserName: String diff --git a/src/main/scala/model/CommitStatus.scala b/src/main/scala/gitbucket/core/model/CommitStatus.scala similarity index 92% rename from src/main/scala/model/CommitStatus.scala rename to src/main/scala/gitbucket/core/model/CommitStatus.scala index 47a2343d2..87b74f1f6 100644 --- a/src/main/scala/model/CommitStatus.scala +++ b/src/main/scala/gitbucket/core/model/CommitStatus.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model import scala.slick.lifted.MappedTo import scala.slick.jdbc._ @@ -24,6 +24,7 @@ trait CommitStatusComponent extends TemplateComponent { self: Profile => } } + case class CommitStatus( commitStatusId: Int = 0, userName: String, @@ -37,16 +38,26 @@ case class CommitStatus( registeredDate: java.util.Date, updatedDate: java.util.Date ) + + sealed abstract class CommitState(val name: String) + + object CommitState { object ERROR extends CommitState("error") + object FAILURE extends CommitState("failure") + object PENDING extends CommitState("pending") + object SUCCESS extends CommitState("success") val values: Vector[CommitState] = Vector(PENDING, SUCCESS, ERROR, FAILURE) + private val map: Map[String, CommitState] = values.map(enum => enum.name -> enum).toMap + def apply(name: String): CommitState = map(name) + def valueOf(name: String): Option[CommitState] = map.get(name) /** @@ -57,11 +68,11 @@ object CommitState { def combine(statuses: Set[CommitState]): CommitState = { if(statuses.isEmpty){ PENDING - }else if(statuses.contains(CommitState.ERROR) || statuses.contains(CommitState.FAILURE)){ + } else if(statuses.contains(CommitState.ERROR) || statuses.contains(CommitState.FAILURE)) { FAILURE - }else if(statuses.contains(CommitState.PENDING)){ + } else if(statuses.contains(CommitState.PENDING)) { PENDING - }else{ + } else { SUCCESS } } @@ -69,3 +80,4 @@ object CommitState { implicit val getResult: GetResult[CommitState] = GetResult(r => CommitState(r.<<)) implicit val getResultOpt: GetResult[Option[CommitState]] = GetResult(r => r.< import profile.simple._ diff --git a/src/main/scala/model/Issue.scala b/src/main/scala/gitbucket/core/model/Issue.scala similarity index 98% rename from src/main/scala/model/Issue.scala rename to src/main/scala/gitbucket/core/model/Issue.scala index 85c6014b3..24568d3f3 100644 --- a/src/main/scala/model/Issue.scala +++ b/src/main/scala/gitbucket/core/model/Issue.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait IssueComponent extends TemplateComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/IssueLabels.scala b/src/main/scala/gitbucket/core/model/IssueLabels.scala similarity index 95% rename from src/main/scala/model/IssueLabels.scala rename to src/main/scala/gitbucket/core/model/IssueLabels.scala index 5d422728a..c56cec784 100644 --- a/src/main/scala/model/IssueLabels.scala +++ b/src/main/scala/gitbucket/core/model/IssueLabels.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait IssueLabelComponent extends TemplateComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/Labels.scala b/src/main/scala/gitbucket/core/model/Labels.scala similarity index 97% rename from src/main/scala/model/Labels.scala rename to src/main/scala/gitbucket/core/model/Labels.scala index 47c6a2bd2..0143c9e9b 100644 --- a/src/main/scala/model/Labels.scala +++ b/src/main/scala/gitbucket/core/model/Labels.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait LabelComponent extends TemplateComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/Milestone.scala b/src/main/scala/gitbucket/core/model/Milestone.scala similarity index 97% rename from src/main/scala/model/Milestone.scala rename to src/main/scala/gitbucket/core/model/Milestone.scala index c392219b8..5c09b5df5 100644 --- a/src/main/scala/model/Milestone.scala +++ b/src/main/scala/gitbucket/core/model/Milestone.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait MilestoneComponent extends TemplateComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/Plugin.scala b/src/main/scala/gitbucket/core/model/Plugin.scala similarity index 94% rename from src/main/scala/model/Plugin.scala rename to src/main/scala/gitbucket/core/model/Plugin.scala index bc85ca0a3..1e8aac545 100644 --- a/src/main/scala/model/Plugin.scala +++ b/src/main/scala/gitbucket/core/model/Plugin.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait PluginComponent extends TemplateComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/Profile.scala b/src/main/scala/gitbucket/core/model/Profile.scala similarity index 67% rename from src/main/scala/model/Profile.scala rename to src/main/scala/gitbucket/core/model/Profile.scala index b88bb0506..7ba55842e 100644 --- a/src/main/scala/model/Profile.scala +++ b/src/main/scala/gitbucket/core/model/Profile.scala @@ -1,25 +1,38 @@ -package model +package gitbucket.core.model + trait Profile { val profile: slick.driver.JdbcProfile import profile.simple._ - // java.util.Date Mapped Column Types + /** + * java.util.Date Mapped Column Types + */ implicit val dateColumnType = MappedColumnType.base[java.util.Date, java.sql.Timestamp]( - d => new java.sql.Timestamp(d.getTime), - t => new java.util.Date(t.getTime) + d => new java.sql.Timestamp(d.getTime), + t => new java.util.Date(t.getTime) ) + /** + * Extends Column to add conditional condition + */ implicit class RichColumn(c1: Column[Boolean]){ def &&(c2: => Column[Boolean], guard: => Boolean): Column[Boolean] = if(guard) c1 && c2 else c1 } + /** + * Returns system date. + */ + def currentDate = new java.util.Date() + } -object Profile extends { +trait ProfileProvider { self: Profile => val profile = slick.driver.H2Driver +} -} with AccessTokenComponent +trait CoreProfile extends ProfileProvider with Profile + with AccessTokenComponent with AccountComponent with ActivityComponent with CollaboratorComponent @@ -35,11 +48,6 @@ object Profile extends { with RepositoryComponent with SshKeyComponent with WebHookComponent - with PluginComponent with Profile { + with PluginComponent - /** - * Returns system date. - */ - def currentDate = new java.util.Date() - -} +object Profile extends CoreProfile diff --git a/src/main/scala/model/PullRequest.scala b/src/main/scala/gitbucket/core/model/PullRequest.scala similarity index 97% rename from src/main/scala/model/PullRequest.scala rename to src/main/scala/gitbucket/core/model/PullRequest.scala index 3ba87ea40..ed5acac37 100644 --- a/src/main/scala/model/PullRequest.scala +++ b/src/main/scala/gitbucket/core/model/PullRequest.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait PullRequestComponent extends TemplateComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/Repository.scala b/src/main/scala/gitbucket/core/model/Repository.scala similarity index 98% rename from src/main/scala/model/Repository.scala rename to src/main/scala/gitbucket/core/model/Repository.scala index 5a888fc4a..789f95712 100644 --- a/src/main/scala/model/Repository.scala +++ b/src/main/scala/gitbucket/core/model/Repository.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait RepositoryComponent extends TemplateComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/SshKey.scala b/src/main/scala/gitbucket/core/model/SshKey.scala similarity index 95% rename from src/main/scala/model/SshKey.scala rename to src/main/scala/gitbucket/core/model/SshKey.scala index dcf346384..fa7909e6c 100644 --- a/src/main/scala/model/SshKey.scala +++ b/src/main/scala/gitbucket/core/model/SshKey.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait SshKeyComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/WebHook.scala b/src/main/scala/gitbucket/core/model/WebHook.scala similarity index 95% rename from src/main/scala/model/WebHook.scala rename to src/main/scala/gitbucket/core/model/WebHook.scala index 4c13c8787..b6897da1c 100644 --- a/src/main/scala/model/WebHook.scala +++ b/src/main/scala/gitbucket/core/model/WebHook.scala @@ -1,4 +1,4 @@ -package model +package gitbucket.core.model trait WebHookComponent extends TemplateComponent { self: Profile => import profile.simple._ diff --git a/src/main/scala/model/package.scala b/src/main/scala/gitbucket/core/model/package.scala similarity index 75% rename from src/main/scala/model/package.scala rename to src/main/scala/gitbucket/core/model/package.scala index c65e72e84..80e19cc75 100644 --- a/src/main/scala/model/package.scala +++ b/src/main/scala/gitbucket/core/model/package.scala @@ -1,3 +1,5 @@ +package gitbucket.core + package object model { type Session = slick.jdbc.JdbcBackend#Session } diff --git a/src/main/scala/gitbucket/core/plugin/Images.scala b/src/main/scala/gitbucket/core/plugin/Images.scala new file mode 100644 index 000000000..3c1f55337 --- /dev/null +++ b/src/main/scala/gitbucket/core/plugin/Images.scala @@ -0,0 +1,10 @@ +package gitbucket.core.plugin + +/** + * Provides a helper method to generate data URI of images registered by plug-in. + */ +object Images { + + def dataURI(id: String) = s"data:image/png;base64,${PluginRegistry().getImage(id)}" + +} diff --git a/src/main/scala/plugin/Plugin.scala b/src/main/scala/gitbucket/core/plugin/Plugin.scala similarity index 89% rename from src/main/scala/plugin/Plugin.scala rename to src/main/scala/gitbucket/core/plugin/Plugin.scala index c17687466..74c91b282 100644 --- a/src/main/scala/plugin/Plugin.scala +++ b/src/main/scala/gitbucket/core/plugin/Plugin.scala @@ -1,8 +1,6 @@ -package plugin +package gitbucket.core.plugin -import javax.servlet.ServletContext - -import util.Version +import gitbucket.core.util.Version /** * Trait for define plugin interface. diff --git a/src/main/scala/plugin/PluginRegistory.scala b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala similarity index 80% rename from src/main/scala/plugin/PluginRegistory.scala rename to src/main/scala/gitbucket/core/plugin/PluginRegistory.scala index bb7c2cb3b..93b6a266a 100644 --- a/src/main/scala/plugin/PluginRegistory.scala +++ b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala @@ -1,24 +1,28 @@ -package plugin +package gitbucket.core.plugin -import java.io.{FilenameFilter, File} +import java.io.{File, FilenameFilter, InputStream} import java.net.URLClassLoader import javax.servlet.ServletContext 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 service.RepositoryService.RepositoryInfo -import util.Directory._ -import util.JDBCUtil._ -import util.{Version, Versions} +import scala.collection.mutable import scala.collection.mutable.ListBuffer -import app.{ControllerBase, Context} class PluginRegistry { private val plugins = new ListBuffer[PluginInfo] private val javaScripts = new ListBuffer[(String, String)] private val controllers = new ListBuffer[(ControllerBase, String)] + private val images = mutable.Map[String, String]() def addPlugin(pluginInfo: PluginInfo): Unit = { plugins += pluginInfo @@ -26,6 +30,18 @@ class PluginRegistry { def getPlugins(): List[PluginInfo] = plugins.toList + def addImage(id: String, in: InputStream): Unit = { + val bytes = using(in){ in => + val bytes = new Array[Byte](in.available) + in.read(bytes) + bytes + } + val encoded = StringUtils.newStringUtf8(Base64.encodeBase64(bytes, false)) + images += ((id, encoded)) + } + + def getImage(id: String): String = images(id) + def addController(controller: ControllerBase, path: String): Unit = { controllers += ((controller, path)) } @@ -38,8 +54,8 @@ class PluginRegistry { //def getJavaScripts(): List[(String, String)] = javaScripts.toList - def getJavaScript(currentPath: String): Option[String] = { - javaScripts.find(x => currentPath.matches(x._1)).map(_._2) + def getJavaScript(currentPath: String): List[String] = { + javaScripts.filter(x => currentPath.matches(x._1)).toList.map(_._2) } private case class GlobalAction( @@ -142,4 +158,4 @@ case class PluginInfo( version: String, description: String, pluginClass: Plugin -) \ No newline at end of file +) diff --git a/src/main/scala/plugin/Results.scala b/src/main/scala/gitbucket/core/plugin/Results.scala similarity index 86% rename from src/main/scala/plugin/Results.scala rename to src/main/scala/gitbucket/core/plugin/Results.scala index 18fdb7fc4..8029e0d32 100644 --- a/src/main/scala/plugin/Results.scala +++ b/src/main/scala/gitbucket/core/plugin/Results.scala @@ -1,4 +1,4 @@ -package plugin +package gitbucket.core.plugin import play.twirl.api.Html diff --git a/src/main/scala/plugin/Sessions.scala b/src/main/scala/gitbucket/core/plugin/Sessions.scala similarity index 68% rename from src/main/scala/plugin/Sessions.scala rename to src/main/scala/gitbucket/core/plugin/Sessions.scala index 7398c9a8d..dc3870211 100644 --- a/src/main/scala/plugin/Sessions.scala +++ b/src/main/scala/gitbucket/core/plugin/Sessions.scala @@ -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. diff --git a/src/main/scala/service/AccesTokenService.scala b/src/main/scala/gitbucket/core/service/AccesTokenService.scala similarity index 90% rename from src/main/scala/service/AccesTokenService.scala rename to src/main/scala/gitbucket/core/service/AccesTokenService.scala index 4de581681..0a8109dc8 100644 --- a/src/main/scala/service/AccesTokenService.scala +++ b/src/main/scala/gitbucket/core/service/AccesTokenService.scala @@ -1,11 +1,14 @@ -package service +package gitbucket.core.service -import model.Profile._ +import gitbucket.core.model.Profile._ import profile.simple._ -import model.{Account, AccessToken} -import util.StringUtil + +import gitbucket.core.model.{Account, AccessToken} +import gitbucket.core.util.StringUtil + import scala.util.Random + trait AccessTokenService { def makeAccessTokenString: String = { diff --git a/src/main/scala/service/AccountService.scala b/src/main/scala/gitbucket/core/service/AccountService.scala similarity index 95% rename from src/main/scala/service/AccountService.scala rename to src/main/scala/gitbucket/core/service/AccountService.scala index 88d95fa62..dbdc3d94a 100644 --- a/src/main/scala/service/AccountService.scala +++ b/src/main/scala/gitbucket/core/service/AccountService.scala @@ -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 model.{Account, GroupMember} -// TODO [Slick 2.0]NOT import directly? -import model.Profile.dateColumnType -import service.SystemSettingsService.SystemSettings -import util.StringUtil._ -import util.LDAPUtil +import StringUtil._ import org.slf4j.LoggerFactory +// TODO Why is direct import required? +import gitbucket.core.model.Profile.dateColumnType trait AccountService { diff --git a/src/main/scala/service/ActivityService.scala b/src/main/scala/gitbucket/core/service/ActivityService.scala similarity index 95% rename from src/main/scala/service/ActivityService.scala rename to src/main/scala/gitbucket/core/service/ActivityService.scala index b1e8202ea..be9205fff 100644 --- a/src/main/scala/service/ActivityService.scala +++ b/src/main/scala/gitbucket/core/service/ActivityService.scala @@ -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 model.Activity trait ActivityService { @@ -121,7 +122,7 @@ trait ActivityService { currentDate) 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, "push", s"[user:${activityUserName}] pushed to [branch:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]", @@ -129,7 +130,7 @@ trait ActivityService { currentDate) 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, "create_tag", s"[user:${activityUserName}] created tag [tag:${userName}/${repositoryName}#${tagName}] at [repo:${userName}/${repositoryName}]", @@ -137,7 +138,7 @@ trait ActivityService { currentDate) 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, "delete_tag", s"[user:${activityUserName}] deleted tag ${tagName} at [repo:${userName}/${repositoryName}]", diff --git a/src/main/scala/service/CommitStatusService.scala b/src/main/scala/gitbucket/core/service/CommitStatusService.scala similarity index 89% rename from src/main/scala/service/CommitStatusService.scala rename to src/main/scala/gitbucket/core/service/CommitStatusService.scala index 8860f77b2..2ebea2b74 100644 --- a/src/main/scala/service/CommitStatusService.scala +++ b/src/main/scala/gitbucket/core/service/CommitStatusService.scala @@ -1,11 +1,13 @@ -package service +package gitbucket.core.service -import model.Profile._ +import gitbucket.core.model.Profile._ import profile.simple._ -import model.{CommitState, CommitStatus, Account} -import util.Implicits._ -import util.StringUtil._ -import service.RepositoryService.RepositoryInfo + +import gitbucket.core.model.{CommitState, CommitStatus, Account} +import gitbucket.core.util.Implicits._ +import gitbucket.core.util.StringUtil._ +import gitbucket.core.service.RepositoryService.RepositoryInfo + trait CommitStatusService { /** insert or update */ diff --git a/src/main/scala/service/CommitsService.scala b/src/main/scala/gitbucket/core/service/CommitsService.scala similarity index 89% rename from src/main/scala/service/CommitsService.scala rename to src/main/scala/gitbucket/core/service/CommitsService.scala index 6f70e3c7d..fbef7cd69 100644 --- a/src/main/scala/service/CommitsService.scala +++ b/src/main/scala/gitbucket/core/service/CommitsService.scala @@ -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 Q.interpolation - -import model.Profile._ +import gitbucket.core.model.Profile._ import profile.simple._ -import model.CommitComment -import util.Implicits._ -import util.StringUtil._ +import Implicits._ +import StringUtil._ trait CommitsService { diff --git a/src/main/scala/service/IssuesService.scala b/src/main/scala/gitbucket/core/service/IssuesService.scala similarity index 97% rename from src/main/scala/service/IssuesService.scala rename to src/main/scala/gitbucket/core/service/IssuesService.scala index 0edc88467..bf6d0b2ab 100644 --- a/src/main/scala/service/IssuesService.scala +++ b/src/main/scala/gitbucket/core/service/IssuesService.scala @@ -1,13 +1,15 @@ -package service +package gitbucket.core.service + +import gitbucket.core.model.Profile._ +import profile.simple._ + +import gitbucket.core.util.StringUtil._ +import gitbucket.core.util.Implicits._ +import gitbucket.core.model._ import scala.slick.jdbc.{StaticQuery => Q} import Q.interpolation -import model.Profile._ -import profile.simple._ -import model.{Issue, IssueComment, IssueLabel, Label} -import util.Implicits._ -import util.StringUtil._ trait IssuesService { import IssuesService._ @@ -98,8 +100,8 @@ trait IssuesService { pp.setInt(a._3) } } - import model.Profile.commitStateColumnType - val query = Q.query[Seq[(String, String, Int)], (String, String, Int, Int, Int, Option[String], Option[model.CommitState], Option[String], Option[String])](s""" + import gitbucket.core.model.Profile.commitStateColumnType + val query = Q.query[Seq[(String, String, Int)], (String, String, Int, Int, Int, Option[String], Option[CommitState], Option[String], Option[String])](s""" SELECT SUMM.USER_NAME, SUMM.REPOSITORY_NAME, SUMM.ISSUE_ID, CS_ALL, CS_SUCCESS , CSD.CONTEXT, CSD.STATE, CSD.TARGET_URL, CSD.DESCRIPTION FROM (SELECT @@ -169,7 +171,7 @@ trait IssuesService { * @return (issue, commentCount, pullRequest, headRepository, headOwner) */ def searchPullRequestByApi(condition: IssueSearchCondition, offset: Int, limit: Int, repos: (String, String)*) - (implicit s: Session): List[(Issue, model.Account, Int, model.PullRequest, model.Repository, model.Account)] = { + (implicit s: Session): List[(Issue, Account, Int, PullRequest, Repository, Account)] = { // get issues and comment count and labels searchIssueQueryBase(condition, true, offset, limit, repos) .innerJoin(PullRequests).on { case ((t1, t2), t3) => t3.byPrimaryKey(t1.userName, t1.repositoryName, t1.issueId) } @@ -533,7 +535,7 @@ object IssuesService { } } - case class CommitStatusInfo(count: Int, successCount: Int, context: Option[String], state: Option[model.CommitState], targetUrl: Option[String], description: Option[String]) + case class CommitStatusInfo(count: Int, successCount: Int, context: Option[String], state: Option[CommitState], targetUrl: Option[String], description: Option[String]) case class IssueInfo(issue: Issue, labels: List[Label], milestone: Option[String], commentCount: Int, status:Option[CommitStatusInfo]) diff --git a/src/main/scala/service/LabelsService.scala b/src/main/scala/gitbucket/core/service/LabelsService.scala similarity index 92% rename from src/main/scala/service/LabelsService.scala rename to src/main/scala/gitbucket/core/service/LabelsService.scala index de1dcb85f..35b5d2de3 100644 --- a/src/main/scala/service/LabelsService.scala +++ b/src/main/scala/gitbucket/core/service/LabelsService.scala @@ -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 model.Label trait LabelsService { diff --git a/src/main/scala/service/MergeService.scala b/src/main/scala/gitbucket/core/service/MergeService.scala similarity index 96% rename from src/main/scala/service/MergeService.scala rename to src/main/scala/gitbucket/core/service/MergeService.scala index b2168ac3e..4b6cc3a2e 100644 --- a/src/main/scala/service/MergeService.scala +++ b/src/main/scala/gitbucket/core/service/MergeService.scala @@ -1,15 +1,19 @@ -package service -import util.LockUtil -import util.Directory._ -import util.Implicits._ -import util.ControlUtil._ +package gitbucket.core.service + +import gitbucket.core.model.Account +import gitbucket.core.util.LockUtil +import gitbucket.core.util.Directory._ +import gitbucket.core.util.Implicits._ +import gitbucket.core.util.ControlUtil._ + import org.eclipse.jgit.merge.MergeStrategy import org.eclipse.jgit.api.Git import org.eclipse.jgit.transport.RefSpec import org.eclipse.jgit.errors.NoMergeBaseException import org.eclipse.jgit.lib.{ObjectId, CommitBuilder, PersonIdent} -import model.Account import org.eclipse.jgit.revwalk.RevWalk + + trait MergeService { import MergeService._ /** diff --git a/src/main/scala/service/MilestonesService.scala b/src/main/scala/gitbucket/core/service/MilestonesService.scala similarity index 92% rename from src/main/scala/service/MilestonesService.scala rename to src/main/scala/gitbucket/core/service/MilestonesService.scala index 476e0c4bf..691ca2e08 100644 --- a/src/main/scala/service/MilestonesService.scala +++ b/src/main/scala/gitbucket/core/service/MilestonesService.scala @@ -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 model.Milestone -// TODO [Slick 2.0]NOT import directly? -import model.Profile.dateColumnType +// TODO Why is direct import required? +import gitbucket.core.model.Profile.dateColumnType trait MilestonesService { diff --git a/src/main/scala/service/PluginService.scala b/src/main/scala/gitbucket/core/service/PluginService.scala similarity index 86% rename from src/main/scala/service/PluginService.scala rename to src/main/scala/gitbucket/core/service/PluginService.scala index d1bb9d88d..99a20d831 100644 --- a/src/main/scala/service/PluginService.scala +++ b/src/main/scala/gitbucket/core/service/PluginService.scala @@ -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 model.Plugin trait PluginService { diff --git a/src/main/scala/service/PullRequestService.scala b/src/main/scala/gitbucket/core/service/PullRequestService.scala similarity index 96% rename from src/main/scala/service/PullRequestService.scala rename to src/main/scala/gitbucket/core/service/PullRequestService.scala index 19c20d988..a6f4a2a01 100644 --- a/src/main/scala/service/PullRequestService.scala +++ b/src/main/scala/gitbucket/core/service/PullRequestService.scala @@ -1,9 +1,10 @@ -package service +package gitbucket.core.service -import model.Profile._ +import gitbucket.core.model.{Account, Issue, PullRequest, WebHook} +import gitbucket.core.model.Profile._ +import gitbucket.core.util.JGitUtil import profile.simple._ -import model.{PullRequest, Issue, WebHook, Account} -import util.JGitUtil + trait PullRequestService { self: IssuesService => import PullRequestService._ diff --git a/src/main/scala/service/RepositorySearchService.scala b/src/main/scala/gitbucket/core/service/RepositorySearchService.scala similarity index 94% rename from src/main/scala/service/RepositorySearchService.scala rename to src/main/scala/gitbucket/core/service/RepositorySearchService.scala index f727af1e2..84e94e471 100644 --- a/src/main/scala/service/RepositorySearchService.scala +++ b/src/main/scala/gitbucket/core/service/RepositorySearchService.scala @@ -1,13 +1,15 @@ -package service +package gitbucket.core.service -import util.{FileUtil, StringUtil, JGitUtil} -import util.Directory._ -import util.ControlUtil._ +import gitbucket.core.model.Issue +import gitbucket.core.util._ +import gitbucket.core.util.StringUtil +import Directory._ +import ControlUtil._ import org.eclipse.jgit.revwalk.RevWalk import org.eclipse.jgit.treewalk.TreeWalk import org.eclipse.jgit.lib.FileMode import org.eclipse.jgit.api.Git -import model.Profile._ +import gitbucket.core.model.Profile._ import profile.simple._ trait RepositorySearchService { self: IssuesService => @@ -108,7 +110,7 @@ object RepositorySearchService { case class SearchResult( files : List[(String, String)], - issues: List[(model.Issue, Int, String)]) + issues: List[(Issue, Int, String)]) case class IssueSearchResult( issueId: Int, diff --git a/src/main/scala/service/RepositoryService.scala b/src/main/scala/gitbucket/core/service/RepositoryService.scala similarity index 98% rename from src/main/scala/service/RepositoryService.scala rename to src/main/scala/gitbucket/core/service/RepositoryService.scala index 34ece5b43..94737222a 100644 --- a/src/main/scala/service/RepositoryService.scala +++ b/src/main/scala/gitbucket/core/service/RepositoryService.scala @@ -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 model.{Repository, Account, Collaborator, Label} -import util.JGitUtil trait RepositoryService { self: AccountService => import RepositoryService._ @@ -377,7 +377,7 @@ object RepositoryService { case class RepositoryInfo(owner: String, name: String, httpUrl: String, repository: Repository, 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) diff --git a/src/main/scala/service/RequestCache.scala b/src/main/scala/gitbucket/core/service/RequestCache.scala similarity index 58% rename from src/main/scala/service/RequestCache.scala rename to src/main/scala/gitbucket/core/service/RequestCache.scala index 4ff502b5e..768a3b49c 100644 --- a/src/main/scala/service/RequestCache.scala +++ b/src/main/scala/gitbucket/core/service/RequestCache.scala @@ -1,7 +1,9 @@ -package service +package gitbucket.core.service -import model.{Account, Issue, Session} -import util.Implicits.request2Session +import gitbucket.core.model.{Session, Issue, Account} +import gitbucket.core.util.Implicits +import gitbucket.core.controller.Context +import Implicits.request2Session /** * 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 { - private implicit def context2Session(implicit context: app.Context): Session = + private implicit def context2Session(implicit context: Context): Session = request2Session(context.request) - def getIssue(userName: String, repositoryName: String, issueId: String) - (implicit context: app.Context): Option[Issue] = { + def getIssue(userName: String, repositoryName: String, issueId: String)(implicit context: Context): Option[Issue] = { context.cache(s"issue.${userName}/${repositoryName}#${issueId}"){ super.getIssue(userName, repositoryName, issueId) } } - def getAccountByUserName(userName: String) - (implicit context: app.Context): Option[Account] = { + def getAccountByUserName(userName: String)(implicit context: Context): Option[Account] = { context.cache(s"account.${userName}"){ super.getAccountByUserName(userName) } } - def getAccountByMailAddress(mailAddress: String) - (implicit context: app.Context): Option[Account] = { + def getAccountByMailAddress(mailAddress: String)(implicit context: Context): Option[Account] = { context.cache(s"account.${mailAddress}"){ super.getAccountByMailAddress(mailAddress) } diff --git a/src/main/scala/service/SshKeyService.scala b/src/main/scala/gitbucket/core/service/SshKeyService.scala similarity index 83% rename from src/main/scala/service/SshKeyService.scala rename to src/main/scala/gitbucket/core/service/SshKeyService.scala index 4446084a4..4113d2c92 100644 --- a/src/main/scala/service/SshKeyService.scala +++ b/src/main/scala/gitbucket/core/service/SshKeyService.scala @@ -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 model.SshKey trait SshKeyService { diff --git a/src/main/scala/service/SystemSettingsService.scala b/src/main/scala/gitbucket/core/service/SystemSettingsService.scala similarity index 98% rename from src/main/scala/service/SystemSettingsService.scala rename to src/main/scala/gitbucket/core/service/SystemSettingsService.scala index 156a23b7b..6a3b8d33f 100644 --- a/src/main/scala/service/SystemSettingsService.scala +++ b/src/main/scala/gitbucket/core/service/SystemSettingsService.scala @@ -1,7 +1,8 @@ -package service +package gitbucket.core.service -import util.Directory._ -import util.ControlUtil._ +import gitbucket.core.util.{Directory, ControlUtil} +import Directory._ +import ControlUtil._ import SystemSettingsService._ import javax.servlet.http.HttpServletRequest diff --git a/src/main/scala/service/WebHookService.scala b/src/main/scala/gitbucket/core/service/WebHookService.scala similarity index 90% rename from src/main/scala/service/WebHookService.scala rename to src/main/scala/gitbucket/core/service/WebHookService.scala index 83c40ac64..cba641d41 100644 --- a/src/main/scala/service/WebHookService.scala +++ b/src/main/scala/gitbucket/core/service/WebHookService.scala @@ -1,19 +1,35 @@ -package service +package gitbucket.core.service -import model.Profile._ +import gitbucket.core.model.{WebHook, Account, Issue, PullRequest, IssueComment, Repository} +import gitbucket.core.model.Profile._ import profile.simple._ -import model.{WebHook, Account, Issue, PullRequest, IssueComment, Repository, CommitStatus, CommitState} + +import gitbucket.core.service.RepositoryService.RepositoryInfo +import gitbucket.core.util.JGitUtil +import gitbucket.core.util.JGitUtil.CommitInfo +import gitbucket.core.util.RepositoryName + import org.slf4j.LoggerFactory -import service.RepositoryService.RepositoryInfo -import util.JGitUtil -import util.JGitUtil.CommitInfo +import gitbucket.core.service.RepositoryService.RepositoryInfo + + + +import org.slf4j.LoggerFactory +import RepositoryService.RepositoryInfo +import org.eclipse.jgit.diff.DiffEntry +import JGitUtil.CommitInfo + + import org.eclipse.jgit.api.Git import org.apache.http.message.BasicNameValuePair import org.apache.http.client.entity.UrlEncodedFormEntity import org.apache.http.NameValuePair import java.util.Date + +// TODO(tanacasino): Fix package name import api._ + trait WebHookService { import WebHookService._ @@ -77,7 +93,7 @@ trait WebHookPullRequestService extends WebHookService { import WebHookService._ // https://developer.github.com/v3/activity/events/types/#issuesevent - def callIssuesWebHook(action: String, repository: RepositoryService.RepositoryInfo, issue: Issue, baseUrl: String, sender: model.Account)(implicit s: Session, context:JsonFormat.Context): Unit = { + def callIssuesWebHook(action: String, repository: RepositoryService.RepositoryInfo, issue: Issue, baseUrl: String, sender: Account)(implicit s: Session, context:JsonFormat.Context): Unit = { callWebHookOf(repository.owner, repository.name, "issues"){ val users = getAccountsByUserNames(Set(repository.owner, issue.userName), Set(sender)) for{ @@ -94,7 +110,7 @@ trait WebHookPullRequestService extends WebHookService { } } - def callPullRequestWebHook(action: String, repository: RepositoryService.RepositoryInfo, issueId: Int, baseUrl: String, sender: model.Account)(implicit s: Session, context:JsonFormat.Context): Unit = { + def callPullRequestWebHook(action: String, repository: RepositoryService.RepositoryInfo, issueId: Int, baseUrl: String, sender: Account)(implicit s: Session, context:JsonFormat.Context): Unit = { import WebHookService._ callWebHookOf(repository.owner, repository.name, "pull_request"){ for{ @@ -132,7 +148,7 @@ trait WebHookPullRequestService extends WebHookService { ((is, pr, bu, ru), wh) }).list.groupBy(_._1).mapValues(_.map(_._2)) - def callPullRequestWebHookByRequestBranch(action: String, requestRepository: RepositoryService.RepositoryInfo, requestBranch: String, baseUrl: String, sender: model.Account)(implicit s: Session, context:JsonFormat.Context): Unit = { + def callPullRequestWebHookByRequestBranch(action: String, requestRepository: RepositoryService.RepositoryInfo, requestBranch: String, baseUrl: String, sender: Account)(implicit s: Session, context:JsonFormat.Context): Unit = { import WebHookService._ for{ ((issue, pullRequest, baseOwner, headOwner), webHooks) <- getPullRequestsByRequestForWebhook(requestRepository.owner, requestRepository.name, requestBranch) @@ -156,7 +172,7 @@ trait WebHookIssueCommentService extends WebHookPullRequestService { self: AccountService with RepositoryService with PullRequestService with IssuesService => import WebHookService._ - def callIssueCommentWebHook(repository: RepositoryService.RepositoryInfo, issue: Issue, issueCommentId: Int, sender: model.Account)(implicit s: Session, context:JsonFormat.Context): Unit = { + def callIssueCommentWebHook(repository: RepositoryService.RepositoryInfo, issue: Issue, issueCommentId: Int, sender: Account)(implicit s: Session, context:JsonFormat.Context): Unit = { callWebHookOf(repository.owner, repository.name, "issue_comment"){ for{ issueComment <- getComment(repository.owner, repository.name, issueCommentId.toString()) @@ -195,7 +211,7 @@ object WebHookService { WebHookPushPayload( ApiUser(pusher), refName, - commits.map{ commit => ApiCommit(git, util.RepositoryName(repositoryInfo), commit) }, + commits.map{ commit => ApiCommit(git, RepositoryName(repositoryInfo), commit) }, ApiRepository( repositoryInfo, owner= ApiUser(repositoryOwner) @@ -228,7 +244,7 @@ object WebHookService { headOwner: Account, baseRepository: RepositoryInfo, baseOwner: Account, - sender: model.Account): WebHookPullRequestPayload = { + sender: Account): WebHookPullRequestPayload = { val headRepoPayload = ApiRepository(headRepository, headOwner) val baseRepoPayload = ApiRepository(baseRepository, baseOwner) val senderPayload = ApiUser(sender) diff --git a/src/main/scala/service/WikiService.scala b/src/main/scala/gitbucket/core/service/WikiService.scala similarity index 95% rename from src/main/scala/service/WikiService.scala rename to src/main/scala/gitbucket/core/service/WikiService.scala index add502131..f317c5187 100644 --- a/src/main/scala/service/WikiService.scala +++ b/src/main/scala/gitbucket/core/service/WikiService.scala @@ -1,9 +1,10 @@ -package service +package gitbucket.core.service 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 util._ -import _root_.util.ControlUtil._ import org.eclipse.jgit.treewalk.CanonicalTreeParser import org.eclipse.jgit.lib._ import org.eclipse.jgit.dircache.DirCache @@ -12,7 +13,7 @@ import java.io.ByteArrayInputStream import org.eclipse.jgit.patch._ import org.eclipse.jgit.api.errors.PatchFormatException import scala.collection.JavaConverters._ -import service.RepositoryService.RepositoryInfo +import RepositoryService.RepositoryInfo object WikiService { @@ -46,7 +47,7 @@ object WikiService { trait 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"){ defining(Directory.getWikiRepositoryDir(owner, repository)){ dir => if(!dir.exists){ @@ -102,7 +103,7 @@ trait WikiService { * Reverts specified changes. */ 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) @@ -204,7 +205,7 @@ trait WikiService { * Save the wiki page. */ 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"){ using(Git.open(Directory.getWikiRepositoryDir(owner, repository))){ git => val builder = DirCache.newInCore.builder() diff --git a/src/main/scala/servlet/AccessTokenAuthenticationFilter.scala b/src/main/scala/gitbucket/core/servlet/AccessTokenAuthenticationFilter.scala similarity index 91% rename from src/main/scala/servlet/AccessTokenAuthenticationFilter.scala rename to src/main/scala/gitbucket/core/servlet/AccessTokenAuthenticationFilter.scala index 56e50c206..7cc37540c 100644 --- a/src/main/scala/servlet/AccessTokenAuthenticationFilter.scala +++ b/src/main/scala/gitbucket/core/servlet/AccessTokenAuthenticationFilter.scala @@ -1,14 +1,16 @@ -package servlet +package gitbucket.core.servlet import javax.servlet._ import javax.servlet.http.{HttpServletRequest, HttpServletResponse} -import service.AccessTokenService -import util.Keys +import gitbucket.core.model.Account +import gitbucket.core.service.AccessTokenService +import gitbucket.core.util.Keys + import org.scalatra.servlet.ServletApiImplicits._ -import model.Account import org.scalatra._ + class AccessTokenAuthenticationFilter extends Filter with AccessTokenService { private val tokenHeaderPrefix = "token " diff --git a/src/main/scala/servlet/BasicAuthenticationFilter.scala b/src/main/scala/gitbucket/core/servlet/BasicAuthenticationFilter.scala similarity index 80% rename from src/main/scala/servlet/BasicAuthenticationFilter.scala rename to src/main/scala/gitbucket/core/servlet/BasicAuthenticationFilter.scala index cbecfc1ac..1badf0e52 100644 --- a/src/main/scala/servlet/BasicAuthenticationFilter.scala +++ b/src/main/scala/gitbucket/core/servlet/BasicAuthenticationFilter.scala @@ -1,16 +1,15 @@ -package servlet +package gitbucket.core.servlet import javax.servlet._ import javax.servlet.http._ -import service.{SystemSettingsService, AccountService, RepositoryService} -import model._ +import gitbucket.core.service.{RepositoryService, AccountService, SystemSettingsService} +import gitbucket.core.util.{ControlUtil, Keys, Implicits} import org.slf4j.LoggerFactory -import util.Implicits._ -import util.ControlUtil._ -import util.Keys +import Implicits._ +import ControlUtil._ /** - * Provides BASIC Authentication for [[servlet.GitRepositoryServlet]]. + * Provides BASIC Authentication for [[GitRepositoryServlet]]. */ class BasicAuthenticationFilter extends Filter with RepositoryService with AccountService with SystemSettingsService { @@ -29,7 +28,6 @@ class BasicAuthenticationFilter extends Filter with RepositoryService with Accou } val isUpdating = request.getRequestURI.endsWith("/git-receive-pack") || "service=git-receive-pack".equals(request.getQueryString) - val settings = loadSystemSettings() try { @@ -45,13 +43,15 @@ class BasicAuthenticationFilter extends Filter with RepositoryService with Accou case auth => decodeAuthHeader(auth).split(":") match { case Array(username, password) => { authenticate(settings, username, password) match { - case Some(account) => { - if(isUpdating && hasWritePermission(repository.owner, repository.name, Some(account))){ + case Some(account) if (isUpdating || repository.repository.isPrivate) => { + if(hasWritePermission(repository.owner, repository.name, Some(account))){ request.setAttribute(Keys.Request.UserName, account.userName) + chain.doFilter(req, wrappedResponse) + } else { + requireAuth(response) } - chain.doFilter(req, wrappedResponse) } - case None => requireAuth(response) + case _ => requireAuth(response) } } case _ => requireAuth(response) diff --git a/src/main/scala/servlet/GitRepositoryServlet.scala b/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala similarity index 95% rename from src/main/scala/servlet/GitRepositoryServlet.scala rename to src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala index 9ebb4ac3a..0f490b3e8 100644 --- a/src/main/scala/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala @@ -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.lib._ import org.eclipse.jgit.transport._ @@ -9,21 +12,19 @@ import org.slf4j.LoggerFactory import javax.servlet.ServletConfig import javax.servlet.ServletContext import javax.servlet.http.{HttpServletResponse, HttpServletRequest} -import util.{StringUtil, Keys, JGitUtil, Directory} -import util.ControlUtil._ -import util.Implicits._ -import service._ +import gitbucket.core.util.StringUtil +import gitbucket.core.util.ControlUtil._ +import gitbucket.core.util.Implicits._ import WebHookService._ import org.eclipse.jgit.api.Git -import util.JGitUtil.CommitInfo -import service.IssuesService.IssueSearchCondition -import model.Session +import JGitUtil.CommitInfo +import IssuesService.IssueSearchCondition /** * Provides Git repository via HTTP. * * This servlet provides only Git repository functionality. - * Authentication is provided by [[servlet.BasicAuthenticationFilter]]. + * Authentication is provided by [[BasicAuthenticationFilter]]. */ class GitRepositoryServlet extends GitServlet with SystemSettingsService { diff --git a/src/main/scala/servlet/InitializeListener.scala b/src/main/scala/gitbucket/core/servlet/InitializeListener.scala similarity index 95% rename from src/main/scala/servlet/InitializeListener.scala rename to src/main/scala/gitbucket/core/servlet/InitializeListener.scala index a4b1e1ec4..a20bcfd95 100644 --- a/src/main/scala/servlet/InitializeListener.scala +++ b/src/main/scala/gitbucket/core/servlet/InitializeListener.scala @@ -1,17 +1,19 @@ -package servlet +package gitbucket.core.servlet import java.io.File import java.sql.{DriverManager, Connection} +import gitbucket.core.plugin.PluginRegistry +import gitbucket.core.util._ import org.apache.commons.io.FileUtils import javax.servlet.{ServletContextListener, ServletContextEvent} import org.slf4j.LoggerFactory -import util.Directory._ -import util.ControlUtil._ -import util.JDBCUtil._ +import Directory._ +import ControlUtil._ +import JDBCUtil._ import org.eclipse.jgit.api.Git -import util.{Version, Versions} -import plugin._ -import util.{DatabaseConfig, Directory} +import gitbucket.core.util.Versions +import gitbucket.core.util.Directory +import gitbucket.core.plugin._ object AutoUpdate { @@ -19,7 +21,8 @@ object AutoUpdate { * The history of versions. A head of this sequence is the current BitBucket version. */ val versions = Seq( - new Version(2, 9), + // TODO(tanacasino): Add 3.1 migration + new Version(3, 0), new Version(2, 8), new Version(2, 7) { override def update(conn: Connection, cl: ClassLoader): Unit = { diff --git a/src/main/scala/servlet/SessionCleanupListener.scala b/src/main/scala/gitbucket/core/servlet/SessionCleanupListener.scala similarity index 82% rename from src/main/scala/servlet/SessionCleanupListener.scala rename to src/main/scala/gitbucket/core/servlet/SessionCleanupListener.scala index ee4ea7b2d..97ab13bd1 100644 --- a/src/main/scala/servlet/SessionCleanupListener.scala +++ b/src/main/scala/gitbucket/core/servlet/SessionCleanupListener.scala @@ -1,8 +1,9 @@ -package servlet +package gitbucket.core.servlet import javax.servlet.http.{HttpSessionEvent, HttpSessionListener} +import gitbucket.core.util.Directory import org.apache.commons.io.FileUtils -import util.Directory._ +import Directory._ /** * Removes session associated temporary files when session is destroyed. diff --git a/src/main/scala/servlet/TransactionFilter.scala b/src/main/scala/gitbucket/core/servlet/TransactionFilter.scala similarity index 93% rename from src/main/scala/servlet/TransactionFilter.scala rename to src/main/scala/gitbucket/core/servlet/TransactionFilter.scala index 20d37f528..2fdd17a9c 100644 --- a/src/main/scala/servlet/TransactionFilter.scala +++ b/src/main/scala/gitbucket/core/servlet/TransactionFilter.scala @@ -1,11 +1,12 @@ -package servlet +package gitbucket.core.servlet import javax.servlet._ import javax.servlet.http.HttpServletRequest import com.mchange.v2.c3p0.ComboPooledDataSource +import gitbucket.core.util.DatabaseConfig import org.slf4j.LoggerFactory 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. diff --git a/src/main/scala/ssh/GitCommand.scala b/src/main/scala/gitbucket/core/ssh/GitCommand.scala similarity index 93% rename from src/main/scala/ssh/GitCommand.scala rename to src/main/scala/gitbucket/core/ssh/GitCommand.scala index 35fb67bae..c78ff82f7 100644 --- a/src/main/scala/ssh/GitCommand.scala +++ b/src/main/scala/gitbucket/core/ssh/GitCommand.scala @@ -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.slf4j.LoggerFactory import java.io.{InputStream, OutputStream} -import util.ControlUtil._ +import ControlUtil._ import org.eclipse.jgit.api.Git -import util.Directory._ +import Directory._ import org.eclipse.jgit.transport.{ReceivePack, UploadPack} import org.apache.sshd.server.command.UnknownCommand -import servlet.{Database, CommitLogHook} -import service.{AccountService, RepositoryService, SystemSettingsService} import org.eclipse.jgit.errors.RepositoryNotFoundException -import model.Session object GitCommand { val CommandRegex = """\Agit-(upload|receive)-pack '/([a-zA-Z0-9\-_.]+)/([a-zA-Z0-9\-_.]+).git'\Z""".r diff --git a/src/main/scala/ssh/NoShell.scala b/src/main/scala/gitbucket/core/ssh/NoShell.scala similarity index 96% rename from src/main/scala/ssh/NoShell.scala rename to src/main/scala/gitbucket/core/ssh/NoShell.scala index c107be695..bd30ccf45 100644 --- a/src/main/scala/ssh/NoShell.scala +++ b/src/main/scala/gitbucket/core/ssh/NoShell.scala @@ -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.server.{Environment, ExitCallback, Command} import java.io.{OutputStream, InputStream} import org.eclipse.jgit.lib.Constants -import service.SystemSettingsService class NoShell extends Factory[Command] with SystemSettingsService { override def create(): Command = new Command() { diff --git a/src/main/scala/ssh/PublicKeyAuthenticator.scala b/src/main/scala/gitbucket/core/ssh/PublicKeyAuthenticator.scala similarity index 84% rename from src/main/scala/ssh/PublicKeyAuthenticator.scala rename to src/main/scala/gitbucket/core/ssh/PublicKeyAuthenticator.scala index ddcc72460..daf5c30f4 100644 --- a/src/main/scala/ssh/PublicKeyAuthenticator.scala +++ b/src/main/scala/gitbucket/core/ssh/PublicKeyAuthenticator.scala @@ -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.session.ServerSession import java.security.PublicKey -import service.SshKeyService -import servlet.Database class PublicKeyAuthenticator extends PublickeyAuthenticator with SshKeyService { diff --git a/src/main/scala/ssh/SshServerListener.scala b/src/main/scala/gitbucket/core/ssh/SshServerListener.scala similarity index 94% rename from src/main/scala/ssh/SshServerListener.scala rename to src/main/scala/gitbucket/core/ssh/SshServerListener.scala index b441caefe..1288eb106 100644 --- a/src/main/scala/ssh/SshServerListener.scala +++ b/src/main/scala/gitbucket/core/ssh/SshServerListener.scala @@ -1,10 +1,10 @@ -package ssh +package gitbucket.core.ssh import javax.servlet.{ServletContextEvent, ServletContextListener} +import gitbucket.core.service.SystemSettingsService +import gitbucket.core.util.Directory import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider import org.slf4j.LoggerFactory -import util.Directory -import service.SystemSettingsService import java.util.concurrent.atomic.AtomicBoolean object SshServer { diff --git a/src/main/scala/ssh/SshUtil.scala b/src/main/scala/gitbucket/core/ssh/SshUtil.scala similarity index 97% rename from src/main/scala/ssh/SshUtil.scala rename to src/main/scala/gitbucket/core/ssh/SshUtil.scala index 9d6484c65..512332cec 100644 --- a/src/main/scala/ssh/SshUtil.scala +++ b/src/main/scala/gitbucket/core/ssh/SshUtil.scala @@ -1,4 +1,4 @@ -package ssh +package gitbucket.core.ssh import java.security.PublicKey import org.slf4j.LoggerFactory diff --git a/src/main/scala/util/Authenticator.scala b/src/main/scala/gitbucket/core/util/Authenticator.scala similarity index 97% rename from src/main/scala/util/Authenticator.scala rename to src/main/scala/gitbucket/core/util/Authenticator.scala index f40af7bcc..49de66515 100644 --- a/src/main/scala/util/Authenticator.scala +++ b/src/main/scala/gitbucket/core/util/Authenticator.scala @@ -1,10 +1,10 @@ -package util +package gitbucket.core.util -import app.ControllerBase -import service._ +import gitbucket.core.controller.ControllerBase +import gitbucket.core.service.{RepositoryService, AccountService} import RepositoryService.RepositoryInfo -import util.Implicits._ -import util.ControlUtil._ +import Implicits._ +import ControlUtil._ /** * Allows only oneself and administrators. diff --git a/src/main/scala/util/ControlUtil.scala b/src/main/scala/gitbucket/core/util/ControlUtil.scala similarity index 97% rename from src/main/scala/util/ControlUtil.scala rename to src/main/scala/gitbucket/core/util/ControlUtil.scala index 7945f32a5..268e69274 100644 --- a/src/main/scala/util/ControlUtil.scala +++ b/src/main/scala/gitbucket/core/util/ControlUtil.scala @@ -1,4 +1,4 @@ -package util +package gitbucket.core.util import org.eclipse.jgit.api.Git import org.eclipse.jgit.revwalk.RevWalk diff --git a/src/main/scala/util/DatabaseConfig.scala b/src/main/scala/gitbucket/core/util/DatabaseConfig.scala similarity index 89% rename from src/main/scala/util/DatabaseConfig.scala rename to src/main/scala/gitbucket/core/util/DatabaseConfig.scala index 86453e39b..ffe7ceeb9 100644 --- a/src/main/scala/util/DatabaseConfig.scala +++ b/src/main/scala/gitbucket/core/util/DatabaseConfig.scala @@ -1,7 +1,7 @@ -package util +package gitbucket.core.util import com.typesafe.config.ConfigFactory -import util.Directory.DatabaseHome +import Directory.DatabaseHome object DatabaseConfig { diff --git a/src/main/scala/util/Directory.scala b/src/main/scala/gitbucket/core/util/Directory.scala similarity index 98% rename from src/main/scala/util/Directory.scala rename to src/main/scala/gitbucket/core/util/Directory.scala index 900817109..de97bbb8a 100644 --- a/src/main/scala/util/Directory.scala +++ b/src/main/scala/gitbucket/core/util/Directory.scala @@ -1,7 +1,7 @@ -package util +package gitbucket.core.util import java.io.File -import util.ControlUtil._ +import ControlUtil._ import org.apache.commons.io.FileUtils /** diff --git a/src/main/scala/util/FileUtil.scala b/src/main/scala/gitbucket/core/util/FileUtil.scala similarity index 96% rename from src/main/scala/util/FileUtil.scala rename to src/main/scala/gitbucket/core/util/FileUtil.scala index 0145db476..d3428fb53 100644 --- a/src/main/scala/util/FileUtil.scala +++ b/src/main/scala/gitbucket/core/util/FileUtil.scala @@ -1,9 +1,9 @@ -package util +package gitbucket.core.util import org.apache.commons.io.FileUtils import java.net.URLConnection import java.io.File -import util.ControlUtil._ +import ControlUtil._ import scala.util.Random object FileUtil { diff --git a/src/main/scala/util/Implicits.scala b/src/main/scala/gitbucket/core/util/Implicits.scala similarity index 90% rename from src/main/scala/util/Implicits.scala rename to src/main/scala/gitbucket/core/util/Implicits.scala index 02ecb821b..d56424b17 100644 --- a/src/main/scala/util/Implicits.scala +++ b/src/main/scala/gitbucket/core/util/Implicits.scala @@ -1,10 +1,15 @@ -package util +package gitbucket.core.util + +import gitbucket.core.controller.Context +import gitbucket.core.servlet.Database + +import javax.servlet.http.{HttpSession, HttpServletRequest} import scala.util.matching.Regex import scala.util.control.Exception._ + import slick.jdbc.JdbcBackend -import servlet.Database -import javax.servlet.http.{HttpSession, HttpServletRequest} + /** * Provides some usable implicit conversions. @@ -14,7 +19,7 @@ object Implicits { // Convert to slick session. implicit def request2Session(implicit request: HttpServletRequest): JdbcBackend#Session = Database.getSession(request) - implicit def context2ApiJsonFormatContext(implicit context: app.Context): api.JsonFormat.Context = api.JsonFormat.Context(context.baseUrl) + implicit def context2ApiJsonFormatContext(implicit context: Context): api.JsonFormat.Context = api.JsonFormat.Context(context.baseUrl) implicit class RichSeq[A](seq: Seq[A]) { diff --git a/src/main/scala/util/JDBCUtil.scala b/src/main/scala/gitbucket/core/util/JDBCUtil.scala similarity index 96% rename from src/main/scala/util/JDBCUtil.scala rename to src/main/scala/gitbucket/core/util/JDBCUtil.scala index 5d880d0c5..41a2b1a56 100644 --- a/src/main/scala/util/JDBCUtil.scala +++ b/src/main/scala/gitbucket/core/util/JDBCUtil.scala @@ -1,7 +1,7 @@ -package util +package gitbucket.core.util import java.sql._ -import util.ControlUtil._ +import ControlUtil._ import scala.collection.mutable.ListBuffer /** diff --git a/src/main/scala/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala similarity index 99% rename from src/main/scala/util/JGitUtil.scala rename to src/main/scala/gitbucket/core/util/JGitUtil.scala index 47e6994ad..67877596c 100644 --- a/src/main/scala/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -1,9 +1,10 @@ -package util +package gitbucket.core.util +import gitbucket.core.service.RepositoryService import org.eclipse.jgit.api.Git -import util.Directory._ -import util.StringUtil._ -import util.ControlUtil._ +import Directory._ +import StringUtil._ +import ControlUtil._ import scala.annotation.tailrec import scala.collection.JavaConverters._ import org.eclipse.jgit.lib._ @@ -16,7 +17,6 @@ import org.eclipse.jgit.errors.{ConfigInvalidException, MissingObjectException} import org.eclipse.jgit.transport.RefSpec import java.util.Date import org.eclipse.jgit.api.errors.{JGitInternalException, InvalidRefNameException, RefAlreadyExistsException, NoHeadException} -import service.RepositoryService import org.eclipse.jgit.dircache.DirCacheEntry import org.slf4j.LoggerFactory @@ -176,7 +176,7 @@ object JGitUtil { git.tagList.call.asScala.map { ref => val revCommit = getRevCommitFromId(git, ref.getObjectId) TagInfo(ref.getName.stripPrefix("refs/tags/"), revCommit.getCommitterIdent.getWhen, revCommit.getName) - }.toList + }.sortBy(_.time).toList ) } catch { // not initialized diff --git a/src/main/scala/util/Keys.scala b/src/main/scala/gitbucket/core/util/Keys.scala similarity index 98% rename from src/main/scala/util/Keys.scala rename to src/main/scala/gitbucket/core/util/Keys.scala index b6b6c79bb..3581879f5 100644 --- a/src/main/scala/util/Keys.scala +++ b/src/main/scala/gitbucket/core/util/Keys.scala @@ -1,4 +1,4 @@ -package util +package gitbucket.core.util /** * Define key strings for request attributes, session attributes or flash attributes. diff --git a/src/main/scala/util/LDAPUtil.scala b/src/main/scala/gitbucket/core/util/LDAPUtil.scala similarity index 97% rename from src/main/scala/util/LDAPUtil.scala rename to src/main/scala/gitbucket/core/util/LDAPUtil.scala index c8d741f83..98daddc08 100644 --- a/src/main/scala/util/LDAPUtil.scala +++ b/src/main/scala/gitbucket/core/util/LDAPUtil.scala @@ -1,13 +1,13 @@ -package util +package gitbucket.core.util -import util.ControlUtil._ -import service.SystemSettingsService +import gitbucket.core.model.Account +import ControlUtil._ +import gitbucket.core.service.SystemSettingsService +import gitbucket.core.service.SystemSettingsService.Ldap import com.novell.ldap._ import java.security.Security import org.slf4j.LoggerFactory -import service.SystemSettingsService.Ldap import scala.annotation.tailrec -import model.Account /** * Utility for LDAP authentication. diff --git a/src/main/scala/util/LockUtil.scala b/src/main/scala/gitbucket/core/util/LockUtil.scala similarity index 93% rename from src/main/scala/util/LockUtil.scala rename to src/main/scala/gitbucket/core/util/LockUtil.scala index 267b28bbd..4b13d177c 100644 --- a/src/main/scala/util/LockUtil.scala +++ b/src/main/scala/gitbucket/core/util/LockUtil.scala @@ -1,8 +1,8 @@ -package util +package gitbucket.core.util import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.locks.{ReentrantLock, Lock} -import util.ControlUtil._ +import ControlUtil._ object LockUtil { diff --git a/src/main/scala/util/Notifier.scala b/src/main/scala/gitbucket/core/util/Notifier.scala similarity index 87% rename from src/main/scala/util/Notifier.scala rename to src/main/scala/gitbucket/core/util/Notifier.scala index f9e43486f..9e8091777 100644 --- a/src/main/scala/util/Notifier.scala +++ b/src/main/scala/gitbucket/core/util/Notifier.scala @@ -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 ExecutionContext.Implicits.global import org.apache.commons.mail.{DefaultAuthenticator, HtmlEmail} import org.slf4j.LoggerFactory -import app.Context -import model.Session -import service.{AccountService, RepositoryService, IssuesService, SystemSettingsService} -import servlet.Database +import gitbucket.core.controller.Context import SystemSettingsService.Smtp -import _root_.util.ControlUtil.defining +import ControlUtil.defining trait Notifier extends RepositoryService with AccountService with IssuesService { def toNotify(r: RepositoryService.RepositoryInfo, issueId: Int, content: String) (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 issue.userName :: @@ -74,7 +76,7 @@ class Mailer(private val smtp: Smtp) extends Notifier { getIssue(r.owner, r.name, issueId.toString) foreach { issue => defining( 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 => val email = new HtmlEmail email.setHostName(smtp.host) diff --git a/src/main/scala/gitbucket/core/util/RepoitoryName.scala b/src/main/scala/gitbucket/core/util/RepoitoryName.scala new file mode 100644 index 000000000..415b20bcc --- /dev/null +++ b/src/main/scala/gitbucket/core/util/RepoitoryName.scala @@ -0,0 +1,18 @@ +package gitbucket.core.util + +case class RepositoryName(owner:String, name:String){ + val fullName = s"${owner}/${name}" +} + +object RepositoryName{ + def apply(fullName: String): RepositoryName = { + fullName.split("/").toList match { + case owner :: name :: Nil => RepositoryName(owner, name) + case _ => throw new IllegalArgumentException(s"${fullName} is not repositoryName (only 'owner/name')") + } + } + def apply(repository: gitbucket.core.model.Repository): RepositoryName = RepositoryName(repository.userName, repository.repositoryName) + def apply(repository: gitbucket.core.util.JGitUtil.RepositoryInfo): RepositoryName = RepositoryName(repository.owner, repository.name) + def apply(repository: gitbucket.core.service.RepositoryService.RepositoryInfo): RepositoryName = RepositoryName(repository.owner, repository.name) + def apply(repository: gitbucket.core.model.CommitStatus): RepositoryName = RepositoryName(repository.userName, repository.repositoryName) +} diff --git a/src/main/scala/util/StringUtil.scala b/src/main/scala/gitbucket/core/util/StringUtil.scala similarity index 96% rename from src/main/scala/util/StringUtil.scala rename to src/main/scala/gitbucket/core/util/StringUtil.scala index dac3de362..4bb1cb071 100644 --- a/src/main/scala/util/StringUtil.scala +++ b/src/main/scala/gitbucket/core/util/StringUtil.scala @@ -1,8 +1,8 @@ -package util +package gitbucket.core.util import java.net.{URLDecoder, URLEncoder} import org.mozilla.universalchardet.UniversalDetector -import util.ControlUtil._ +import ControlUtil._ import org.apache.commons.io.input.BOMInputStream import org.apache.commons.io.IOUtils @@ -30,7 +30,7 @@ object StringUtil { value.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """) /** - * 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. */ def convertFromByteArray(content: Array[Byte]): String = diff --git a/src/main/scala/util/Validations.scala b/src/main/scala/gitbucket/core/util/Validations.scala similarity index 97% rename from src/main/scala/util/Validations.scala rename to src/main/scala/gitbucket/core/util/Validations.scala index ce4c1827c..7aa533ea9 100644 --- a/src/main/scala/util/Validations.scala +++ b/src/main/scala/gitbucket/core/util/Validations.scala @@ -1,4 +1,4 @@ -package util +package gitbucket.core.util import jp.sf.amateras.scalatra.forms._ import org.scalatra.i18n.Messages diff --git a/src/main/scala/util/Version.scala b/src/main/scala/gitbucket/core/util/Version.scala similarity index 97% rename from src/main/scala/util/Version.scala rename to src/main/scala/gitbucket/core/util/Version.scala index fed74a8e0..3c7ffe631 100644 --- a/src/main/scala/util/Version.scala +++ b/src/main/scala/gitbucket/core/util/Version.scala @@ -1,10 +1,10 @@ -package util +package gitbucket.core.util import java.sql.Connection import org.apache.commons.io.IOUtils import org.slf4j.LoggerFactory -import util.ControlUtil._ +import ControlUtil._ case class Version(majorVersion: Int, minorVersion: Int) { diff --git a/src/main/scala/view/AvatarImageProvider.scala b/src/main/scala/gitbucket/core/view/AvatarImageProvider.scala similarity index 90% rename from src/main/scala/view/AvatarImageProvider.scala rename to src/main/scala/gitbucket/core/view/AvatarImageProvider.scala index 8e610af34..8d316ab3f 100644 --- a/src/main/scala/view/AvatarImageProvider.scala +++ b/src/main/scala/gitbucket/core/view/AvatarImageProvider.scala @@ -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 util.StringUtil 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. */ 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){ // by user name diff --git a/src/main/scala/view/LinkConverter.scala b/src/main/scala/gitbucket/core/view/LinkConverter.scala similarity index 79% rename from src/main/scala/view/LinkConverter.scala rename to src/main/scala/gitbucket/core/view/LinkConverter.scala index 03f60099e..951a45da4 100644 --- a/src/main/scala/view/LinkConverter.scala +++ b/src/main/scala/gitbucket/core/view/LinkConverter.scala @@ -1,15 +1,17 @@ -package view +package gitbucket.core.view -import service.RequestCache -import util.Implicits.RichString +import gitbucket.core.controller.Context +import gitbucket.core.service.{RepositoryService, RequestCache} +import gitbucket.core.util.Implicits +import gitbucket.core.util.Implicits.RichString trait LinkConverter { self: RequestCache => /** * Converts issue id, username and commit id to link. */ - protected def convertRefsLinks(value: String, repository: service.RepositoryService.RepositoryInfo, - issueIdPrefix: String = "#")(implicit context: app.Context): String = { + protected def convertRefsLinks(value: String, repository: RepositoryService.RepositoryInfo, + issueIdPrefix: String = "#")(implicit context: Context): String = { value // escape HTML tags .replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """) diff --git a/src/main/scala/view/Markdown.scala b/src/main/scala/gitbucket/core/view/Markdown.scala similarity index 94% rename from src/main/scala/view/Markdown.scala rename to src/main/scala/gitbucket/core/view/Markdown.scala index 836e5c91f..fd0b19ce6 100644 --- a/src/main/scala/view/Markdown.scala +++ b/src/main/scala/gitbucket/core/view/Markdown.scala @@ -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.util.Locale 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 service.{RequestCache, WikiService} object Markdown { @@ -19,12 +20,12 @@ object Markdown { * Converts Markdown of Wiki pages to HTML. */ def toHtml(markdown: String, - repository: service.RepositoryService.RepositoryInfo, + repository: RepositoryService.RepositoryInfo, enableWikiLink: Boolean, enableRefsLink: Boolean, enableTaskList: 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 val s = if(enableRefsLink){ @@ -45,8 +46,8 @@ object Markdown { } class GitBucketLinkRender( - context: app.Context, - repository: service.RepositoryService.RepositoryInfo, + context: Context, + repository: RepositoryService.RepositoryInfo, enableWikiLink: Boolean, pages: List[String]) extends LinkRenderer with WikiService { @@ -96,13 +97,13 @@ class GitBucketVerbatimSerializer extends VerbatimSerializer { class GitBucketHtmlSerializer( markdown: String, - repository: service.RepositoryService.RepositoryInfo, + repository: RepositoryService.RepositoryInfo, enableWikiLink: Boolean, enableRefsLink: Boolean, enableTaskList: Boolean, hasWritePermission: Boolean, pages: List[String] - )(implicit val context: app.Context) extends ToHtmlSerializer( + )(implicit val context: Context) extends ToHtmlSerializer( new GitBucketLinkRender(context, repository, enableWikiLink, pages), Map[String, VerbatimSerializer](VerbatimSerializer.DEFAULT -> new GitBucketVerbatimSerializer).asJava ) with LinkConverter with RequestCache { diff --git a/src/main/scala/view/Pagination.scala b/src/main/scala/gitbucket/core/view/Pagination.scala similarity index 97% rename from src/main/scala/view/Pagination.scala rename to src/main/scala/gitbucket/core/view/Pagination.scala index 8f2b62de4..ad9136804 100644 --- a/src/main/scala/view/Pagination.scala +++ b/src/main/scala/gitbucket/core/view/Pagination.scala @@ -1,4 +1,4 @@ -package view +package gitbucket.core.view /** * Provides control information for pagination. diff --git a/src/main/scala/view/helpers.scala b/src/main/scala/gitbucket/core/view/helpers.scala similarity index 88% rename from src/main/scala/view/helpers.scala rename to src/main/scala/gitbucket/core/view/helpers.scala index 1f2b406ac..69a29653e 100644 --- a/src/main/scala/view/helpers.scala +++ b/src/main/scala/gitbucket/core/view/helpers.scala @@ -1,10 +1,17 @@ -package view -import java.util.{Locale, Date, TimeZone} +package gitbucket.core.view + import java.text.SimpleDateFormat +import java.util.{Date, Locale, TimeZone} + +import gitbucket.core.controller.Context +import gitbucket.core.model.CommitState +import gitbucket.core.service.{RepositoryService, RequestCache} +import gitbucket.core.util.{JGitUtil, StringUtil} + import play.twirl.api.Html -import util.StringUtil -import service.RequestCache -import model.CommitState + + + /** * Provides helper methods for Twirl templates. @@ -76,7 +83,7 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache def plural(count: Int, singular: String, plural: String = ""): String = 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( ".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)) @@ -88,17 +95,17 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache * Converts Markdown of Wiki pages to HTML. */ def markdown(value: String, - repository: service.RepositoryService.RepositoryInfo, + repository: RepositoryService.RepositoryInfo, enableWikiLink: Boolean, enableRefsLink: Boolean, enableTaskList: 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)) def renderMarkup(filePath: List[String], fileContent: String, branch: String, - repository: service.RepositoryService.RepositoryInfo, - enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: app.Context): Html = { + repository: RepositoryService.RepositoryInfo, + enableWikiLink: Boolean, enableRefsLink: Boolean)(implicit context: Context): Html = { val fileNameLower = filePath.reverse.head.toLowerCase renderersBySuffix.find { case (suffix, _) => fileNameLower.endsWith(suffix) } match { @@ -115,20 +122,20 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache * Returns <img> 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. */ - 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) /** * Returns <img> 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. */ - 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) /** * 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)) def cut(value: String, length: Int): String = @@ -148,7 +155,7 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache /** * 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 .replaceAll("\\[issue:([^\\s]+?)/([^\\s]+?)#((\\d+))\\]" , s"""$$1/$$2#$$3""") .replaceAll("\\[pullreq:([^\\s]+?)/([^\\s]+?)#((\\d+))\\]" , s"""$$1/$$2#$$3""") @@ -171,34 +178,34 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache /** * 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}" /** * 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. */ - 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. * 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)) /** * Generates the avatar link to the account page. * 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)) - 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){ getAccountByUserName(userName) } else { diff --git a/src/main/scala/util/RepoitoryName.scala b/src/main/scala/util/RepoitoryName.scala deleted file mode 100644 index 0e6edbf0c..000000000 --- a/src/main/scala/util/RepoitoryName.scala +++ /dev/null @@ -1,18 +0,0 @@ -package util - -case class RepositoryName(owner:String, name:String){ - val fullName = s"${owner}/${name}" -} - -object RepositoryName{ - def apply(fullName: String): RepositoryName = { - fullName.split("/").toList match { - case owner :: name :: Nil => RepositoryName(owner, name) - case _ => throw new IllegalArgumentException(s"${fullName} is not repositoryName (only 'owner/name')") - } - } - def apply(repository: model.Repository): RepositoryName = RepositoryName(repository.userName, repository.repositoryName) - def apply(repository: util.JGitUtil.RepositoryInfo): RepositoryName = RepositoryName(repository.owner, repository.name) - def apply(repository: service.RepositoryService.RepositoryInfo): RepositoryName = RepositoryName(repository.owner, repository.name) - def apply(repository: model.CommitStatus): RepositoryName = RepositoryName(repository.userName, repository.repositoryName) -} diff --git a/src/main/twirl/error.scala.html b/src/main/twirl/error.scala.html deleted file mode 100644 index fc4a0115e..000000000 --- a/src/main/twirl/error.scala.html +++ /dev/null @@ -1,4 +0,0 @@ -@(title: String)(implicit context: app.Context) -@main("Error"){ -

@title

-} \ No newline at end of file diff --git a/src/main/twirl/account/activity.scala.html b/src/main/twirl/gitbucket/core/account/activity.scala.html similarity index 53% rename from src/main/twirl/account/activity.scala.html rename to src/main/twirl/gitbucket/core/account/activity.scala.html index ca4c3c70c..24d2c28a0 100644 --- a/src/main/twirl/account/activity.scala.html +++ b/src/main/twirl/gitbucket/core/account/activity.scala.html @@ -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 view.helpers._ +@import gitbucket.core.view.helpers._ @main(account, groupNames, "activity"){
activities diff --git a/src/main/twirl/account/application.scala.html b/src/main/twirl/gitbucket/core/account/application.scala.html similarity index 89% rename from src/main/twirl/account/application.scala.html rename to src/main/twirl/gitbucket/core/account/application.scala.html index e6a5d0664..ba8915e34 100644 --- a/src/main/twirl/account/application.scala.html +++ b/src/main/twirl/gitbucket/core/account/application.scala.html @@ -1,6 +1,8 @@ -@(account: model.Account, personalTokens: List[model.AccessToken], gneratedToken:Option[(model.AccessToken, String)])(implicit context: app.Context) +@(account: gitbucket.core.model.Account, + personalTokens: List[gitbucket.core.model.AccessToken], + gneratedToken: Option[(gitbucket.core.model.AccessToken, String)])(implicit context: gitbucket.core.controller.Context) @import context._ -@import view.helpers._ +@import gitbucket.core.view.helpers._ @html.main("Applications"){
diff --git a/src/main/twirl/account/edit.scala.html b/src/main/twirl/gitbucket/core/account/edit.scala.html similarity index 92% rename from src/main/twirl/account/edit.scala.html rename to src/main/twirl/gitbucket/core/account/edit.scala.html index 32055aba1..c49d48261 100644 --- a/src/main/twirl/account/edit.scala.html +++ b/src/main/twirl/gitbucket/core/account/edit.scala.html @@ -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 view.helpers._ -@import util.LDAPUtil +@import gitbucket.core.view.helpers._ @html.main("Edit your profile"){
@@ -22,7 +22,7 @@ - + } diff --git a/src/main/twirl/account/group.scala.html b/src/main/twirl/gitbucket/core/account/group.scala.html similarity index 96% rename from src/main/twirl/account/group.scala.html rename to src/main/twirl/gitbucket/core/account/group.scala.html index d6d7cf65e..921beb266 100644 --- a/src/main/twirl/account/group.scala.html +++ b/src/main/twirl/gitbucket/core/account/group.scala.html @@ -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 view.helpers._ +@import gitbucket.core.view.helpers._ @html.main(if(account.isEmpty) "Create group" else "Edit group"){
diff --git a/src/main/twirl/account/main.scala.html b/src/main/twirl/gitbucket/core/account/main.scala.html similarity index 93% rename from src/main/twirl/account/main.scala.html rename to src/main/twirl/gitbucket/core/account/main.scala.html index 2e148fe16..b4467f9aa 100644 --- a/src/main/twirl/account/main.scala.html +++ b/src/main/twirl/gitbucket/core/account/main.scala.html @@ -1,7 +1,7 @@ -@(account: model.Account, groupNames: List[String], active: String, - isGroupManager: Boolean = false)(body: Html)(implicit context: app.Context) +@(account: gitbucket.core.model.Account, groupNames: List[String], active: String, + isGroupManager: Boolean = false)(body: Html)(implicit context: gitbucket.core.controller.Context) @import context._ -@import view.helpers._ +@import gitbucket.core.view.helpers._ @html.main(account.userName){
diff --git a/src/main/twirl/account/members.scala.html b/src/main/twirl/gitbucket/core/account/members.scala.html similarity index 63% rename from src/main/twirl/account/members.scala.html rename to src/main/twirl/gitbucket/core/account/members.scala.html index 0e21d0102..029122319 100644 --- a/src/main/twirl/account/members.scala.html +++ b/src/main/twirl/gitbucket/core/account/members.scala.html @@ -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 view.helpers._ +@import gitbucket.core.view.helpers._ @main(account, Nil, "members", isGroupManager){ @if(members.isEmpty){ No members diff --git a/src/main/twirl/account/menu.scala.html b/src/main/twirl/gitbucket/core/account/menu.scala.html similarity index 85% rename from src/main/twirl/account/menu.scala.html rename to src/main/twirl/gitbucket/core/account/menu.scala.html index 914a92b04..47734f949 100644 --- a/src/main/twirl/account/menu.scala.html +++ b/src/main/twirl/gitbucket/core/account/menu.scala.html @@ -1,4 +1,4 @@ -@(active: String, ssh: Boolean)(implicit context: app.Context) +@(active: String, ssh: Boolean)(implicit context: gitbucket.core.controller.Context) @import context._