diff --git a/project/build.properties b/project/build.properties index a6e117b..817bc38 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=0.13.8 +sbt.version=0.13.9 diff --git a/sbt-launch-0.13.8.jar b/sbt-launch-0.13.8.jar deleted file mode 100644 index 0d9dd94..0000000 --- a/sbt-launch-0.13.8.jar +++ /dev/null Binary files differ diff --git a/sbt-launch-0.13.9.jar b/sbt-launch-0.13.9.jar new file mode 100644 index 0000000..c065b47 --- /dev/null +++ b/sbt-launch-0.13.9.jar Binary files differ diff --git a/sbt.bat b/sbt.bat index 3b0c31e..2c05152 100644 --- a/sbt.bat +++ b/sbt.bat @@ -1,2 +1,2 @@ set SCRIPT_DIR=%~dp0 -java %JAVA_OPTS% -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.8.jar" %* +java %JAVA_OPTS% -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.9.jar" %* diff --git a/sbt.sh b/sbt.sh index a9247ab..ea58042 100755 --- a/sbt.sh +++ b/sbt.sh @@ -1,2 +1,2 @@ #!/bin/sh -java $JAVA_OPTS -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.8.jar "$@" +java $JAVA_OPTS -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.9.jar "$@" diff --git a/src/main/scala/gitbucket/core/view/helpers.scala b/src/main/scala/gitbucket/core/view/helpers.scala index 33fdce9..570e9b1 100644 --- a/src/main/scala/gitbucket/core/view/helpers.scala +++ b/src/main/scala/gitbucket/core/view/helpers.scala @@ -225,6 +225,13 @@ def avatarLink(userName: String, size: Int, mailAddress: String = "", tooltip: Boolean = false)(implicit context: Context): Html = userWithContent(userName, mailAddress)(avatar(userName, size, tooltip, mailAddress)) + /** + * Generates the avatar link to the account page. + * If user does not exist or disabled, this method returns avatar image without link. + */ + def avatarLink(commit: JGitUtil.CommitInfo, size: Int)(implicit context: Context): Html = + userWithContent(commit.authorName, commit.authorEmailAddress)(avatar(commit, size)) + private def userWithContent(userName: String, mailAddress: String = "", styleClass: String = "")(content: Html)(implicit context: Context): Html = (if(mailAddress.isEmpty){ getAccountByUserName(userName) diff --git a/src/main/twirl/gitbucket/core/account/main.scala.html b/src/main/twirl/gitbucket/core/account/main.scala.html index 0e17090..dcf5a40 100644 --- a/src/main/twirl/gitbucket/core/account/main.scala.html +++ b/src/main/twirl/gitbucket/core/account/main.scala.html @@ -22,7 +22,7 @@
Groups
@groupNames.map { groupName => - @avatar(groupName, 36, tooltip = true) + @avatarLink(groupName, 36, tooltip = true) }
} diff --git a/src/main/twirl/gitbucket/core/helper/commitcomment.scala.html b/src/main/twirl/gitbucket/core/helper/commitcomment.scala.html index e26f9c4..73d938e 100644 --- a/src/main/twirl/gitbucket/core/helper/commitcomment.scala.html +++ b/src/main/twirl/gitbucket/core/helper/commitcomment.scala.html @@ -10,7 +10,7 @@ @if(comment.fileName.isDefined){filename="@comment.fileName.get"} @if(comment.newLine.isDefined){newline="@comment.newLine.get"} @if(comment.oldLine.isDefined){oldline="@comment.oldLine.get"}> -
@avatar(comment.commentedUserName, 48)
+
@avatarLink(comment.commentedUserName, 48)
@user(comment.commentedUserName, styleClass="username strong") diff --git a/src/main/twirl/gitbucket/core/issues/commentform.scala.html b/src/main/twirl/gitbucket/core/issues/commentform.scala.html index d6a63d1..c6b0f61 100644 --- a/src/main/twirl/gitbucket/core/issues/commentform.scala.html +++ b/src/main/twirl/gitbucket/core/issues/commentform.scala.html @@ -7,7 +7,7 @@ @if(loginAccount.isDefined){

-
@avatar(loginAccount.get.userName, 48)
+
@avatarLink(loginAccount.get.userName, 48)
@helper.html.preview( diff --git a/src/main/twirl/gitbucket/core/issues/commentlist.scala.html b/src/main/twirl/gitbucket/core/issues/commentlist.scala.html index d616cb5..8c63692 100644 --- a/src/main/twirl/gitbucket/core/issues/commentlist.scala.html +++ b/src/main/twirl/gitbucket/core/issues/commentlist.scala.html @@ -7,7 +7,7 @@ @import gitbucket.core.view.helpers._ @import gitbucket.core.model.CommitComment @if(issue.isDefined){ -
@avatar(issue.get.openedUserName, 48)
+
@avatarLink(issue.get.openedUserName, 48)
@user(issue.get.openedUserName, styleClass="username strong") commented @helper.html.datetimeago(issue.get.registeredDate) @@ -36,7 +36,7 @@ case comment: gitbucket.core.model.IssueComment => { @if(comment.action != "close" && comment.action != "reopen" && comment.action != "delete_branch" && comment.action != "commit" && comment.action != "refer"){ -
@avatar(comment.commentedUserName, 48)
+
@avatarLink(comment.commentedUserName, 48)
@user(comment.commentedUserName, styleClass="username strong") diff --git a/src/main/twirl/gitbucket/core/issues/create.scala.html b/src/main/twirl/gitbucket/core/issues/create.scala.html index 2da6bd4..6b2865d 100644 --- a/src/main/twirl/gitbucket/core/issues/create.scala.html +++ b/src/main/twirl/gitbucket/core/issues/create.scala.html @@ -10,7 +10,7 @@
-
@avatar(loginAccount.get.userName, 48)
+
@avatarLink(loginAccount.get.userName, 48)
diff --git a/src/main/twirl/gitbucket/core/pulls/commits.scala.html b/src/main/twirl/gitbucket/core/pulls/commits.scala.html index 72ecc9b..6ce399d 100644 --- a/src/main/twirl/gitbucket/core/pulls/commits.scala.html +++ b/src/main/twirl/gitbucket/core/pulls/commits.scala.html @@ -17,7 +17,7 @@
  • -
    @avatar(commit, 40)
    +
    @avatarLink(commit, 40)
    @link(commit.summary, repository) @if(commit.description.isDefined){ diff --git a/src/main/twirl/gitbucket/core/pulls/compare.scala.html b/src/main/twirl/gitbucket/core/pulls/compare.scala.html index 70dcfca..15d4015 100644 --- a/src/main/twirl/gitbucket/core/pulls/compare.scala.html +++ b/src/main/twirl/gitbucket/core/pulls/compare.scala.html @@ -55,7 +55,7 @@
    -
    @avatar(loginAccount.get.userName, 48)
    +
    @avatarLink(loginAccount.get.userName, 48)
    diff --git a/src/main/twirl/gitbucket/core/repo/commentform.scala.html b/src/main/twirl/gitbucket/core/repo/commentform.scala.html index 2aaa162..2535212 100644 --- a/src/main/twirl/gitbucket/core/repo/commentform.scala.html +++ b/src/main/twirl/gitbucket/core/repo/commentform.scala.html @@ -11,7 +11,7 @@ @if(!fileName.isDefined){

    } @if(!fileName.isDefined){ -
    @avatar(loginAccount.get.userName, 48)
    +
    @avatarLink(loginAccount.get.userName, 48)
    }
    diff --git a/src/main/twirl/gitbucket/core/repo/commits.scala.html b/src/main/twirl/gitbucket/core/repo/commits.scala.html index 66e7ba9..acfd460 100644 --- a/src/main/twirl/gitbucket/core/repo/commits.scala.html +++ b/src/main/twirl/gitbucket/core/repo/commits.scala.html @@ -46,7 +46,7 @@
  • -
    @avatar(commit, 40)
    +
    @avatarLink(commit, 40)
    @link(commit.summary, repository) @if(commit.description.isDefined){ diff --git a/src/main/twirl/gitbucket/core/repo/delete.scala.html b/src/main/twirl/gitbucket/core/repo/delete.scala.html index 0af5043..548cc32 100644 --- a/src/main/twirl/gitbucket/core/repo/delete.scala.html +++ b/src/main/twirl/gitbucket/core/repo/delete.scala.html @@ -33,7 +33,7 @@ -
    @avatar(loginAccount.get.userName, 48)
    +
    @avatarLink(loginAccount.get.userName, 48)
    diff --git a/src/main/twirl/gitbucket/core/repo/editor.scala.html b/src/main/twirl/gitbucket/core/repo/editor.scala.html index 27cf1ed..2096ed3 100644 --- a/src/main/twirl/gitbucket/core/repo/editor.scala.html +++ b/src/main/twirl/gitbucket/core/repo/editor.scala.html @@ -47,7 +47,7 @@ -
    @avatar(loginAccount.get.userName, 48)
    +
    @avatarLink(loginAccount.get.userName, 48)
    diff --git a/src/main/twirl/gitbucket/core/repo/forked.scala.html b/src/main/twirl/gitbucket/core/repo/forked.scala.html index 1767122..028c12b 100644 --- a/src/main/twirl/gitbucket/core/repo/forked.scala.html +++ b/src/main/twirl/gitbucket/core/repo/forked.scala.html @@ -13,7 +13,7 @@ @if(originRepository.isDefined){ @avatar(originRepository.get.owner, 20) - @originRepository.get.owner / @originRepository.get.name + @originRepository.get.owner / @originRepository.get.name } else { @avatar(repository.repository.originUserName.get, 20) diff --git a/src/main/webapp/assets/common/css/gitbucket.css b/src/main/webapp/assets/common/css/gitbucket.css index 7681543..5d65b07 100644 --- a/src/main/webapp/assets/common/css/gitbucket.css +++ b/src/main/webapp/assets/common/css/gitbucket.css @@ -1099,6 +1099,10 @@ background-color: #6cc644; } +.label-important { + background-color: #bd2c00; +} + ul.label-list { list-style-type: none; padding-left: 0px; diff --git a/src/test/scala/gitbucket/core/service/AccessTokenServiceSpec.scala b/src/test/scala/gitbucket/core/service/AccessTokenServiceSpec.scala index 460e020..2df4822 100644 --- a/src/test/scala/gitbucket/core/service/AccessTokenServiceSpec.scala +++ b/src/test/scala/gitbucket/core/service/AccessTokenServiceSpec.scala @@ -1,91 +1,78 @@ package gitbucket.core.service import gitbucket.core.model._ - -import org.specs2.mutable.Specification - -import java.util.Date +import org.scalatest.FunSuite -class AccessTokenServiceSpec extends Specification with ServiceSpecBase { +class AccessTokenServiceSpec extends FunSuite with ServiceSpecBase { - "AccessTokenService" should { - "generateAccessToken" in { withTestDB { implicit session => - AccessTokenService.generateAccessToken("root", "note") must be like{ - case (id, token) if id != 0 => ok - } - }} + test("generateAccessToken") { withTestDB { implicit session => + assert(AccessTokenService.generateAccessToken("root", "note") match { + case (id, token) => id != 0 + }) + }} - "getAccessTokens" in { withTestDB { implicit session => - val (id, token) = AccessTokenService.generateAccessToken("root", "note") - val tokenHash = AccessTokenService.tokenToHash(token) + test("getAccessTokens") { withTestDB { implicit session => + val (id, token) = AccessTokenService.generateAccessToken("root", "note") + val tokenHash = AccessTokenService.tokenToHash(token) - AccessTokenService.getAccessTokens("root") must be like{ - case List(AccessToken(`id`, "root", `tokenHash`, "note")) => ok - } - }} + assert(AccessTokenService.getAccessTokens("root") == List(AccessToken(`id`, "root", `tokenHash`, "note"))) + }} - "getAccessTokens(root) get root's tokens" in { withTestDB { implicit session => - val (id, token) = AccessTokenService.generateAccessToken("root", "note") - val tokenHash = AccessTokenService.tokenToHash(token) - val user2 = generateNewAccount("user2") - AccessTokenService.generateAccessToken("user2", "note2") + test("getAccessTokens(root) get root's tokens") { withTestDB { implicit session => + val (id, token) = AccessTokenService.generateAccessToken("root", "note") + val tokenHash = AccessTokenService.tokenToHash(token) + val user2 = generateNewAccount("user2") + AccessTokenService.generateAccessToken("user2", "note2") - AccessTokenService.getAccessTokens("root") must be like{ - case List(AccessToken(`id`, "root", `tokenHash`, "note")) => ok - } - }} + assert(AccessTokenService.getAccessTokens("root") == List(AccessToken(`id`, "root", `tokenHash`, "note"))) + }} - "deleteAccessToken" in { withTestDB { implicit session => - val (id, token) = AccessTokenService.generateAccessToken("root", "note") - val user2 = generateNewAccount("user2") - AccessTokenService.generateAccessToken("user2", "note2") + test("deleteAccessToken") { withTestDB { implicit session => + val (id, token) = AccessTokenService.generateAccessToken("root", "note") + val user2 = generateNewAccount("user2") + AccessTokenService.generateAccessToken("user2", "note2") - AccessTokenService.deleteAccessToken("root", id) + AccessTokenService.deleteAccessToken("root", id) - AccessTokenService.getAccessTokens("root") must beEmpty - }} + assert(AccessTokenService.getAccessTokens("root").isEmpty) + }} - "getAccountByAccessToken" in { withTestDB { implicit session => - val (id, token) = AccessTokenService.generateAccessToken("root", "note") - AccessTokenService.getAccountByAccessToken(token) must beSome.like { - case user => user.userName must_== "root" - } - }} + test("getAccountByAccessToken") { withTestDB { implicit session => + val (id, token) = AccessTokenService.generateAccessToken("root", "note") + assert(AccessTokenService.getAccountByAccessToken(token) match { + case Some(user) => user.userName == "root" + }) + }} - "getAccountByAccessToken don't get removed account" in { withTestDB { implicit session => - val user2 = generateNewAccount("user2") - val (id, token) = AccessTokenService.generateAccessToken("user2", "note") - AccountService.updateAccount(user2.copy(isRemoved=true)) + test("getAccountByAccessToken don't get removed account") { withTestDB { implicit session => + val user2 = generateNewAccount("user2") + val (id, token) = AccessTokenService.generateAccessToken("user2", "note") + AccountService.updateAccount(user2.copy(isRemoved=true)) - AccessTokenService.getAccountByAccessToken(token) must beEmpty - }} + assert(AccessTokenService.getAccountByAccessToken(token).isEmpty) + }} - "generateAccessToken create uniq token" in { withTestDB { implicit session => - val tokenIt = List("token1","token1","token1","token2").iterator - val service = new AccessTokenService{ - override def makeAccessTokenString:String = tokenIt.next - } + test("generateAccessToken create uniq token") { withTestDB { implicit session => + val tokenIt = List("token1","token1","token1","token2").iterator + val service = new AccessTokenService{ + override def makeAccessTokenString:String = tokenIt.next + } - service.generateAccessToken("root", "note1") must like{ - case (_, "token1") => ok - } - service.generateAccessToken("root", "note2") must like{ - case (_, "token2") => ok - } - }} + assert(service.generateAccessToken("root", "note1")._2 == "token1") + assert(service.generateAccessToken("root", "note2")._2 == "token2") + }} - "when update Account.userName then AccessToken.userName changed" in { withTestDB { implicit session => - val user2 = generateNewAccount("user2") - val (id, token) = AccessTokenService.generateAccessToken("user2", "note") - import gitbucket.core.model.Profile._ - import profile.simple._ - Accounts.filter(_.userName === "user2".bind).map(_.userName).update("user3") + test("when update Account.userName then AccessToken.userName changed") { withTestDB { implicit session => + val user2 = generateNewAccount("user2") + val (id, token) = AccessTokenService.generateAccessToken("user2", "note") + import gitbucket.core.model.Profile._ + import profile.simple._ + Accounts.filter(_.userName === "user2".bind).map(_.userName).update("user3") - AccessTokenService.getAccountByAccessToken(token) must beSome.like { - case user => user.userName must_== "user3" - } - }} - } + assert(AccessTokenService.getAccountByAccessToken(token) match { + case Some(user) => user.userName == "user3" + }) + }} } diff --git a/src/test/scala/gitbucket/core/service/AccountServiceSpec.scala b/src/test/scala/gitbucket/core/service/AccountServiceSpec.scala index 2e83d41..7516256 100644 --- a/src/test/scala/gitbucket/core/service/AccountServiceSpec.scala +++ b/src/test/scala/gitbucket/core/service/AccountServiceSpec.scala @@ -1,79 +1,71 @@ package gitbucket.core.service import gitbucket.core.model.{Account, GroupMember} -import org.specs2.mutable.Specification import java.util.Date +import org.scalatest.FunSuite -class AccountServiceSpec extends Specification with ServiceSpecBase { +class AccountServiceSpec extends FunSuite with ServiceSpecBase { - "AccountService" should { - val RootMailAddress = "root@localhost" + val RootMailAddress = "root@localhost" - "getAllUsers" in { withTestDB { implicit session => - AccountService.getAllUsers() must be like{ - case List(Account("root", "root", RootMailAddress, _, true, _, _, _, None, None, false, false)) => ok - } - }} + test("getAllUsers") { withTestDB { implicit session => + assert(AccountService.getAllUsers() match { + case List(Account("root", "root", RootMailAddress, _, true, _, _, _, None, None, false, false)) => true + case _ => false + }) + }} - "getAccountByUserName" in { withTestDB { implicit session => - AccountService.getAccountByUserName("root") must beSome.like { - case user => user.userName must_== "root" - } + test("getAccountByUserName") { withTestDB { implicit session => + assert(AccountService.getAccountByUserName("root").get.userName == "root") + assert(AccountService.getAccountByUserName("invalid user name").isEmpty) + }} - AccountService.getAccountByUserName("invalid user name") must beNone - }} + test("getAccountByMailAddress") { withTestDB { implicit session => + assert(AccountService.getAccountByMailAddress(RootMailAddress).isDefined) + }} - "getAccountByMailAddress" in { withTestDB { implicit session => - AccountService.getAccountByMailAddress(RootMailAddress) must beSome - }} + test("updateLastLoginDate") { withTestDB { implicit session => + val root = "root" + def user() = AccountService.getAccountByUserName(root).getOrElse(sys.error(s"user $root does not exists")) - "updateLastLoginDate" in { withTestDB { implicit session => - val root = "root" - def user() = - AccountService.getAccountByUserName(root).getOrElse(sys.error(s"user $root does not exists")) + assert(user().lastLoginDate.isEmpty) - user().lastLoginDate must beNone - val date1 = new Date - AccountService.updateLastLoginDate(root) - user().lastLoginDate must beSome.like{ case date => - date must be_>(date1) - } - val date2 = new Date - Thread.sleep(1000) - AccountService.updateLastLoginDate(root) - user().lastLoginDate must beSome.like{ case date => - date must be_>(date2) - } - }} + val date1 = new Date + AccountService.updateLastLoginDate(root) + assert(user().lastLoginDate.get.compareTo(date1) > 0) - "updateAccount" in { withTestDB { implicit session => - val root = "root" - def user() = - AccountService.getAccountByUserName(root).getOrElse(sys.error(s"user $root does not exists")) + val date2 = new Date + Thread.sleep(1000) + AccountService.updateLastLoginDate(root) + assert(user().lastLoginDate.get.compareTo(date2) > 0) + }} - val newAddress = "new mail address" - AccountService.updateAccount(user().copy(mailAddress = newAddress)) - user().mailAddress must_== newAddress - }} + test("updateAccount") { withTestDB { implicit session => + val root = "root" + def user() = AccountService.getAccountByUserName(root).getOrElse(sys.error(s"user $root does not exists")) - "group" in { withTestDB { implicit session => - val group1 = "group1" - val user1 = "root" - AccountService.createGroup(group1, None) + val newAddress = "new mail address" + AccountService.updateAccount(user().copy(mailAddress = newAddress)) + assert(user().mailAddress == newAddress) + }} - AccountService.getGroupMembers(group1) must_== Nil - AccountService.getGroupsByUserName(user1) must_== Nil + test("group") { withTestDB { implicit session => + val group1 = "group1" + val user1 = "root" + AccountService.createGroup(group1, None) - AccountService.updateGroupMembers(group1, List((user1, true))) + assert(AccountService.getGroupMembers(group1) == Nil) + assert(AccountService.getGroupsByUserName(user1) == Nil) - AccountService.getGroupMembers(group1) must_== List(GroupMember(group1, user1, true)) - AccountService.getGroupsByUserName(user1) must_== List(group1) + AccountService.updateGroupMembers(group1, List((user1, true))) - AccountService.updateGroupMembers(group1, Nil) + assert(AccountService.getGroupMembers(group1) == List(GroupMember(group1, user1, true))) + assert(AccountService.getGroupsByUserName(user1) == List(group1)) - AccountService.getGroupMembers(group1) must_== Nil - AccountService.getGroupsByUserName(user1) must_== Nil - }} - } + AccountService.updateGroupMembers(group1, Nil) + + assert(AccountService.getGroupMembers(group1) == Nil) + assert(AccountService.getGroupsByUserName(user1) == Nil) + }} }