From dc78dc9b0dbc27418c42d2347681c22430c3ebfe Mon Sep 17 00:00:00 2001 From: odz Date: Sat, 30 Nov 2013 18:57:19 +0900 Subject: [PATCH 01/30] Close issues via commit messages --- src/main/scala/app/PullRequestsController.scala | 13 +++++++++++++ src/main/scala/service/IssuesService.scala | 12 ++++++++++++ src/main/scala/servlet/GitRepositoryServlet.scala | 8 ++++++++ 3 files changed, 33 insertions(+) diff --git a/src/main/scala/app/PullRequestsController.scala b/src/main/scala/app/PullRequestsController.scala index 365fb9270..e91ff786e 100644 --- a/src/main/scala/app/PullRequestsController.scala +++ b/src/main/scala/app/PullRequestsController.scala @@ -163,6 +163,19 @@ trait PullRequestsControllerBase extends ControllerBase { } } + // close issue by content of pull request + val defaultBranch = getRepository(owner, name, baseUrl).get.repository.defaultBranch + if(pullreq.branch == defaultBranch){ + commits.flatten.foreach { commit => + closeIssuesFromMessage(commit.fullMessage, loginAccount.userName, owner, name) + } + issue.content match { + case Some(content) => closeIssuesFromMessage(content, loginAccount.userName, owner, name) + case _ => + } + closeIssuesFromMessage(form.message, loginAccount.userName, owner, name) + } + // notifications Notifier().toNotify(repository, issueId, "merge"){ Notifier.msgStatus(s"${baseUrl}/${owner}/${name}/pull/${issueId}") diff --git a/src/main/scala/service/IssuesService.scala b/src/main/scala/service/IssuesService.scala index 493692e4d..ec6f93619 100644 --- a/src/main/scala/service/IssuesService.scala +++ b/src/main/scala/service/IssuesService.scala @@ -314,6 +314,18 @@ trait IssuesService { }.toList } + def closeIssuesFromMessage(message: String, userName: String, owner: String, repository: String) = { + val regex = "(?i)(? + getIssue(owner, repository, issueId) match { + case Some(issue) if !issue.closed => { + createComment(owner, repository, userName, issue.issueId, "Close", "close") + updateClosed(owner, repository, issue.issueId, true) + } + case _ => + } + } + } } object IssuesService { diff --git a/src/main/scala/servlet/GitRepositoryServlet.scala b/src/main/scala/servlet/GitRepositoryServlet.scala index a00a92811..4c02070de 100644 --- a/src/main/scala/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/servlet/GitRepositoryServlet.scala @@ -140,6 +140,14 @@ class CommitLogHook(owner: String, repository: String, userName: String, baseURL } } + // close issues + val defaultBranch = getRepository(owner, repository, baseURL).get.repository.defaultBranch + if(refName(1) == "heads" && branchName == defaultBranch && command.getType == ReceiveCommand.Type.UPDATE){ + git.log.addRange(command.getOldId, command.getNewId).call.asScala.foreach { commit => + closeIssuesFromMessage(commit.getFullMessage, userName, owner, repository) + } + } + // call web hook val webHookURLs = getWebHookURLs(owner, repository) if(webHookURLs.nonEmpty){ From 78073babe496a2232932c614b635c9305d9d1285 Mon Sep 17 00:00:00 2001 From: takezoe Date: Wed, 19 Feb 2014 03:19:34 +0900 Subject: [PATCH 02/30] (refs #231)Add anchor icon for headlines in Markdown. --- src/main/scala/view/Markdown.scala | 5 +++-- .../webapp/assets/common/css/gitbucket.css | 15 +++++++++++++ src/main/webapp/assets/common/images/link.png | Bin 0 -> 343 bytes src/main/webapp/assets/common/js/gitbucket.js | 20 ++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/main/webapp/assets/common/images/link.png diff --git a/src/main/scala/view/Markdown.scala b/src/main/scala/view/Markdown.scala index dba96703e..483f3ea5d 100644 --- a/src/main/scala/view/Markdown.scala +++ b/src/main/scala/view/Markdown.scala @@ -116,8 +116,9 @@ class GitBucketHtmlSerializer( val tag = s"h${node.getLevel}" val headerTextString = printChildrenToString(node) val anchorName = GitBucketHtmlSerializer.generateAnchorName(headerTextString) - printer.print(s"<$tag>") - printer.print(s"""""") + printer.print(s"""<$tag class="markdown-head">""") + printer.print(s"""""") + printer.print(s"""""") visitChildren(node) printer.print(s"") } diff --git a/src/main/webapp/assets/common/css/gitbucket.css b/src/main/webapp/assets/common/css/gitbucket.css index 4c69e737f..8df22fc6b 100644 --- a/src/main/webapp/assets/common/css/gitbucket.css +++ b/src/main/webapp/assets/common/css/gitbucket.css @@ -850,3 +850,18 @@ div.markdown-body table colgroup + tbody tr:first-child td:last-child { border-top-right-radius: 4px; -moz-border-radius-topright: 4px; } + +.markdown-head { + position: relative; +} + +a.markdown-anchor-link { + position: absolute; + top: 16px; + left: -20px; + width: 32px; + height: 16px; + background-image: url(../images/link.png); + background-repeat: no-repeat; + display: none; +} diff --git a/src/main/webapp/assets/common/images/link.png b/src/main/webapp/assets/common/images/link.png new file mode 100644 index 0000000000000000000000000000000000000000..25eacb7c2524142262d68bf729c5e2b61adfd6d4 GIT binary patch literal 343 zcmV-d0jU0oP)$`dXYaZs9=SbAto%g@>T~?_bH&lTUn@`uo|1bXE{eSR(AO)ESb=V4`uk}mK|39Px&03WLbv~pzk+s7D@lK^ zn+aB+sp)&Y_x-B3>;6ywU--WQNUr<8>TU0P-|L#1U&;A)67w(+> pDf@fM7q9#F25QXo3rUI;002ro52U44e~JJA002ovPDHLkV1l;_q@Mr) literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/common/js/gitbucket.js b/src/main/webapp/assets/common/js/gitbucket.js index 5c6233d0b..12e86fa2a 100644 --- a/src/main/webapp/assets/common/js/gitbucket.js +++ b/src/main/webapp/assets/common/js/gitbucket.js @@ -11,6 +11,26 @@ $(function(){ $('img[data-toggle=tooltip]').tooltip(); $('a[data-toggle=tooltip]').tooltip(); + // anchor icon for markdown + $('.markdown-head').mouseenter(function(e){ + $(e.target).children('a.markdown-anchor-link').show(); + }); + $('.markdown-head').mouseleave(function(e){ + var anchorLink = $(e.target).children('a.markdown-anchor-link'); + if(anchorLink.data('active') != true){ + anchorLink.hide(); + } + }); + + $('a.markdown-anchor-link').mouseenter(function(e){ + $(e.target).data('active', true); + }); + + $('a.markdown-anchor-link').mouseleave(function(e){ + $(e.target).data('active', false); + $(e.target).hide(); + }); + // syntax highlighting by google-code-prettify prettyPrint(); }); From 8536824d7e231bc8a66126c088cedfb0f84d2d9f Mon Sep 17 00:00:00 2001 From: takezoe Date: Wed, 19 Feb 2014 03:40:39 +0900 Subject: [PATCH 03/30] (refs #231)Fix anchor icon style and apply URL encoding to non-ascii chars in anchor name. --- src/main/scala/view/Markdown.scala | 4 +--- src/main/webapp/assets/common/css/gitbucket.css | 5 ++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/scala/view/Markdown.scala b/src/main/scala/view/Markdown.scala index 483f3ea5d..6b7ab2dc7 100644 --- a/src/main/scala/view/Markdown.scala +++ b/src/main/scala/view/Markdown.scala @@ -143,12 +143,10 @@ object GitBucketHtmlSerializer { private val Whitespace = "[\\s]".r - private val SpecialChars = "[^\\w-]".r - def generateAnchorName(text: String): String = { val noWhitespace = Whitespace.replaceAllIn(text, "-") val normalized = Normalizer.normalize(noWhitespace, Normalizer.Form.NFD) - val noSpecialChars = SpecialChars.replaceAllIn(normalized, "") + val noSpecialChars = StringUtil.urlEncode(normalized) noSpecialChars.toLowerCase(Locale.ENGLISH) } } diff --git a/src/main/webapp/assets/common/css/gitbucket.css b/src/main/webapp/assets/common/css/gitbucket.css index 8df22fc6b..01c96b414 100644 --- a/src/main/webapp/assets/common/css/gitbucket.css +++ b/src/main/webapp/assets/common/css/gitbucket.css @@ -857,7 +857,6 @@ div.markdown-body table colgroup + tbody tr:first-child td:last-child { a.markdown-anchor-link { position: absolute; - top: 16px; left: -20px; width: 32px; height: 16px; @@ -865,3 +864,7 @@ a.markdown-anchor-link { background-repeat: no-repeat; display: none; } + +h1 a.markdown-anchor-link, h2 a.markdown-anchor-link, h3 a.markdown-anchor-link { + top: 10px; +} From bb9a23fe0f9596c2f93703ca906d1ca638e70aa8 Mon Sep 17 00:00:00 2001 From: takezoe Date: Thu, 20 Feb 2014 03:40:06 +0900 Subject: [PATCH 04/30] Fix TestCase. --- src/test/scala/view/GitBucketHtmlSerializerSpec.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/scala/view/GitBucketHtmlSerializerSpec.scala b/src/test/scala/view/GitBucketHtmlSerializerSpec.scala index d82630d3b..946b62629 100644 --- a/src/test/scala/view/GitBucketHtmlSerializerSpec.scala +++ b/src/test/scala/view/GitBucketHtmlSerializerSpec.scala @@ -16,13 +16,13 @@ class GitBucketHtmlSerializerSpec extends Specification { "normalize characters with diacritics" in { val before = "Dónde estará mi vida" val after = generateAnchorName(before) - after mustEqual "donde-estara-mi-vida" + after mustEqual "do%cc%81nde-estara%cc%81-mi-vida" } "omit special characters" in { val before = "foo!bar@baz>9000" val after = generateAnchorName(before) - after mustEqual "foobarbaz9000" + after mustEqual "foo%21bar%40baz%3e9000" } } } From 7ba1f85d484bbccd0c09e33682048fbdd01586e4 Mon Sep 17 00:00:00 2001 From: takezoe Date: Fri, 21 Feb 2014 11:39:02 +0900 Subject: [PATCH 05/30] (refs #187)Repository icons are updated. --- etc/icons.svg | 242 +++++++++++++++++- src/main/twirl/header.scala.html | 11 +- src/main/twirl/index.scala.html | 22 +- src/main/twirl/newrepo.scala.html | 4 +- .../webapp/assets/common/images/repo_fork.png | Bin 0 -> 285 bytes .../assets/common/images/repo_private.png | Bin 0 -> 280 bytes .../assets/common/images/repo_public.png | Bin 0 -> 247 bytes 7 files changed, 260 insertions(+), 19 deletions(-) create mode 100644 src/main/webapp/assets/common/images/repo_fork.png create mode 100644 src/main/webapp/assets/common/images/repo_private.png create mode 100644 src/main/webapp/assets/common/images/repo_public.png diff --git a/etc/icons.svg b/etc/icons.svg index 6943304f2..c2efe0e4d 100644 --- a/etc/icons.svg +++ b/etc/icons.svg @@ -25,17 +25,17 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.4" - inkscape:cx="629.30023" - inkscape:cy="281.44758" + inkscape:cx="450.21999" + inkscape:cy="97.51519" inkscape:document-units="px" inkscape:current-layer="layer1-9" showgrid="false" inkscape:window-width="1366" - inkscape:window-height="705" - inkscape:window-x="-8" + inkscape:window-height="706" + inkscape:window-x="1912" inkscape:window-y="-8" inkscape:window-maximized="1" - inkscape:snap-global="true" + inkscape:snap-global="false" inkscape:snap-grids="false" inkscape:snap-page="false" inkscape:snap-bbox="true" @@ -746,6 +746,238 @@ d="m 937.41093,1044.4944 0,30.6797 -28.50183,0 0,41.2377 28.50183,0 0,27.1288 41.19033,0 0,-27.1288 29.35404,0 0,-41.2377 -29.35404,0 0,-30.6797 -41.19033,0 z" id="rect2995-0-2-7-7" inkscape:connector-curvature="0" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/twirl/header.scala.html b/src/main/twirl/header.scala.html index b132711f3..5ab75e0e6 100644 --- a/src/main/twirl/header.scala.html +++ b/src/main/twirl/header.scala.html @@ -12,10 +12,13 @@ }
@if(repository.repository.isPrivate){ - - } - @if(!repository.repository.isPrivate){ - + + } else { + @if(repository.repository.originUserName.isDefined){ + + } else { + + } } @repository.owner / @repository.name diff --git a/src/main/twirl/index.scala.html b/src/main/twirl/index.scala.html index ef8bd670d..c6e3de6a9 100644 --- a/src/main/twirl/index.scala.html +++ b/src/main/twirl/index.scala.html @@ -32,10 +32,13 @@ @if(repository.repository.isPrivate){ - - } - @if(!repository.repository.isPrivate){ - + + } else { + @if(repository.repository.originUserName.isDefined){ + + } else { + + } } @if(repository.owner == loginAccount.get.userName){ @repository.name @@ -64,10 +67,13 @@ @if(repository.repository.isPrivate){ - - } - @if(!repository.repository.isPrivate){ - + + } else { + @if(repository.repository.originUserName.isDefined){ + + } else { + + } } @repository.owner/@repository.name diff --git a/src/main/twirl/newrepo.scala.html b/src/main/twirl/newrepo.scala.html index 6d24a9c7a..05fefbc4d 100644 --- a/src/main/twirl/newrepo.scala.html +++ b/src/main/twirl/newrepo.scala.html @@ -30,7 +30,7 @@
@@ -76,6 +76,7 @@ $('#search').submit(function(){ return $.trim($(this).find('input[name=query]').val()) != ''; }); + $('#signin').attr('href', '@path/signin?redirect=' + encodeURIComponent(location.pathname + location.search + location.hash)); }); From b5d7c96bbad12d3d73f2454a4d7943e854aaa443 Mon Sep 17 00:00:00 2001 From: Ali Ayas Date: Sun, 23 Feb 2014 13:11:10 +0200 Subject: [PATCH 10/30] Apply GitHub diff colors However, jsdifflib is still not a good approach. It requires dumping all the two text to the browser and do the work there. Instead, maybe the diff should be taken from the git itself and highlighting should be applied on that. OTOH, word level diff would be good when applicable (like GitHub does). --- src/main/webapp/assets/jsdifflib/diffview.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/webapp/assets/jsdifflib/diffview.css b/src/main/webapp/assets/jsdifflib/diffview.css index 811a593b7..4c4a7c7f2 100644 --- a/src/main/webapp/assets/jsdifflib/diffview.css +++ b/src/main/webapp/assets/jsdifflib/diffview.css @@ -66,7 +66,7 @@ table.diff .replace { background-color:#FD8 } table.diff .delete { - background-color:#E99; + background-color:#FFDDDD; } table.diff .skip { background-color:#EFEFEF; @@ -74,10 +74,10 @@ table.diff .skip { border-right:1px solid #BBC; } table.diff .insert { - background-color:#9E9 + background-color:#DDFFDD } table.diff th.author { text-align:right; border-top:1px solid #BBC; background:#EFEFEF -} \ No newline at end of file +} From 0dd37c2481fb07275878385618b41ae1973cc61f Mon Sep 17 00:00:00 2001 From: takezoe Date: Mon, 24 Feb 2014 02:14:10 +0900 Subject: [PATCH 11/30] (refs #279)Fix redirect URL generation in authentication. --- src/main/scala/app/ControllerBase.scala | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala index f80d15a5b..bdea0421e 100644 --- a/src/main/scala/app/ControllerBase.scala +++ b/src/main/scala/app/ControllerBase.scala @@ -59,11 +59,6 @@ abstract class ControllerBase extends ScalatraFilter */ implicit def context: Context = Context(servletContext.getContextPath, LoginAccount, request) - // TODO This method should be remvoved. - private def currentURL: String = defining(request.getQueryString){ queryString => - request.getRequestURI + (if(queryString != null) "?" + queryString else "") - } - private def LoginAccount: Option[Account] = session.getAs[Account](Keys.Session.LoginAccount) def ajaxGet(path : String)(action : => Any) : Route = @@ -107,8 +102,11 @@ abstract class ControllerBase extends ScalatraFilter if(request.getMethod.toUpperCase == "POST"){ org.scalatra.Unauthorized(redirect("/signin")) } else { - // TODO This URL may not be same as the front URL... - org.scalatra.Unauthorized(redirect("/signin?redirect=" + StringUtil.urlEncode(currentURL))) + val currentUrl = baseUrl + defining(request.getQueryString){ queryString => + request.getRequestURI.substring(request.getContextPath.length) + (if(queryString != null) "?" + queryString else "") + } + session.setAttribute(Keys.Session.Redirect, currentUrl) + org.scalatra.Unauthorized(redirect("/signin")) } } } @@ -117,7 +115,7 @@ abstract class ControllerBase extends ScalatraFilter defining(request.getRequestURL.toString){ url => url.substring(0, url.length - (request.getRequestURI.length - request.getContextPath.length)) } - } + }.replaceFirst("/$", "") } From c114a8b507b7aa5a3ca8ae47d79b284901f9ea86 Mon Sep 17 00:00:00 2001 From: takezoe Date: Mon, 24 Feb 2014 02:16:18 +0900 Subject: [PATCH 12/30] (refs #279)Fix TestCase. --- src/test/scala/view/AvatarImageProviderSpec.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/scala/view/AvatarImageProviderSpec.scala b/src/test/scala/view/AvatarImageProviderSpec.scala index d5e577537..f33731649 100644 --- a/src/test/scala/view/AvatarImageProviderSpec.scala +++ b/src/test/scala/view/AvatarImageProviderSpec.scala @@ -10,7 +10,7 @@ import twirl.api.Html class AvatarImageProviderSpec extends Specification { - implicit val context = app.Context("", None, "", null) + implicit val context = app.Context("", None, null) "getAvatarImageHtml" should { "show Gravatar image for no image account if gravatar integration is enabled" in { @@ -80,6 +80,7 @@ class AvatarImageProviderSpec extends Specification { private def createSystemSettings(useGravatar: Boolean) = SystemSettings( + baseUrl = None, allowAccountRegistration = false, gravatar = useGravatar, notification = false, From 99d15899f6b9c53ea491f1df9945de00f15204b5 Mon Sep 17 00:00:00 2001 From: Naoki Takezoe Date: Mon, 24 Feb 2014 02:32:19 +0900 Subject: [PATCH 13/30] Update README.md --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ef29df76..8c7eca645 100644 --- a/README.md +++ b/README.md @@ -59,12 +59,23 @@ Run the following commands in `Terminal` to Release Notes -------- +### 1.11 - End of Mar 2014 +- Base URL for redirect, notification and repository URL box is configurable +- Headline anchor is available for Markdown contents such as Wiki page +- Improve H2 connectivity +- Label is available for pull requests not only issues +- Delete branch button is added +- Repository icons are updated +- Select lines of source code by URL hash like `#L10` or `#L10-L15` in repository viewer +- Display reference to issue from others in comment list +- Fix some bugs + ### 1.10 - 01 Feb 2014 - Rename repository - Transfer repository owner - Change default data directory to `HOME/.gitbucket` from `HOME/gitbucket` to avoid problem like #243, but if data directory already exist at HOME/gitbucket, it continues being used. - Add LDAP display name attribute -- Response improvement +- Response performance improvement - Fix some bugs ### 1.9 - 28 Dec 2013 From 5b34b9c7952cd7feb7547ea19683f2ec5cb65987 Mon Sep 17 00:00:00 2001 From: Naoki Takezoe Date: Mon, 24 Feb 2014 02:34:13 +0900 Subject: [PATCH 14/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c7eca645..fa6718dc6 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Run the following commands in `Terminal` to Release Notes -------- -### 1.11 - End of Mar 2014 +### 1.11 - End of Feb 2014 - Base URL for redirect, notification and repository URL box is configurable - Headline anchor is available for Markdown contents such as Wiki page - Improve H2 connectivity From 2c14dfb781dae1e3fd8610aad047a4b9fdf14495 Mon Sep 17 00:00:00 2001 From: Tobias Roeser Date: Wed, 26 Feb 2014 12:09:14 +0100 Subject: [PATCH 15/30] Show the correct name of the readme file (instead of showing always README.md). --- src/main/scala/app/RepositoryViewerController.scala | 2 +- src/main/twirl/repo/files.scala.html | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index 272613682..fcc81dfe6 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -276,7 +276,7 @@ trait RepositoryViewerControllerBase extends ControllerBase { val readme = files.find { file => readmeFiles.contains(file.name.toLowerCase) }.map { file => - StringUtil.convertFromByteArray(JGitUtil.getContent(Git.open(getRepositoryDir(repository.owner, repository.name)), file.id, true).get) + file -> StringUtil.convertFromByteArray(JGitUtil.getContent(Git.open(getRepositoryDir(repository.owner, repository.name)), file.id, true).get) } repo.html.files(revision, repository, diff --git a/src/main/twirl/repo/files.scala.html b/src/main/twirl/repo/files.scala.html index 94f6dac3d..823298ec7 100644 --- a/src/main/twirl/repo/files.scala.html +++ b/src/main/twirl/repo/files.scala.html @@ -3,7 +3,7 @@ pathList: List[String], latestCommit: util.JGitUtil.CommitInfo, files: List[util.JGitUtil.FileInfo], - readme: Option[String])(implicit context: app.Context) + readme: Option[(util.JGitUtil.FileInfo, String)])(implicit context: app.Context) @import context._ @import view.helpers._ @html.main(s"${repository.owner}/${repository.name}", Some(repository)) { @@ -77,9 +77,9 @@ - @readme.map { content => + @readme.map { case(file, content) =>
-
README.md
+
@file.name
@markdown(content, repository, false, false)
} From 7a0a62af2d94dde1e2ce548c3ed3d17656b87501 Mon Sep 17 00:00:00 2001 From: Tobias Roeser Date: Fri, 28 Feb 2014 15:25:32 +0100 Subject: [PATCH 16/30] Show repository description below the name on repository page. --- src/main/twirl/header.scala.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/twirl/header.scala.html b/src/main/twirl/header.scala.html index bb2be97e3..965fa9381 100644 --- a/src/main/twirl/header.scala.html +++ b/src/main/twirl/header.scala.html @@ -29,7 +29,13 @@ } } + + + @if(repository.repository.description != "") { +

@repository.repository.description

+ } +