}
@@ -64,4 +62,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/twirl/gitbucket/core/settings/branchprotection.scala.html b/src/main/twirl/gitbucket/core/settings/branchprotection.scala.html
index 9fb7137ae..5bd54131d 100644
--- a/src/main/twirl/gitbucket/core/settings/branchprotection.scala.html
+++ b/src/main/twirl/gitbucket/core/settings/branchprotection.scala.html
@@ -33,30 +33,30 @@
Sorry, we couldn’t find any status checks in the last week for this repository.
Please create a commit status by API (Learn more about status checks on GitHub)
- }else{
-
-
-
Choose which status checks must pass before branches can be merged into @branch.
-
- @knownContexts.map { context =>
-
-
-
- }
+ } else {
+
+
+
Choose which status checks must pass before branches can be merged into @branch.
+
+ @knownContexts.map { context =>
+
+
+
+ }
+
+
+
+
+
+
Enforce required status checks for repository administrators.
-
-
-
-
Enforce required status checks for repository administrators.
-
-
}
diff --git a/src/main/webapp/assets/common/css/gitbucket.css b/src/main/webapp/assets/common/css/gitbucket.css
index 6d09e9ec3..1ffeb38ee 100644
--- a/src/main/webapp/assets/common/css/gitbucket.css
+++ b/src/main/webapp/assets/common/css/gitbucket.css
@@ -469,20 +469,6 @@ table.branches>thead>tr>th, table.branches>tbody>tr>td{
color: #aaa;
line-height: 20px;
}
-.branches .branch-action{
- /*float: right;*/
- text-align: right;
- height: 20px;
-}
-.branches .branch-action a {
- font-size: 100%;
-}
-.branches .branch-action a.btn {
- font-size: 100%;
- position: relative;
- top: -6px;
-}
-
.branches .branch-a-b-count{
color: rgba(0,0,0,0.5);
}
From 3e4e278778a6e8a143b7c6da7a0a320e3f4b0d0e Mon Sep 17 00:00:00 2001
From: KOUNOIKE Yuusuke
Date: Mon, 13 Mar 2017 23:58:49 +0900
Subject: [PATCH 006/165] Add Cache-Control header for _avatar and
/plugin-assets contents for reduce network connection and CPU usage.
---
src/main/scala/gitbucket/core/controller/AccountController.scala | 1 +
src/main/scala/gitbucket/core/servlet/PluginAssetsServlet.scala | 1 +
2 files changed, 2 insertions(+)
diff --git a/src/main/scala/gitbucket/core/controller/AccountController.scala b/src/main/scala/gitbucket/core/controller/AccountController.scala
index 19c553a41..3d449f84e 100644
--- a/src/main/scala/gitbucket/core/controller/AccountController.scala
+++ b/src/main/scala/gitbucket/core/controller/AccountController.scala
@@ -149,6 +149,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
get("/:userName/_avatar"){
val userName = params("userName")
+ response.setHeader("Cache-Control", "max-age=3600")
getAccountByUserName(userName).flatMap(_.image).map { image =>
RawData(FileUtil.getMimeType(image), new java.io.File(getUserUploadDir(userName), image))
} getOrElse {
diff --git a/src/main/scala/gitbucket/core/servlet/PluginAssetsServlet.scala b/src/main/scala/gitbucket/core/servlet/PluginAssetsServlet.scala
index 0d43af3b1..6fe1ed34e 100644
--- a/src/main/scala/gitbucket/core/servlet/PluginAssetsServlet.scala
+++ b/src/main/scala/gitbucket/core/servlet/PluginAssetsServlet.scala
@@ -26,6 +26,7 @@ class PluginAssetsServlet extends HttpServlet {
val bytes = IOUtils.toByteArray(in)
resp.setContentLength(bytes.length)
resp.setContentType(FileUtil.getContentType(path, bytes))
+ resp.setHeader("Cache-Control", "max-age=3600")
resp.getOutputStream.write(bytes)
} finally {
in.close()
From f4da49b5bd2a80fd1351930541265d0f5f8d1382 Mon Sep 17 00:00:00 2001
From: Naoki Takezoe
Date: Tue, 14 Mar 2017 02:17:34 +0900
Subject: [PATCH 007/165] (#1490)Use java.util.Base64 instead of sun.misc or
commons-codec
---
src/main/scala/gitbucket/core/api/ApiContents.scala | 5 +++--
src/main/scala/gitbucket/core/plugin/PluginRegistory.scala | 4 ++--
src/main/scala/gitbucket/core/ssh/SshUtil.scala | 4 ++--
src/main/scala/gitbucket/core/util/AuthUtil.scala | 5 +++--
src/main/scala/gitbucket/core/util/StringUtil.scala | 6 +++---
5 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/src/main/scala/gitbucket/core/api/ApiContents.scala b/src/main/scala/gitbucket/core/api/ApiContents.scala
index 1d5753b13..8b3735ab0 100644
--- a/src/main/scala/gitbucket/core/api/ApiContents.scala
+++ b/src/main/scala/gitbucket/core/api/ApiContents.scala
@@ -1,8 +1,9 @@
package gitbucket.core.api
+import java.util.Base64
+
import gitbucket.core.util.JGitUtil.FileInfo
import gitbucket.core.util.RepositoryName
-import org.apache.commons.codec.binary.Base64
case class ApiContents(
`type`: String,
@@ -20,7 +21,7 @@ object ApiContents{
ApiContents("dir", fileInfo.name, fileInfo.path, fileInfo.commitId, None, None)(repositoryName)
} else {
content.map(arr =>
- ApiContents("file", fileInfo.name, fileInfo.path, fileInfo.commitId, Some(Base64.encodeBase64String(arr)), Some("base64"))(repositoryName)
+ ApiContents("file", fileInfo.name, fileInfo.path, fileInfo.commitId, Some(Base64.getEncoder.encodeToString(arr)), Some("base64"))(repositoryName)
).getOrElse(ApiContents("file", fileInfo.name, fileInfo.path, fileInfo.commitId, None, None)(repositoryName))
}
}
diff --git a/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala
index 7ba1026e6..b299004be 100644
--- a/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala
+++ b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala
@@ -2,6 +2,7 @@ package gitbucket.core.plugin
import java.io.{File, FilenameFilter, InputStream}
import java.net.URLClassLoader
+import java.util.Base64
import javax.servlet.ServletContext
import gitbucket.core.controller.{Context, ControllerBase}
@@ -15,7 +16,6 @@ import gitbucket.core.util.Directory._
import io.github.gitbucket.solidbase.Solidbase
import io.github.gitbucket.solidbase.manager.JDBCVersionManager
import io.github.gitbucket.solidbase.model.Module
-import org.apache.commons.codec.binary.{Base64, StringUtils}
import org.slf4j.LoggerFactory
import scala.collection.mutable
@@ -54,7 +54,7 @@ class PluginRegistry {
def getPlugins(): List[PluginInfo] = plugins.toList
def addImage(id: String, bytes: Array[Byte]): Unit = {
- val encoded = StringUtils.newStringUtf8(Base64.encodeBase64(bytes, false))
+ val encoded = Base64.getEncoder.encodeToString(bytes)
images += ((id, encoded))
}
diff --git a/src/main/scala/gitbucket/core/ssh/SshUtil.scala b/src/main/scala/gitbucket/core/ssh/SshUtil.scala
index 42167edfa..62eb97a7b 100644
--- a/src/main/scala/gitbucket/core/ssh/SshUtil.scala
+++ b/src/main/scala/gitbucket/core/ssh/SshUtil.scala
@@ -1,8 +1,8 @@
package gitbucket.core.ssh
import java.security.PublicKey
+import java.util.Base64
-import org.apache.commons.codec.binary.Base64
import org.apache.sshd.common.config.keys.KeyUtils
import org.apache.sshd.common.util.buffer.ByteArrayBuffer
import org.eclipse.jgit.lib.Constants
@@ -22,7 +22,7 @@ object SshUtil {
}
try {
val encodedKey = parts(1)
- val decode = Base64.decodeBase64(Constants.encodeASCII(encodedKey))
+ val decode = Base64.getDecoder.decode(Constants.encodeASCII(encodedKey))
Some(new ByteArrayBuffer(decode).getRawPublicKey)
} catch {
case e: Throwable =>
diff --git a/src/main/scala/gitbucket/core/util/AuthUtil.scala b/src/main/scala/gitbucket/core/util/AuthUtil.scala
index 7a83c1387..5d937ca83 100644
--- a/src/main/scala/gitbucket/core/util/AuthUtil.scala
+++ b/src/main/scala/gitbucket/core/util/AuthUtil.scala
@@ -1,5 +1,6 @@
package gitbucket.core.util
+import java.util.Base64
import javax.servlet.http.HttpServletResponse
/**
@@ -13,9 +14,9 @@ object AuthUtil {
def decodeAuthHeader(header: String): String = {
try {
- new String(new sun.misc.BASE64Decoder().decodeBuffer(header.substring(6)))
+ new String(Base64.getDecoder.decode(header.substring(6)))
} catch {
case _: Throwable => ""
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/scala/gitbucket/core/util/StringUtil.scala b/src/main/scala/gitbucket/core/util/StringUtil.scala
index 587df3560..d1eadf3ec 100644
--- a/src/main/scala/gitbucket/core/util/StringUtil.scala
+++ b/src/main/scala/gitbucket/core/util/StringUtil.scala
@@ -1,12 +1,12 @@
package gitbucket.core.util
import java.net.{URLDecoder, URLEncoder}
+import java.util.Base64
import org.mozilla.universalchardet.UniversalDetector
import SyntaxSugars._
import org.apache.commons.io.input.BOMInputStream
import org.apache.commons.io.IOUtils
-import org.apache.commons.codec.binary.Base64
import scala.util.control.Exception._
@@ -34,14 +34,14 @@ object StringUtil {
val spec = new javax.crypto.spec.SecretKeySpec(BlowfishKey.getBytes(), "Blowfish")
val cipher = javax.crypto.Cipher.getInstance("Blowfish")
cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, spec)
- new String(Base64.encodeBase64(cipher.doFinal(value.getBytes("UTF-8"))), "UTF-8")
+ Base64.getEncoder.encodeToString(cipher.doFinal(value.getBytes("UTF-8")))
}
def decodeBlowfish(value: String): String = {
val spec = new javax.crypto.spec.SecretKeySpec(BlowfishKey.getBytes(), "Blowfish")
val cipher = javax.crypto.Cipher.getInstance("Blowfish")
cipher.init(javax.crypto.Cipher.DECRYPT_MODE, spec)
- new String(cipher.doFinal(Base64.decodeBase64(value)), "UTF-8")
+ new String(cipher.doFinal(Base64.getDecoder.decode(value)), "UTF-8")
}
def urlEncode(value: String): String = URLEncoder.encode(value, "UTF-8").replace("+", "%20")
From cdc8431865c8f56064c6e3e943451b7570ad83ab Mon Sep 17 00:00:00 2001
From: KOUNOIKE Yuusuke
Date: Tue, 14 Mar 2017 05:36:02 +0900
Subject: [PATCH 008/165] Add query parameter by updatedDate for _avatar image
for cache control.
---
.../scala/gitbucket/core/view/AvatarImageProvider.scala | 6 +++---
src/main/scala/gitbucket/core/view/helpers.scala | 5 +++++
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/main/scala/gitbucket/core/view/AvatarImageProvider.scala b/src/main/scala/gitbucket/core/view/AvatarImageProvider.scala
index 8d316ab3f..8cd64d01a 100644
--- a/src/main/scala/gitbucket/core/view/AvatarImageProvider.scala
+++ b/src/main/scala/gitbucket/core/view/AvatarImageProvider.scala
@@ -20,7 +20,7 @@ trait AvatarImageProvider { self: RequestCache =>
if(account.image.isEmpty && context.settings.gravatar){
s"""https://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress.toLowerCase)}?s=${size}&d=retro&r=g"""
} else {
- s"""${context.path}/${account.userName}/_avatar"""
+ s"""${context.path}/${account.userName}/_avatar?${helpers.hashDate(account.updatedDate)}"""
}
} getOrElse {
s"""${context.path}/_unknown/_avatar"""
@@ -31,7 +31,7 @@ trait AvatarImageProvider { self: RequestCache =>
if(account.image.isEmpty && context.settings.gravatar){
s"""https://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress.toLowerCase)}?s=${size}&d=retro&r=g"""
} else {
- s"""${context.path}/${account.userName}/_avatar"""
+ s"""${context.path}/${account.userName}/_avatar?${helpers.hashDate(account.updatedDate)}"""
}
} getOrElse {
if(context.settings.gravatar){
@@ -49,4 +49,4 @@ trait AvatarImageProvider { self: RequestCache =>
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/scala/gitbucket/core/view/helpers.scala b/src/main/scala/gitbucket/core/view/helpers.scala
index dc4e1c128..a60dcbb86 100644
--- a/src/main/scala/gitbucket/core/view/helpers.scala
+++ b/src/main/scala/gitbucket/core/view/helpers.scala
@@ -74,6 +74,11 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
*/
def date(date: Date): String = new SimpleDateFormat("yyyy-MM-dd").format(date)
+ /**
+ * Format java.util.Date to "yyyyMMDDHHmmss" (for url hash ex. /some/path.css?19800101010203
+ */
+ def hashDate(date: Date): String = new SimpleDateFormat("yyyyMMddHHmmss").format(date)
+
/**
* Returns singular if count is 1, otherwise plural.
* If plural is not specified, returns singular + "s" as plural.
From 8fa3bf785071923f121555235656a77ff60463e9 Mon Sep 17 00:00:00 2001
From: KOUNOIKE Yuusuke
Date: Tue, 14 Mar 2017 06:08:03 +0900
Subject: [PATCH 009/165] Change from Cache-Control based control to
Last-Modified based cache control for _avatar.
---
.../core/controller/AccountController.scala | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/src/main/scala/gitbucket/core/controller/AccountController.scala b/src/main/scala/gitbucket/core/controller/AccountController.scala
index 3d449f84e..86866e5cd 100644
--- a/src/main/scala/gitbucket/core/controller/AccountController.scala
+++ b/src/main/scala/gitbucket/core/controller/AccountController.scala
@@ -15,6 +15,7 @@ import io.github.gitbucket.scalatra.forms._
import org.apache.commons.io.FileUtils
import org.scalatra.i18n.Messages
import org.scalatra.BadRequest
+import java.util.Date
class AccountController extends AccountControllerBase
@@ -149,12 +150,17 @@ trait AccountControllerBase extends AccountManagementControllerBase {
get("/:userName/_avatar"){
val userName = params("userName")
- response.setHeader("Cache-Control", "max-age=3600")
- getAccountByUserName(userName).flatMap(_.image).map { image =>
- RawData(FileUtil.getMimeType(image), new java.io.File(getUserUploadDir(userName), image))
- } getOrElse {
- contentType = "image/png"
- Thread.currentThread.getContextClassLoader.getResourceAsStream("noimage.png")
+ (for {
+ account <- getAccountByUserName(userName)
+ image <- account.image
+ } yield (account, image)) match{
+ case Some((account, image)) =>
+ response.setDateHeader("Last-Modified", account.updatedDate.getTime)
+ RawData(FileUtil.getMimeType(image), new java.io.File(getUserUploadDir(userName), image))
+ case None =>
+ contentType = "image/png"
+ response.setDateHeader("Last-Modified", (new Date(0)).getTime)
+ Thread.currentThread.getContextClassLoader.getResourceAsStream("noimage.png")
}
}
From 131227615148b96115f0a48442f8f3775daaf975 Mon Sep 17 00:00:00 2001
From: KOUNOIKE Yuusuke
Date: Tue, 14 Mar 2017 06:48:35 +0900
Subject: [PATCH 010/165] Add query parameter for cache control. TODO:
PluginAssetsServlet should add Last-Modified header instead of Cache-Control
header.
---
.../scala/gitbucket/core/view/helpers.scala | 15 ++++++
.../gitbucket/core/helper/diff.scala.html | 4 +-
.../gitbucket/core/helper/preview.scala.html | 6 +--
.../twirl/gitbucket/core/index.scala.html | 2 +-
src/main/twirl/gitbucket/core/main.scala.html | 54 +++++++++----------
.../gitbucket/core/pulls/compare.scala.html | 2 +-
.../core/pulls/conversation.scala.html | 4 +-
.../gitbucket/core/repo/delete.scala.html | 6 +--
.../gitbucket/core/repo/editor.scala.html | 8 +--
.../gitbucket/core/repo/forked.scala.html | 4 +-
10 files changed, 60 insertions(+), 45 deletions(-)
diff --git a/src/main/scala/gitbucket/core/view/helpers.scala b/src/main/scala/gitbucket/core/view/helpers.scala
index a60dcbb86..f16e81c7f 100644
--- a/src/main/scala/gitbucket/core/view/helpers.scala
+++ b/src/main/scala/gitbucket/core/view/helpers.scala
@@ -79,6 +79,16 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
*/
def hashDate(date: Date): String = new SimpleDateFormat("yyyyMMddHHmmss").format(date)
+ /**
+ * java.util.Date of boot timestamp.
+ */
+ val bootDate: Date = new Date()
+
+ /**
+ * hashDate of bootDate for /assets, /plugin-assets
+ */
+ def hashQuery: String = hashDate(bootDate)
+
/**
* Returns singular if count is 1, otherwise plural.
* If plural is not specified, returns singular + "s" as plural.
@@ -216,6 +226,11 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
*/
def assets(implicit context: Context): String = s"${context.path}/assets"
+ /**
+ * Returns the url to the path of assets.
+ */
+ def assets(path: String)(implicit context: Context): String = s"${context.path}/assets${path}?${hashQuery}"
+
/**
* Generates the text link to the account page.
* If user does not exist or disabled, this method returns user name as text without link.
diff --git a/src/main/twirl/gitbucket/core/helper/diff.scala.html b/src/main/twirl/gitbucket/core/helper/diff.scala.html
index 17fdea22b..8217c3793 100644
--- a/src/main/twirl/gitbucket/core/helper/diff.scala.html
+++ b/src/main/twirl/gitbucket/core/helper/diff.scala.html
@@ -130,8 +130,8 @@