diff --git a/README.md b/README.md index 07314d8..f47318c 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ 2. Deploy it to the Servlet 3.0 container such as Tomcat 7.x, Jetty 8.x, GlassFish 3.x or higher. 3. Access **http://[hostname]:[port]/gitbucket/** using your web browser. +If you are using Gitbucket behind a webserver please make sure you have increased the **client_max_body_size** (on nignx) + The default administrator account is **root** and password is **root**. or you can start GitBucket by `java -jar gitbucket.war` without servlet container. In this case, GitBucket URL is **http://[hostname]:8080/**. You can specify following options. @@ -58,6 +60,16 @@ Release Notes -------- +### 1.12 - 29 Mar 2014 +- SSH repository access is available +- Allow users can create and management their groups +- Git submodule support +- Close issues via commit messages +- Show repository description below the name on repository page +- Fix presentation of the source viewer +- Upgrade to sbt 0.13 +- Fix some bugs + ### 1.11.1 - 06 Mar 2014 - Bug fix diff --git a/project/build.properties b/project/build.properties index db255c2..37b489c 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=0.12.3 \ No newline at end of file +sbt.version=0.13.1 diff --git a/project/build.scala b/project/build.scala index 82b4fbe..d2f2d1a 100644 --- a/project/build.scala +++ b/project/build.scala @@ -30,7 +30,7 @@ "org.scalatra" %% "scalatra-specs2" % ScalatraVersion % "test", "org.scalatra" %% "scalatra-json" % ScalatraVersion, "org.json4s" %% "json4s-jackson" % "3.2.5", - "jp.sf.amateras" %% "scalatra-forms" % "0.0.11", + "jp.sf.amateras" %% "scalatra-forms" % "0.0.14", "commons-io" % "commons-io" % "2.4", "org.pegdown" % "pegdown" % "1.4.1", "org.apache.commons" % "commons-compress" % "1.5", diff --git a/project/plugins.sbt b/project/plugins.sbt index 15ac806..7d7ab3e 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,9 +1,11 @@ -addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.2.0") +addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.4.0") -addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.5.1") +addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0") -addSbtPlugin("org.scalatra.sbt" % "scalatra-sbt" % "0.3.0") +addSbtPlugin("org.scalatra.sbt" % "scalatra-sbt" % "0.3.5") -addSbtPlugin("io.spray" % "sbt-twirl" % "0.6.1") +resolvers += "spray repo" at "http://repo.spray.io" -addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.2") +addSbtPlugin("io.spray" % "sbt-twirl" % "0.7.0") + +addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.4") diff --git a/sbt-launch-0.12.3.jar b/sbt-launch-0.12.3.jar deleted file mode 100644 index 672c26f..0000000 --- a/sbt-launch-0.12.3.jar +++ /dev/null Binary files differ diff --git a/sbt-launch-0.13.1.jar b/sbt-launch-0.13.1.jar new file mode 100644 index 0000000..5c7d052 --- /dev/null +++ b/sbt-launch-0.13.1.jar Binary files differ diff --git a/sbt.bat b/sbt.bat index 41a5c11..cd356dd 100644 --- a/sbt.bat +++ b/sbt.bat @@ -1,2 +1,2 @@ set SCRIPT_DIR=%~dp0 -java -Dsbt.log.noformat=true -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -Xss2M -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar "%SCRIPT_DIR%\sbt-launch-0.12.3.jar" %* +java -Dsbt.log.noformat=true -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -Xss2M -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar "%SCRIPT_DIR%\sbt-launch-0.13.1.jar" %* diff --git a/sbt.sh b/sbt.sh index cd2266f..86cf93e 100755 --- a/sbt.sh +++ b/sbt.sh @@ -1 +1 @@ -java -Dsbt.log.noformat=true -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -Xss2M -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar `dirname $0`/sbt-launch-0.12.3.jar "$@" +java -Dsbt.log.noformat=true -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -Xss2M -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar `dirname $0`/sbt-launch-0.13.1.jar "$@" diff --git a/src/main/scala/app/AccountController.scala b/src/main/scala/app/AccountController.scala index 71197b6..d19af7e 100644 --- a/src/main/scala/app/AccountController.scala +++ b/src/main/scala/app/AccountController.scala @@ -132,7 +132,7 @@ get("/:userName/_edit")(oneselfOnly { val userName = params("userName") getAccountByUserName(userName).map { x => - account.html.edit(x, loadSystemSettings(), flash.get("info")) + account.html.edit(x, flash.get("info")) } getOrElse NotFound }) @@ -176,7 +176,7 @@ get("/:userName/_ssh")(oneselfOnly { val userName = params("userName") getAccountByUserName(userName).map { x => - account.html.ssh(x, loadSystemSettings(), getPublicKeys(x.userName)) + account.html.ssh(x, getPublicKeys(x.userName)) } getOrElse NotFound }) @@ -194,7 +194,7 @@ }) get("/register"){ - if(loadSystemSettings().allowAccountRegistration){ + if(context.settings.allowAccountRegistration){ if(context.loginAccount.isDefined){ redirect("/") } else { @@ -204,7 +204,7 @@ } post("/register", newForm){ form => - if(loadSystemSettings().allowAccountRegistration){ + if(context.settings.allowAccountRegistration){ createAccount(form.userName, sha1(form.password), form.fullName, form.mailAddress, false, form.url) updateImage(form.userName, form.fileId, false) redirect("/signin") diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala index 4168a8d..d7d7171 100644 --- a/src/main/scala/app/ControllerBase.scala +++ b/src/main/scala/app/ControllerBase.scala @@ -36,18 +36,16 @@ if(path.startsWith("/console/")){ val account = httpRequest.getSession.getAttribute(Keys.Session.LoginAccount).asInstanceOf[Account] + val baseUrl = this.baseUrl(httpRequest) if(account == null){ // Redirect to login form - // TODO Should use the configured base url. - httpResponse.sendRedirect(context + "/signin?" + StringUtil.urlEncode(path)) + httpResponse.sendRedirect(baseUrl + "/signin?redirect=" + StringUtil.urlEncode(path)) } else if(account.isAdmin){ // H2 Console (administrators only) - // TODO Should use the configured base url. chain.doFilter(request, response) } else { // Redirect to dashboard - // TODO Should use the configured base url. - httpResponse.sendRedirect(context + "/") + httpResponse.sendRedirect(baseUrl + "/") } } else if(path.startsWith("/git/")){ // Git repository @@ -68,7 +66,7 @@ implicit def context: Context = { contextCache.get match { case null => { - val context = Context(loadSystemSettings().baseUrl.getOrElse(servletContext.getContextPath), LoginAccount, request) + val context = Context(loadSystemSettings(), LoginAccount, request) contextCache.set(context) context } @@ -138,10 +136,10 @@ /** * Context object for the current request. - * - * @param path the context path */ -case class Context(path: String, loginAccount: Option[Account], request: HttpServletRequest){ +case class Context(settings: SystemSettingsService.SystemSettings, loginAccount: Option[Account], request: HttpServletRequest){ + + lazy val path = settings.baseUrl.getOrElse(request.getServletContext.getContextPath) lazy val currentPath = request.getRequestURI.substring(request.getContextPath.length) diff --git a/src/main/scala/app/IndexController.scala b/src/main/scala/app/IndexController.scala index bb4544b..ef53064 100644 --- a/src/main/scala/app/IndexController.scala +++ b/src/main/scala/app/IndexController.scala @@ -22,7 +22,6 @@ html.index(getRecentActivities(), getVisibleRepositories(loginAccount, baseUrl), - loadSystemSettings(), loginAccount.map{ account => getUserRepositories(account.userName, baseUrl) }.getOrElse(Nil) ) } @@ -32,11 +31,11 @@ if(redirect.isDefined && redirect.get.startsWith("/")){ flash += Keys.Flash.Redirect -> redirect.get } - html.signin(loadSystemSettings()) + html.signin() } post("/signin", form){ form => - authenticate(loadSystemSettings(), form.userName, form.password) match { + authenticate(context.settings, form.userName, form.password) match { case Some(account) => signin(account) case None => redirect("/signin") } diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index 5454f94..1f5d831 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -65,7 +65,7 @@ repo.html.commits(if(path.isEmpty) Nil else path.split("/").toList, branchName, repository, logs.splitWith{ (commit1, commit2) => view.helpers.date(commit1.time) == view.helpers.date(commit2.time) - }, page, hasNext, loadSystemSettings()) + }, page, hasNext) case Left(_) => NotFound } } @@ -118,7 +118,7 @@ JGitUtil.ContentInfo(viewer, None) } - repo.html.blob(id, repository, path.split("/").toList, content, new JGitUtil.CommitInfo(revCommit), loadSystemSettings()) + repo.html.blob(id, repository, path.split("/").toList, content, new JGitUtil.CommitInfo(revCommit)) } } getOrElse NotFound } @@ -136,7 +136,7 @@ repo.html.commit(id, new JGitUtil.CommitInfo(revCommit), JGitUtil.getBranchesOfCommit(git, revCommit.getName), JGitUtil.getTagsOfCommit(git, revCommit.getName), - repository, diffs, oldCommitId, loadSystemSettings()) + repository, diffs, oldCommitId) } } } @@ -152,8 +152,7 @@ val revCommit = git.log.add(git.getRepository.resolve(branchName)).setMaxCount(1).call.iterator.next (branchName, revCommit.getCommitterIdent.getWhen) } - repo.html.branches(branchInfo, hasWritePermission(repository.owner, repository.name, context.loginAccount), - repository, loadSystemSettings()) + repo.html.branches(branchInfo, hasWritePermission(repository.owner, repository.name, context.loginAccount), repository) } }) @@ -176,14 +175,14 @@ * Displays tags. */ get("/:owner/:repository/tags")(referrersOnly { - repo.html.tags(_, loadSystemSettings()) + repo.html.tags(_) }) /** * Download repository contents as an archive. */ - get("/:owner/:repository/archive/:name")(referrersOnly { repository => - val name = params("name") + get("/:owner/:repository/archive/*")(referrersOnly { repository => + val name = multiParams("splat").head if(name.endsWith(".zip")){ val revision = name.replaceFirst("\\.zip$", "") @@ -194,7 +193,7 @@ workDir.mkdirs val zipFile = new File(workDir, repository.name + "-" + - (if(revision.length == 40) revision.substring(0, 10) else revision) + ".zip") + (if(revision.length == 40) revision.substring(0, 10) else revision).replace('/', '_') + ".zip") using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git => val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(revision)) @@ -209,7 +208,7 @@ while(walk.next){ val name = walk.getPathString val mode = walk.getFileMode(0) - if(mode == FileMode.REGULAR_FILE){ + if(mode == FileMode.REGULAR_FILE || mode == FileMode.EXECUTABLE_FILE){ walk.getObjectId(objectId, 0) val entry = new ZipEntry(name) val loader = reader.open(objectId) @@ -285,7 +284,7 @@ repo.html.files(revision, repository, if(path == ".") Nil else path.split("/").toList, // current path new JGitUtil.CommitInfo(revCommit), // latest commit - files, readme, loadSystemSettings()) + files, readme) } } getOrElse NotFound } diff --git a/src/main/scala/app/SystemSettingsController.scala b/src/main/scala/app/SystemSettingsController.scala index 4b28e4c..054d78b 100644 --- a/src/main/scala/app/SystemSettingsController.scala +++ b/src/main/scala/app/SystemSettingsController.scala @@ -7,10 +7,10 @@ import ssh.SshServer class SystemSettingsController extends SystemSettingsControllerBase - with SystemSettingsService with AccountService with AdminAuthenticator + with AccountService with AdminAuthenticator trait SystemSettingsControllerBase extends ControllerBase { - self: SystemSettingsService with AccountService with AdminAuthenticator => + self: AccountService with AdminAuthenticator => private val form = mapping( "baseUrl" -> trim(label("Base URL", optional(text()))), @@ -50,7 +50,7 @@ get("/admin/system")(adminOnly { - admin.html.system(loadSystemSettings(), flash.get("info")) + admin.html.system(flash.get("info")) }) post("/admin/system", form)(adminOnly { form => diff --git a/src/main/scala/app/WikiController.scala b/src/main/scala/app/WikiController.scala index 1f9d239..07208a5 100644 --- a/src/main/scala/app/WikiController.scala +++ b/src/main/scala/app/WikiController.scala @@ -36,7 +36,7 @@ get("/:owner/:repository/wiki")(referrersOnly { repository => getWikiPage(repository.owner, repository.name, "Home").map { page => - wiki.html.page("Home", page, repository, hasWritePermission(repository.owner, repository.name, context.loginAccount), loadSystemSettings()) + wiki.html.page("Home", page, repository, hasWritePermission(repository.owner, repository.name, context.loginAccount)) } getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/Home/_edit") }) @@ -44,7 +44,7 @@ val pageName = StringUtil.urlDecode(params("page")) getWikiPage(repository.owner, repository.name, pageName).map { page => - wiki.html.page(pageName, page, repository, hasWritePermission(repository.owner, repository.name, context.loginAccount), loadSystemSettings()) + wiki.html.page(pageName, page, repository, hasWritePermission(repository.owner, repository.name, context.loginAccount)) } getOrElse redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(pageName)}/_edit") }) @@ -53,7 +53,7 @@ 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, loadSystemSettings()) + case Right((logs, hasNext)) => wiki.html.history(Some(pageName), logs, repository) case Left(_) => NotFound } } @@ -65,7 +65,7 @@ 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, - hasWritePermission(repository.owner, repository.name, context.loginAccount), loadSystemSettings(), flash.get("info")) + hasWritePermission(repository.owner, repository.name, context.loginAccount), flash.get("info")) } }) @@ -74,7 +74,7 @@ using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))){ git => wiki.html.compare(None, from, to, JGitUtil.getDiffs(git, from, to, true), repository, - hasWritePermission(repository.owner, repository.name, context.loginAccount), loadSystemSettings(), flash.get("info")) + hasWritePermission(repository.owner, repository.name, context.loginAccount), flash.get("info")) } }) @@ -103,7 +103,7 @@ 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, loadSystemSettings()) + wiki.html.edit(pageName, getWikiPage(repository.owner, repository.name, pageName), repository) }) post("/:owner/:repository/wiki/_edit", editForm)(collaboratorsOnly { (form, repository) => @@ -118,7 +118,7 @@ }) get("/:owner/:repository/wiki/_new")(collaboratorsOnly { - wiki.html.edit("", None, _, loadSystemSettings()) + wiki.html.edit("", None, _) }) post("/:owner/:repository/wiki/_new", newForm)(collaboratorsOnly { (form, repository) => @@ -146,13 +146,13 @@ get("/:owner/:repository/wiki/_pages")(referrersOnly { repository => wiki.html.pages(getWikiPageList(repository.owner, repository.name), repository, - hasWritePermission(repository.owner, repository.name, context.loginAccount), loadSystemSettings()) + 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, loadSystemSettings()) + case Right((logs, hasNext)) => wiki.html.history(None, logs, repository) case Left(_) => NotFound } } diff --git a/src/main/scala/service/RepositorySearchService.scala b/src/main/scala/service/RepositorySearchService.scala index 57265c8..33ec942 100644 --- a/src/main/scala/service/RepositorySearchService.scala +++ b/src/main/scala/service/RepositorySearchService.scala @@ -63,7 +63,8 @@ val list = new ListBuffer[(String, String)] while (treeWalk.next()) { - if(treeWalk.getFileMode(0) == FileMode.REGULAR_FILE){ + val mode = treeWalk.getFileMode(0) + if(mode == FileMode.REGULAR_FILE || mode == FileMode.EXECUTABLE_FILE){ JGitUtil.getContentFromId(git, treeWalk.getObjectId(0), false).foreach { bytes => if(FileUtil.isText(bytes)){ val text = StringUtil.convertFromByteArray(bytes) diff --git a/src/main/scala/service/RepositoryService.scala b/src/main/scala/service/RepositoryService.scala index 4c6abd1..38e7606 100644 --- a/src/main/scala/service/RepositoryService.scala +++ b/src/main/scala/service/RepositoryService.scala @@ -294,7 +294,7 @@ lazy val host = """^https?://(.+?)(:\d+)?/""".r.findFirstMatchIn(httpUrl).get.group(1) - def sshUrl(port: Int) = s"ssh://${host}:${port}/${owner}/${name}.git" + def sshUrl(port: Int, userName: String) = s"ssh://${userName}@${host}:${port}/${owner}/${name}.git" /** * Creates instance with issue count and pull request count. diff --git a/src/main/scala/service/RequestCache.scala b/src/main/scala/service/RequestCache.scala index 0f0b0f0..3747e85 100644 --- a/src/main/scala/service/RequestCache.scala +++ b/src/main/scala/service/RequestCache.scala @@ -1,7 +1,6 @@ package service import model._ -import service.SystemSettingsService.SystemSettings /** * This service is used for a view helper mainly. @@ -9,28 +8,23 @@ * It may be called many times in one request, so each method stores * its result into the cache which available during a request. */ -trait RequestCache { - - def getSystemSettings()(implicit context: app.Context): SystemSettings = - context.cache("system_settings"){ - new SystemSettingsService {}.loadSystemSettings() - } +trait RequestCache extends SystemSettingsService with AccountService with IssuesService { def getIssue(userName: String, repositoryName: String, issueId: String)(implicit context: app.Context): Option[Issue] = { context.cache(s"issue.${userName}/${repositoryName}#${issueId}"){ - new IssuesService {}.getIssue(userName, repositoryName, issueId) + super.getIssue(userName, repositoryName, issueId) } } def getAccountByUserName(userName: String)(implicit context: app.Context): Option[Account] = { context.cache(s"account.${userName}"){ - new AccountService {}.getAccountByUserName(userName) + super.getAccountByUserName(userName) } } def getAccountByMailAddress(mailAddress: String)(implicit context: app.Context): Option[Account] = { context.cache(s"account.${mailAddress}"){ - new AccountService {}.getAccountByMailAddress(mailAddress) + super.getAccountByMailAddress(mailAddress) } } } diff --git a/src/main/scala/service/WikiService.scala b/src/main/scala/service/WikiService.scala index fb19399..870fe20 100644 --- a/src/main/scala/service/WikiService.scala +++ b/src/main/scala/service/WikiService.scala @@ -43,8 +43,8 @@ def httpUrl(repository: RepositoryInfo) = repository.httpUrl.replaceFirst("\\.git\\Z", ".wiki.git") - def sshUrl(repository: RepositoryInfo, settings: SystemSettingsService.SystemSettings) = - repository.sshUrl(settings.sshPort.getOrElse(SystemSettingsService.DefaultSshPort)).replaceFirst("\\.git\\Z", ".wiki.git") + def sshUrl(repository: RepositoryInfo, settings: SystemSettingsService.SystemSettings, userName: String) = + repository.sshUrl(settings.sshPort.getOrElse(SystemSettingsService.DefaultSshPort), userName).replaceFirst("\\.git\\Z", ".wiki.git") } trait WikiService { diff --git a/src/main/scala/servlet/AutoUpdateListener.scala b/src/main/scala/servlet/AutoUpdateListener.scala index 830ca29..8cafb60 100644 --- a/src/main/scala/servlet/AutoUpdateListener.scala +++ b/src/main/scala/servlet/AutoUpdateListener.scala @@ -98,7 +98,7 @@ */ def getCurrentVersion(): Version = { if(versionFile.exists){ - FileUtils.readFileToString(versionFile, "UTF-8").split("\\.") match { + FileUtils.readFileToString(versionFile, "UTF-8").trim.split("\\.") match { case Array(majorVersion, minorVersion) => { versions.find { v => v.majorVersion == majorVersion.toInt && v.minorVersion == minorVersion.toInt diff --git a/src/main/scala/servlet/GitRepositoryServlet.scala b/src/main/scala/servlet/GitRepositoryServlet.scala index bb19aa5..60a5224 100644 --- a/src/main/scala/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/servlet/GitRepositoryServlet.scala @@ -99,12 +99,16 @@ using(Git.open(Directory.getRepositoryDir(owner, repository))) { git => commands.asScala.foreach { command => logger.debug(s"commandType: ${command.getType}, refName: ${command.getRefName}") - val commits = command.getType match { - case ReceiveCommand.Type.DELETE => Nil - case _ => JGitUtil.getCommitLog(git, command.getOldId.name, command.getNewId.name) - } val refName = command.getRefName.split("/") val branchName = refName.drop(2).mkString("/") + val commits = if (refName(1) == "tags") { + Nil + } else { + command.getType match { + case ReceiveCommand.Type.DELETE => Nil + case _ => JGitUtil.getCommitLog(git, command.getOldId.name, command.getNewId.name) + } + } // Extract new commit and apply issue comment val newCommits = if(commits.size > 1000){ diff --git a/src/main/scala/util/JGitUtil.scala b/src/main/scala/util/JGitUtil.scala index 0e2cb40..5ab4bf7 100644 --- a/src/main/scala/util/JGitUtil.scala +++ b/src/main/scala/util/JGitUtil.scala @@ -76,11 +76,7 @@ rev.getFullMessage, rev.getParents().map(_.name).toList) - val summary = defining(fullMessage.trim.indexOf("\n")){ i => - defining(if(i >= 0) fullMessage.trim.substring(0, i).trim else fullMessage){ firstLine => - if(firstLine.length > shortMessage.length) shortMessage else firstLine - } - } + val summary = getSummaryMessage(fullMessage, shortMessage) val description = defining(fullMessage.trim.indexOf("\n")){ i => if(i >= 0){ @@ -165,7 +161,7 @@ } } } - + /** * Returns the file list of the specified path. * @@ -220,16 +216,18 @@ val commits = getLatestCommitFromPaths(git, list.toList.map(_._3), revision) list.map { case (objectId, fileMode, path, name, linkUrl) => - FileInfo( - objectId, - fileMode == FileMode.TREE || fileMode == FileMode.GITLINK, - name, - commits(path).getCommitterIdent.getWhen, - commits(path).getShortMessage, - commits(path).getName, - commits(path).getCommitterIdent.getName, - commits(path).getCommitterIdent.getEmailAddress, - linkUrl) + defining(commits(path)){ commit => + FileInfo( + objectId, + fileMode == FileMode.TREE || fileMode == FileMode.GITLINK, + name, + commit.getCommitterIdent.getWhen, + getSummaryMessage(commit.getFullMessage, commit.getShortMessage), + commit.getName, + commit.getCommitterIdent.getName, + commit.getCommitterIdent.getEmailAddress, + linkUrl) + } }.sortWith { (file1, file2) => (file1.isDirectory, file2.isDirectory) match { case (true , false) => true @@ -238,7 +236,18 @@ } }.toList } - + + /** + * Returns the first line of the commit message. + */ + private def getSummaryMessage(fullMessage: String, shortMessage: String): String = { + defining(fullMessage.trim.indexOf("\n")){ i => + defining(if(i >= 0) fullMessage.trim.substring(0, i).trim else fullMessage){ firstLine => + if(firstLine.length > shortMessage.length) shortMessage else firstLine + } + } + } + /** * Returns the commit list of the specified branch. * diff --git a/src/main/scala/view/AvatarImageProvider.scala b/src/main/scala/view/AvatarImageProvider.scala index bcc2d6b..1dff9ab 100644 --- a/src/main/scala/view/AvatarImageProvider.scala +++ b/src/main/scala/view/AvatarImageProvider.scala @@ -16,7 +16,7 @@ val src = if(mailAddress.isEmpty){ // by user name getAccountByUserName(userName).map { account => - if(account.image.isEmpty && getSystemSettings().gravatar){ + if(account.image.isEmpty && context.settings.gravatar){ s"""https://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress.toLowerCase)}?s=${size}""" } else { s"""${context.path}/${account.userName}/_avatar""" @@ -27,13 +27,13 @@ } else { // by mail address getAccountByMailAddress(mailAddress).map { account => - if(account.image.isEmpty && getSystemSettings().gravatar){ + if(account.image.isEmpty && context.settings.gravatar){ s"""https://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress.toLowerCase)}?s=${size}""" } else { s"""${context.path}/${account.userName}/_avatar""" } } getOrElse { - if(getSystemSettings().gravatar){ + if(context.settings.gravatar){ s"""https://www.gravatar.com/avatar/${StringUtil.md5(mailAddress.toLowerCase)}?s=${size}""" } else { s"""${context.path}/_unknown/_avatar""" diff --git a/src/main/twirl/account/edit.scala.html b/src/main/twirl/account/edit.scala.html index f2c5c10..23d4882 100644 --- a/src/main/twirl/account/edit.scala.html +++ b/src/main/twirl/account/edit.scala.html @@ -1,4 +1,4 @@ -@(account: model.Account, settings: service.SystemSettingsService.SystemSettings, info: Option[Any])(implicit context: app.Context) +@(account: model.Account, info: Option[Any])(implicit context: app.Context) @import context._ @import view.helpers._ @import util.AccountUtil diff --git a/src/main/twirl/account/ssh.scala.html b/src/main/twirl/account/ssh.scala.html index 5d1817e..e6ee34c 100644 --- a/src/main/twirl/account/ssh.scala.html +++ b/src/main/twirl/account/ssh.scala.html @@ -1,4 +1,4 @@ -@(account: model.Account, settings: service.SystemSettingsService.SystemSettings, sshKeys: List[model.SshKey])(implicit context: app.Context) +@(account: model.Account, sshKeys: List[model.SshKey])(implicit context: app.Context) @import context._ @import view.helpers._ @html.main("SSH Keys"){ diff --git a/src/main/twirl/admin/system.scala.html b/src/main/twirl/admin/system.scala.html index 81fff5d..3ef154f 100644 --- a/src/main/twirl/admin/system.scala.html +++ b/src/main/twirl/admin/system.scala.html @@ -1,4 +1,4 @@ -@(settings: service.SystemSettingsService.SystemSettings, info: Option[Any])(implicit context: app.Context) +@(info: Option[Any])(implicit context: app.Context) @import context._ @import util.Directory._ @import view.helpers._ diff --git a/src/main/twirl/index.scala.html b/src/main/twirl/index.scala.html index c6e3de6..21db2e0 100644 --- a/src/main/twirl/index.scala.html +++ b/src/main/twirl/index.scala.html @@ -1,6 +1,5 @@ @(activities: List[model.Activity], recentRepositories: List[service.RepositoryService.RepositoryInfo], - systemSettings: service.SystemSettingsService.SystemSettings, userRepositories: List[service.RepositoryService.RepositoryInfo])(implicit context: app.Context) @import context._ @import view.helpers._ @@ -12,7 +11,7 @@