From 896420f8dcf80aa19ec0735f7f40c75e786ea877 Mon Sep 17 00:00:00 2001 From: takezoe Date: Sun, 4 May 2014 17:58:47 +0900 Subject: [PATCH 01/50] Disable AceEditor for non text files --- src/main/twirl/repo/blob.scala.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/twirl/repo/blob.scala.html b/src/main/twirl/repo/blob.scala.html index 06d8234b0..038ef0acf 100644 --- a/src/main/twirl/repo/blob.scala.html +++ b/src/main/twirl/repo/blob.scala.html @@ -30,7 +30,7 @@ @link(latestCommit.summary, repository)
- @if(hasWritePermission){ + @if(hasWritePermission && content.viewType == "text"){ Edit } Raw From cf047a8cee636b9fbec2b6f9702230cdc2933432 Mon Sep 17 00:00:00 2001 From: takezoe Date: Sun, 4 May 2014 18:45:58 +0900 Subject: [PATCH 02/50] Migrate: add extension to files which are attached to issue --- src/main/scala/app/FileUploadController.scala | 4 ++- src/main/scala/app/IssuesController.scala | 14 +++++----- .../scala/servlet/AutoUpdateListener.scala | 27 +++++++++++++++++++ src/main/scala/util/FileUtil.scala | 14 ---------- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/main/scala/app/FileUploadController.scala b/src/main/scala/app/FileUploadController.scala index ad8ea2829..9798c0a2a 100644 --- a/src/main/scala/app/FileUploadController.scala +++ b/src/main/scala/app/FileUploadController.scala @@ -25,7 +25,9 @@ class FileUploadController extends ScalatraServlet with FileUploadSupport { post("/image/:owner/:repository"){ execute { (file, fileId) => - FileUtils.writeByteArrayToFile(new java.io.File(getAttachedDir(params("owner"), params("repository")), fileId), file.get) + FileUtils.writeByteArrayToFile(new java.io.File( + getAttachedDir(params("owner"), params("repository")), + fileId + "." + FileUtil.getExtension(file.getName)), file.get) } } diff --git a/src/main/scala/app/IssuesController.scala b/src/main/scala/app/IssuesController.scala index 2e6016830..661c1e082 100644 --- a/src/main/scala/app/IssuesController.scala +++ b/src/main/scala/app/IssuesController.scala @@ -274,12 +274,14 @@ trait IssuesControllerBase extends ControllerBase { }) get("/:owner/:repository/_attached/:file")(referrersOnly { repository => - defining(new java.io.File(Directory.getAttachedDir(repository.owner, repository.name), params("file"))){ file => - if(file.exists) { - contentType = FileUtil.getMimeType(file) - file - } else NotFound - } + (Directory.getAttachedDir(repository.owner, repository.name) match { + case dir if(dir.exists && dir.isDirectory) => + dir.listFiles.find(_.getName.startsWith(params("file") + ".")).map { file => + contentType = FileUtil.getMimeType(file.getName) + file + } + case _ => None + }) getOrElse NotFound }) val assignedUserName = (key: String) => params.get(key) filter (_.trim != "") diff --git a/src/main/scala/servlet/AutoUpdateListener.scala b/src/main/scala/servlet/AutoUpdateListener.scala index 9ffed838e..05dc0eeaf 100644 --- a/src/main/scala/servlet/AutoUpdateListener.scala +++ b/src/main/scala/servlet/AutoUpdateListener.scala @@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory import util.Directory._ import util.ControlUtil._ import org.eclipse.jgit.api.Git +import util.Directory object AutoUpdate { @@ -50,6 +51,32 @@ object AutoUpdate { * The history of versions. A head of this sequence is the current BitBucket version. */ val versions = Seq( + new Version(1, 14){ + override def update(conn: Connection): Unit = { + import eu.medsea.mimeutil.{MimeUtil2, MimeType} + + val mimeUtil = new MimeUtil2() + mimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector") + + super.update(conn) + using(conn.createStatement.executeQuery("SELECT USER_NAME, REPOSITORY_NAME FROM REPOSITORY")){ rs => + while(rs.next){ + defining(Directory.getAttachedDir(rs.getString("USER_NAME"), rs.getString("REPOSITORY_NAME"))){ dir => + if(dir.exists && dir.isDirectory){ + dir.listFiles.foreach { file => + if(file.getName.indexOf('.') < 0){ + val mimeType = MimeUtil2.getMostSpecificMimeType(mimeUtil.getMimeTypes(file, new MimeType("application/octet-stream"))).toString + if(mimeType.startsWith("image/")){ + file.renameTo(new File(file.getParent, file.getName + "." + mimeType.split("/")(1))) + } + } + } + } + } + } + } + } + }, Version(1, 13), Version(1, 12), Version(1, 11), diff --git a/src/main/scala/util/FileUtil.scala b/src/main/scala/util/FileUtil.scala index 46218eebe..0145db476 100644 --- a/src/main/scala/util/FileUtil.scala +++ b/src/main/scala/util/FileUtil.scala @@ -5,13 +5,9 @@ import java.net.URLConnection import java.io.File import util.ControlUtil._ import scala.util.Random -import eu.medsea.mimeutil.{MimeUtil2, MimeType} object FileUtil { - private val mimeUtil = new MimeUtil2() - mimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector") - def getMimeType(name: String): String = defining(URLConnection.getFileNameMap()){ fileNameMap => fileNameMap.getContentTypeFor(name) match { @@ -20,16 +16,6 @@ object FileUtil { } } - /** - * Returns mime type detected by file content. - * - * @param file File object - * @return mime type String - */ - def getMimeType(file: File): String = { - MimeUtil2.getMostSpecificMimeType(mimeUtil.getMimeTypes(file, new MimeType("application/octet-stream"))).toString - } - def getContentType(name: String, bytes: Array[Byte]): String = { defining(getMimeType(name)){ mimeType => if(mimeType == "application/octet-stream" && isText(bytes)){ From 6a7fc555725a6f30fc9ace4795e3df9c47ace6da Mon Sep 17 00:00:00 2001 From: takezoe Date: Mon, 5 May 2014 22:05:41 +0900 Subject: [PATCH 03/50] Global navigation moves to side menu. --- etc/icons.svg | 284 +++++++++++++++++- src/main/twirl/header.scala.html | 198 +++++++++--- src/main/twirl/helper/copy.scala.html | 4 +- src/main/twirl/issues/create.scala.html | 141 ++++----- src/main/twirl/issues/issue.scala.html | 51 ++-- src/main/twirl/issues/list.scala.html | 231 +++++++------- .../twirl/issues/milestones/edit.scala.html | 65 ++-- .../twirl/issues/milestones/list.scala.html | 175 +++++------ src/main/twirl/main.scala.html | 4 +- src/main/twirl/pulls/compare.scala.html | 139 ++++----- src/main/twirl/pulls/list.scala.html | 67 +++-- src/main/twirl/pulls/pullreq.scala.html | 63 ++-- src/main/twirl/repo/blob.scala.html | 107 +++---- src/main/twirl/repo/branches.scala.html | 61 ++-- src/main/twirl/repo/commit.scala.html | 121 ++++---- src/main/twirl/repo/commits.scala.html | 103 +++---- src/main/twirl/repo/delete.scala.html | 83 ++--- src/main/twirl/repo/editor.scala.html | 107 +++---- src/main/twirl/repo/files.scala.html | 161 +++++----- src/main/twirl/repo/forked.scala.html | 49 +-- src/main/twirl/repo/guide.scala.html | 37 +-- src/main/twirl/repo/tab.scala.html | 4 +- src/main/twirl/repo/tags.scala.html | 35 +-- src/main/twirl/search/menu.scala.html | 63 ++-- .../twirl/settings/collaborators.scala.html | 47 +-- src/main/twirl/settings/danger.scala.html | 57 ++-- src/main/twirl/settings/hooks.scala.html | 35 +-- src/main/twirl/settings/options.scala.html | 177 +++++------ src/main/twirl/wiki/compare.scala.html | 51 ++-- src/main/twirl/wiki/edit.scala.html | 51 ++-- src/main/twirl/wiki/history.scala.html | 121 ++++---- src/main/twirl/wiki/page.scala.html | 45 +-- src/main/twirl/wiki/pages.scala.html | 40 +-- src/main/twirl/wiki/tab.scala.html | 2 +- .../webapp/assets/common/css/gitbucket.css | 15 +- 35 files changed, 1704 insertions(+), 1290 deletions(-) diff --git a/etc/icons.svg b/etc/icons.svg index c2efe0e4d..bf4e8338c 100644 --- a/etc/icons.svg +++ b/etc/icons.svg @@ -2,6 +2,7 @@ + id="defs4"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/twirl/header.scala.html b/src/main/twirl/header.scala.html index 165343d54..07f18f39b 100644 --- a/src/main/twirl/header.scala.html +++ b/src/main/twirl/header.scala.html @@ -1,60 +1,162 @@ -@(active: String, repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context) +@(active: String, repository: service.RepositoryService.RepositoryInfo, id: Option[String] = None)(body: Html)(implicit context: app.Context) @import context._ @import view.helpers._ -@if(repository.commitCount > 0){ -
-
- Fork - @repository.forkedCount +
+ @if(repository.commitCount > 0){ + + } +
+ @helper.html.repositoryicon(repository, true) + @repository.owner / @repository.name + + @defining(repository.repository){ x => + @if(repository.repository.originRepositoryName.isDefined){ + + } + }
+
+
+ +
+
+
    +
  • +
  • +
    Code +
  • +
  • +
    Issues + @if(repository.issueCount > 0){ +
    @repository.issueCount
    + } +
  • +
  • +
    Pull Requests + @if(repository.pullCount > 0){ +
    @repository.pullCount
    + } +
  • +
  • +
    Wiki +
  • +
  • +
  • +
    Settings +
  • +
+
+ HTTP clone URL +
+ @helper.html.copy("repository-url-copy", repository.httpUrl){ + @* + @if(settings.ssh && loginAccount.isDefined){ +
+ +
+ } else { + HTTP + } + *@ + + } + @if(settings.ssh && loginAccount.isDefined){ +
+ You can clone HTTP or SSH.
} - } -
-@repository.repository.description.map { description => -

@description

-} - - - - - - - - @if(loginAccount.isDefined && (loginAccount.get.isAdmin || repository.managers.contains(loginAccount.get.userName))){ - +
+ @* + Download ZIP + *@ + Download ZIP +
+ +
+ @repository.repository.description.map { description => +

@description

} -
- + + + @body +
+
diff --git a/src/main/twirl/repo/editor.scala.html b/src/main/twirl/repo/editor.scala.html index b303ef5d0..697e2bb1c 100644 --- a/src/main/twirl/repo/editor.scala.html +++ b/src/main/twirl/repo/editor.scala.html @@ -6,62 +6,63 @@ @import context._ @import view.helpers._ @html.main(if(fileName.isEmpty) "New File" else s"Editing ${path} at ${fileName} - ${repository.owner}/${repository.name}", Some(repository)) { - @html.header("code", repository) - @tab(branch, repository, "files") -
- -
- @repository.name / - @pathList.zipWithIndex.map { case (section, i) => - @section / - } - - - - -
- - - - - - - -
-
- + @html.header("code", repository){ + @tab(branch, repository, "files") + + +
+ @repository.name / + @pathList.zipWithIndex.map { case (section, i) => + @section / + } + + + + +
+ + + + + + + +
+
+ +
+
+
+
+
@avatar(loginAccount.get.userName, 48)
+
+
+
+ Commit changes +
+
+ +
+
+ @if(fileName.isEmpty){ + Cancel + } else { + Cancel + } + + + +
-
-
-
-
@avatar(loginAccount.get.userName, 48)
-
-
-
- Commit changes -
-
- -
-
- @if(fileName.isEmpty){ - Cancel - } else { - Cancel - } - - - -
-
-
+ + } } + + } } \ No newline at end of file diff --git a/src/main/twirl/wiki/page.scala.html b/src/main/twirl/wiki/page.scala.html index 7e43b5ace..967e3d098 100644 --- a/src/main/twirl/wiki/page.scala.html +++ b/src/main/twirl/wiki/page.scala.html @@ -5,26 +5,27 @@ @import context._ @import view.helpers._ @html.main(s"${pageName} - ${repository.owner}/${repository.name}", Some(repository)){ - @html.header("wiki", repository) - @tab((if(pageName == "Home") "home" else ""), repository) - -
- @markdown(page.content, repository, true, false) -
-
- Last edited by @page.committer at @datetime(page.time) -
+ @html.header("wiki", repository){ + @tab((if(pageName == "Home") "home" else ""), repository) + +
+ @markdown(page.content, repository, true, false) +
+
+ Last edited by @page.committer at @datetime(page.time) +
+ } } diff --git a/src/main/twirl/wiki/pages.scala.html b/src/main/twirl/wiki/pages.scala.html index 429c43887..7f5d7dc93 100644 --- a/src/main/twirl/wiki/pages.scala.html +++ b/src/main/twirl/wiki/pages.scala.html @@ -4,24 +4,24 @@ @import context._ @import view.helpers._ @html.main(s"Pages - ${repository.owner}/${repository.name}", Some(repository)){ - @html.header("wiki", repository) - @tab("pages", repository) - -
    - @pages.map { page => -
  • @page
  • - } -
- + @html.header("wiki", repository){ + @tab("pages", repository) + +
    + @pages.map { page => +
  • @page
  • + } +
+ } } \ No newline at end of file diff --git a/src/main/twirl/wiki/tab.scala.html b/src/main/twirl/wiki/tab.scala.html index e68c88521..8c281cab5 100644 --- a/src/main/twirl/wiki/tab.scala.html +++ b/src/main/twirl/wiki/tab.scala.html @@ -8,7 +8,7 @@ Pages Wiki History
  • - @helper.html.copy("repository-url-copy", httpUrl(repository), true){ + @helper.html.copy("repository-url-copy", httpUrl(repository)){ @if(settings.ssh && loginAccount.isDefined){
    diff --git a/src/main/webapp/assets/common/css/gitbucket.css b/src/main/webapp/assets/common/css/gitbucket.css index aac4c8403..a17d73db2 100644 --- a/src/main/webapp/assets/common/css/gitbucket.css +++ b/src/main/webapp/assets/common/css/gitbucket.css @@ -3,6 +3,7 @@ /****************************************************************************/ body { color: #333; + line-height: 100%; } li p { @@ -122,7 +123,7 @@ span.error { } .small { - font-size: 85%; + font-size: 80%; } .strong { @@ -436,6 +437,7 @@ table.table-file-list td { th, td, .table th, .table td { padding-top: 4px; padding-bottom: 4px; + line-height: 100%; } div.commit-avatar-image { @@ -458,7 +460,16 @@ pre.commit-description { #repository-url { background-color: white; cursor: default; - width: 300px; + height: 16px; + width: 129px; + color: silver; + font-size: 9pt; + font-family: monospace; +} + +#repository-url-copy { + height: 18px; + padding-top: 2px; } ul#commit-file-list { From 24feeb17be6094f96bb63afe933d9ec6fbf2c52c Mon Sep 17 00:00:00 2001 From: takezoe Date: Mon, 5 May 2014 22:06:18 +0900 Subject: [PATCH 04/50] Add icons for new UI --- .../assets/common/images/header-branches.png | Bin 0 -> 311 bytes .../assets/common/images/header-commits.png | Bin 0 -> 406 bytes .../webapp/assets/common/images/header-tags.png | Bin 0 -> 371 bytes .../webapp/assets/common/images/menu-code.png | Bin 0 -> 262 bytes .../webapp/assets/common/images/menu-issues.png | Bin 0 -> 404 bytes .../webapp/assets/common/images/menu-pulls.png | Bin 0 -> 315 bytes .../webapp/assets/common/images/menu-wiki.png | Bin 0 -> 367 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/webapp/assets/common/images/header-branches.png create mode 100644 src/main/webapp/assets/common/images/header-commits.png create mode 100644 src/main/webapp/assets/common/images/header-tags.png create mode 100644 src/main/webapp/assets/common/images/menu-code.png create mode 100644 src/main/webapp/assets/common/images/menu-issues.png create mode 100644 src/main/webapp/assets/common/images/menu-pulls.png create mode 100644 src/main/webapp/assets/common/images/menu-wiki.png diff --git a/src/main/webapp/assets/common/images/header-branches.png b/src/main/webapp/assets/common/images/header-branches.png new file mode 100644 index 0000000000000000000000000000000000000000..c661dd28aea20b4b40a716e68e32d6e317c987b6 GIT binary patch literal 311 zcmV-70m%M|P)(D>S#Wm$DyQv|pDYN%5Xr$(kuV~002ov JPDHLkV1lA5hx`Bl literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/common/images/header-commits.png b/src/main/webapp/assets/common/images/header-commits.png new file mode 100644 index 0000000000000000000000000000000000000000..d982329c541eb3a30df9ea1c6590e27a27706e03 GIT binary patch literal 406 zcmV;H0crk;P)NOm|JT-UWM zOVcz}RV$TBuh-k}_i~PiKT#A727^o{Qz#T#tyT~O*Xu^3 zLALMv@4(xZ%O%}x+m1uxcDqp{olaBo@xgYx9T?cYD3wYj0M%;sa=CoMtX3;1Fr+x0 zPCSmsqa4P$-EI>YH0X3XqTOyYVj_lW&=KY8luCQ0e&1`yvt&-NF`)| z>u@-1Hk-F(?-0%0cZJVZv;~2puhQJuQs;W%W+-|o~6d{`D`4aO6;Jw@J zeBaNq4E1zf_k|&-9`$TCo1!R&VUQ%LuIuOX+4ub{L(nmR^Z6`_;%c?BZ5!(Sevh29 z3}G1Na=G9Qg`tyCeK;Ik*PUgE<2WeecDvz1)vwnJSI_f4nJ^6B03OO90}4ayv;dkX zO;d~q7G(TDnX)WpS*8ru0*fR`z^JN<*$`@WJRTVRJm^)^w268Vz_Ba~GeMV=_#c-sweI+& R9`*nL002ovPDHLkV1nMNsKWpN literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/common/images/menu-code.png b/src/main/webapp/assets/common/images/menu-code.png new file mode 100644 index 0000000000000000000000000000000000000000..d47af04b8bd3b604472160b8408d61d5acccc427 GIT binary patch literal 262 zcmV+h0r~!kP)MGhAE1lG)ky+I5JcK*4{S+PTH2c~$$Lj~7jpYD$WOwu zEJaZa!+^_i9FOB*F4W1hn&&A zgLfkrwC_yQM37FB+PXAKZb=$V>`Frhue7;ZO4w8kvjIP9HSpWb4 M07*qoM6N<$f}eA3I{*Lx literal 0 HcmV?d00001 diff --git a/src/main/webapp/assets/common/images/menu-issues.png b/src/main/webapp/assets/common/images/menu-issues.png new file mode 100644 index 0000000000000000000000000000000000000000..956af1a4a18b956eebb9daff51db8f7ab63936e8 GIT binary patch literal 404 zcmV;F0c-w=P)1`m;yCVhyJcAlR>K=6?*Z^chQ(qb(1a^h9sUFmzV8o*LxF;5_a8u#BybTdQV)0! zKxKhD=&csGhqcr=QO!@MQ}_$`P($zg+u-QIU=T%-z&Py-h#)i*loX=<8%%*!bo4x$`z|gJhI_G+x y7e52x;cXa(oc#ijfh>55JJ3Z5G=VL=)t)cU7NXjin^Wlk0000_2c}~ zwrwY+BuUz~J%8yztgh<@L13C@-}n2zd!ENIOj(x8vivCY2^2*EH-f6F48zbgjiJP{ zY?fu;fTn3|+dhut^?LcfpQb5HusV)|R)QdK9EZ~zAQSUEFG51-e&xYW$acHk?RH@p7Da*JRoHAcqtQqdMbk8w%cbKunx;Lr z7>2Q0tz6fg&1U2A7}s#hEEbFXet$R|-YCeesw%Ye`TR=B^W5`1m|udf>ra#{%ZQL9 z$ukA@J3>`eCFN&@f^s|_I|AChqhLfL_`d%@u`H`2Ai*u!t-|SadZ(arN0?5h_mn7# zh!6z9Z7|!mJ3? literal 0 HcmV?d00001 From ea1e9037c43f0cf12819c1e8da65a0b4f9c91fdb Mon Sep 17 00:00:00 2001 From: takezoe Date: Tue, 6 May 2014 01:01:43 +0900 Subject: [PATCH 05/50] Folding side-menu --- src/main/twirl/header.scala.html | 87 ++++++++++++++++------------ src/main/twirl/repo/files.scala.html | 9 +-- 2 files changed, 51 insertions(+), 45 deletions(-) diff --git a/src/main/twirl/header.scala.html b/src/main/twirl/header.scala.html index 07f18f39b..354188b49 100644 --- a/src/main/twirl/header.scala.html +++ b/src/main/twirl/header.scala.html @@ -1,4 +1,7 @@ -@(active: String, repository: service.RepositoryService.RepositoryInfo, id: Option[String] = None)(body: Html)(implicit context: app.Context) +@(active: String, + repository: service.RepositoryService.RepositoryInfo, + id: Option[String] = None, + expand: Boolean = false)(body: Html)(implicit context: app.Context) @import context._ @import view.helpers._ @@ -55,6 +58,7 @@ ul.sidemenu li { height: 35px; border-left: 1px solid #eee; margin-left:0px; + border-right: 4px solid white; list-style-type: none; } @@ -62,62 +66,71 @@ ul.sidemenu li.separator { border-top: 1px solid #eee; height: 1px; } + +ul.sidemenu span.badge { + padding-right: 4px; +}
    -
    +
    -
    - HTTP clone URL -
    - @helper.html.copy("repository-url-copy", repository.httpUrl){ - @* - @if(settings.ssh && loginAccount.isDefined){ -
    - -
    - } else { - HTTP - } - *@ - - } - @if(settings.ssh && loginAccount.isDefined){ + @if(expand){
    - You can clone HTTP or SSH. + HTTP clone URL
    + @helper.html.copy("repository-url-copy", repository.httpUrl){ + @* + @if(settings.ssh && loginAccount.isDefined){ +
    + +
    + } else { + HTTP + } + *@ + + } + @if(settings.ssh && loginAccount.isDefined){ +
    + You can clone HTTP or SSH. +
    + } + @id.map { id => + + } } -
    - @* - Download ZIP - *@ - Download ZIP -
    -
    +
    @repository.repository.description.map { description =>

    @description

    } diff --git a/src/main/twirl/repo/files.scala.html b/src/main/twirl/repo/files.scala.html index 803335ba6..d36724df5 100644 --- a/src/main/twirl/repo/files.scala.html +++ b/src/main/twirl/repo/files.scala.html @@ -8,16 +8,9 @@ @import context._ @import view.helpers._ @html.main(s"${repository.owner}/${repository.name}", Some(repository)) { - @html.header("code", repository, Some(branch)){ + @html.header("code", repository, Some(branch), pathList.isEmpty){ @tab(branch, repository, "files")
    - @* -
    - @defining(repository.commitCount){ commitCount => - @if(commitCount > 10000){ 10000+ } else { @commitCount } @plural(commitCount, "commit")  - } -
    - *@ @repository.name / @pathList.zipWithIndex.map { case (section, i) => @section / From 0fe30e5629f6efd765671227fbead074d154d0b0 Mon Sep 17 00:00:00 2001 From: takezoe Date: Tue, 6 May 2014 02:17:11 +0900 Subject: [PATCH 06/50] Rename header.scala.html to menu.scala.html --- etc/icons.svg | 83 +++- src/main/twirl/issues/create.scala.html | 2 +- src/main/twirl/issues/issue.scala.html | 2 +- src/main/twirl/issues/list.scala.html | 2 +- .../twirl/issues/milestones/edit.scala.html | 2 +- .../twirl/issues/milestones/list.scala.html | 2 +- .../{header.scala.html => menu.scala.html} | 362 +++++++++--------- src/main/twirl/pulls/compare.scala.html | 2 +- src/main/twirl/pulls/list.scala.html | 2 +- src/main/twirl/pulls/pullreq.scala.html | 2 +- src/main/twirl/repo/blob.scala.html | 2 +- src/main/twirl/repo/branches.scala.html | 2 +- src/main/twirl/repo/commit.scala.html | 2 +- src/main/twirl/repo/commits.scala.html | 2 +- src/main/twirl/repo/delete.scala.html | 2 +- src/main/twirl/repo/editor.scala.html | 2 +- src/main/twirl/repo/files.scala.html | 2 +- src/main/twirl/repo/forked.scala.html | 2 +- src/main/twirl/repo/guide.scala.html | 2 +- src/main/twirl/repo/tags.scala.html | 2 +- src/main/twirl/search/menu.scala.html | 2 +- .../twirl/settings/collaborators.scala.html | 2 +- src/main/twirl/settings/danger.scala.html | 2 +- src/main/twirl/settings/hooks.scala.html | 2 +- src/main/twirl/settings/options.scala.html | 2 +- src/main/twirl/wiki/compare.scala.html | 2 +- src/main/twirl/wiki/edit.scala.html | 2 +- src/main/twirl/wiki/history.scala.html | 2 +- src/main/twirl/wiki/page.scala.html | 2 +- src/main/twirl/wiki/pages.scala.html | 2 +- 30 files changed, 288 insertions(+), 213 deletions(-) rename src/main/twirl/{header.scala.html => menu.scala.html} (62%) diff --git a/etc/icons.svg b/etc/icons.svg index bf4e8338c..565641e02 100644 --- a/etc/icons.svg +++ b/etc/icons.svg @@ -35,8 +35,8 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.9899495" - inkscape:cx="827.57339" - inkscape:cy="496.04311" + inkscape:cx="658.37284" + inkscape:cy="201.93139" inkscape:document-units="px" inkscape:current-layer="layer1-9" showgrid="false" @@ -1185,7 +1185,7 @@ style="fill:#ffffff;stroke:#a0a0a0;stroke-width:22.72570610000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + + + + + + + + + + + + diff --git a/src/main/twirl/issues/create.scala.html b/src/main/twirl/issues/create.scala.html index e9aacbc2e..e87ed9726 100644 --- a/src/main/twirl/issues/create.scala.html +++ b/src/main/twirl/issues/create.scala.html @@ -6,7 +6,7 @@ @import context._ @import view.helpers._ @html.main(s"New Issue - ${repository.owner}/${repository.name}", Some(repository)){ - @html.header("issues", repository){ + @html.menu("issues", repository){ @tab("", repository)
    diff --git a/src/main/twirl/issues/issue.scala.html b/src/main/twirl/issues/issue.scala.html index 6f13e2fb4..d849ab07b 100644 --- a/src/main/twirl/issues/issue.scala.html +++ b/src/main/twirl/issues/issue.scala.html @@ -9,7 +9,7 @@ @import context._ @import view.helpers._ @html.main(s"${issue.title} - Issue #${issue.issueId} - ${repository.owner}/${repository.name}", Some(repository)){ - @html.header("issues", repository){ + @html.menu("issues", repository){ @tab("issues", repository) - +
    @commits.map { commit => From 03b5f7feb8fabf29824b13c202d4d24856d07cd1 Mon Sep 17 00:00:00 2001 From: takezoe Date: Sun, 18 May 2014 23:36:13 +0900 Subject: [PATCH 44/50] Fix title in file editing. --- src/main/twirl/repo/editor.scala.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/twirl/repo/editor.scala.html b/src/main/twirl/repo/editor.scala.html index 4112c6d26..4b6e0b560 100644 --- a/src/main/twirl/repo/editor.scala.html +++ b/src/main/twirl/repo/editor.scala.html @@ -5,7 +5,7 @@ content: util.JGitUtil.ContentInfo)(implicit context: app.Context) @import context._ @import view.helpers._ -@html.main(if(fileName.isEmpty) "New File" else s"Editing ${path} at ${fileName} - ${repository.owner}/${repository.name}", Some(repository)) { +@html.main(if(fileName.isEmpty) "New File" else s"Editing ${fileName.get} at ${branch} - ${repository.owner}/${repository.name}", Some(repository)) { @html.menu("code", repository){
    From 146be677ba6896fc5bd6c4cc92fbba28ba68ea3d Mon Sep 17 00:00:00 2001 From: takezoe Date: Mon, 19 May 2014 00:03:24 +0900 Subject: [PATCH 45/50] Hide "Edit" button if target is not head of the branch. --- src/main/twirl/repo/blob.scala.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/twirl/repo/blob.scala.html b/src/main/twirl/repo/blob.scala.html index 81518aa9c..51b4e651b 100644 --- a/src/main/twirl/repo/blob.scala.html +++ b/src/main/twirl/repo/blob.scala.html @@ -38,7 +38,7 @@ @link(latestCommit.summary, repository)
    - @if(hasWritePermission && content.viewType == "text"){ + @if(hasWritePermission && content.viewType == "text" && repository.branchList.contains(branch)){ Edit } Raw @@ -66,8 +66,9 @@ } @if(content.viewType == "large" || content.viewType == "binary"){ -
    +
    View Raw
    +
    (Sorry about that, but we can't show files that are this big right now)
    } From a863951d9728c1d624b5ee5dc8b1bdfd62d94b57 Mon Sep 17 00:00:00 2001 From: takezoe Date: Mon, 19 May 2014 00:29:29 +0900 Subject: [PATCH 46/50] Show diff for files other than markdown by "Preview" button --- src/main/twirl/repo/editor.scala.html | 46 ++++++++++++++++----------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/main/twirl/repo/editor.scala.html b/src/main/twirl/repo/editor.scala.html index 4b6e0b560..d89656928 100644 --- a/src/main/twirl/repo/editor.scala.html +++ b/src/main/twirl/repo/editor.scala.html @@ -30,18 +30,16 @@
    - @if(renderableSuffixes.find(suffix => fileName.map(_.toLowerCase.endsWith(suffix)).getOrElse(false))) { -
    - - -
    - } +
    + + +
    - +
    @@ -71,6 +69,9 @@ } } + + + From 29812f4a8224c07eb2534e732b219fa073a6503a Mon Sep 17 00:00:00 2001 From: Tomofumi Tanaka Date: Tue, 20 May 2014 21:26:51 +0900 Subject: [PATCH 47/50] (refs #375)Show merge commit diffs correctly --- src/main/scala/util/JGitUtil.scala | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/scala/util/JGitUtil.scala b/src/main/scala/util/JGitUtil.scala index 9f48c39c7..282469e41 100644 --- a/src/main/scala/util/JGitUtil.scala +++ b/src/main/scala/util/JGitUtil.scala @@ -372,7 +372,12 @@ object JGitUtil { if(commits.length >= 2){ // not initial commit - val oldCommit = commits(1) + val oldCommit = if(revCommit.getParentCount >= 2) { + // merge commit + revCommit.getParents.head + } else { + commits(1) + } (getDiffs(git, oldCommit.getName, id, fetchContent), Some(oldCommit.getName)) } else { From a846c77c7ef90d6b98419ed36f2152917391e451 Mon Sep 17 00:00:00 2001 From: Naoki Takezoe Date: Sun, 25 May 2014 18:14:53 +0900 Subject: [PATCH 48/50] (refs #346)Add group members as collaborator when transfer repository to the group. --- .../scala/service/RepositoryService.scala | 98 ++++++++++--------- 1 file changed, 52 insertions(+), 46 deletions(-) diff --git a/src/main/scala/service/RepositoryService.scala b/src/main/scala/service/RepositoryService.scala index 774017e09..49fd10208 100644 --- a/src/main/scala/service/RepositoryService.scala +++ b/src/main/scala/service/RepositoryService.scala @@ -40,60 +40,66 @@ trait RepositoryService { self: AccountService => } def renameRepository(oldUserName: String, oldRepositoryName: String, newUserName: String, newRepositoryName: String): Unit = { - (Query(Repositories) filter { t => t.byRepository(oldUserName, oldRepositoryName) } firstOption).map { repository => - Repositories insert repository.copy(userName = newUserName, repositoryName = newRepositoryName) + getAccountByUserName(newUserName).foreach { account => + (Query(Repositories) filter { t => t.byRepository(oldUserName, oldRepositoryName) } firstOption).map { repository => + Repositories insert repository.copy(userName = newUserName, repositoryName = newRepositoryName) - val webHooks = Query(WebHooks ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val milestones = Query(Milestones ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val issueId = Query(IssueId ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val issues = Query(Issues ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val pullRequests = Query(PullRequests ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val labels = Query(Labels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val issueComments = Query(IssueComments).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val issueLabels = Query(IssueLabels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val collaborators = Query(Collaborators).filter(_.byRepository(oldUserName, oldRepositoryName)).list - val activities = Query(Activities ).filter(_.byRepository(oldUserName, oldRepositoryName)).list + val webHooks = Query(WebHooks ).filter(_.byRepository(oldUserName, oldRepositoryName)).list + val milestones = Query(Milestones ).filter(_.byRepository(oldUserName, oldRepositoryName)).list + val issueId = Query(IssueId ).filter(_.byRepository(oldUserName, oldRepositoryName)).list + val issues = Query(Issues ).filter(_.byRepository(oldUserName, oldRepositoryName)).list + val pullRequests = Query(PullRequests ).filter(_.byRepository(oldUserName, oldRepositoryName)).list + val labels = Query(Labels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list + val issueComments = Query(IssueComments).filter(_.byRepository(oldUserName, oldRepositoryName)).list + val issueLabels = Query(IssueLabels ).filter(_.byRepository(oldUserName, oldRepositoryName)).list + val activities = Query(Activities ).filter(_.byRepository(oldUserName, oldRepositoryName)).list + val collaborators = Query(Collaborators).filter(_.byRepository(oldUserName, oldRepositoryName)).list - Repositories.filter { t => - (t.originUserName is oldUserName.bind) && (t.originRepositoryName is oldRepositoryName.bind) - }.map { t => t.originUserName ~ t.originRepositoryName }.update(newUserName, newRepositoryName) + Repositories.filter { t => + (t.originUserName is oldUserName.bind) && (t.originRepositoryName is oldRepositoryName.bind) + }.map { t => t.originUserName ~ t.originRepositoryName }.update(newUserName, newRepositoryName) - Repositories.filter { t => - (t.parentUserName is oldUserName.bind) && (t.parentRepositoryName is oldRepositoryName.bind) - }.map { t => t.originUserName ~ t.originRepositoryName }.update(newUserName, newRepositoryName) + Repositories.filter { t => + (t.parentUserName is oldUserName.bind) && (t.parentRepositoryName is oldRepositoryName.bind) + }.map { t => t.originUserName ~ t.originRepositoryName }.update(newUserName, newRepositoryName) - PullRequests.filter { t => - t.requestRepositoryName is oldRepositoryName.bind - }.map { t => t.requestUserName ~ t.requestRepositoryName }.update(newUserName, newRepositoryName) + PullRequests.filter { t => + t.requestRepositoryName is oldRepositoryName.bind + }.map { t => t.requestUserName ~ t.requestRepositoryName }.update(newUserName, newRepositoryName) - deleteRepository(oldUserName, oldRepositoryName) + deleteRepository(oldUserName, oldRepositoryName) - WebHooks .insertAll(webHooks .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) - Milestones .insertAll(milestones .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) - IssueId .insertAll(issueId .map(_.copy(_1 = newUserName, _2 = newRepositoryName)) :_*) - Issues .insertAll(issues .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) - PullRequests .insertAll(pullRequests .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) - IssueComments .insertAll(issueComments .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) - Labels .insertAll(labels .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) - IssueLabels .insertAll(issueLabels .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) - Collaborators .insertAll(collaborators .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) - Activities .insertAll(activities .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) + WebHooks .insertAll(webHooks .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) + Milestones .insertAll(milestones .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) + IssueId .insertAll(issueId .map(_.copy(_1 = newUserName, _2 = newRepositoryName)) :_*) + Issues .insertAll(issues .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) + PullRequests .insertAll(pullRequests .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) + IssueComments .insertAll(issueComments .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) + Labels .insertAll(labels .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) + IssueLabels .insertAll(issueLabels .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) + Activities .insertAll(activities .map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) + if(account.isGroupAccount){ + Collaborators.insertAll(getGroupMembers(newUserName).map(m => Collaborator(newUserName, newRepositoryName, m.userName)) :_*) + } else { + Collaborators.insertAll(collaborators.map(_.copy(userName = newUserName, repositoryName = newRepositoryName)) :_*) + } - // Update activity messages - val updateActivities = Activities.filter { t => - (t.message like s"%:${oldUserName}/${oldRepositoryName}]%") || - (t.message like s"%:${oldUserName}/${oldRepositoryName}#%") - }.map { t => t.activityId ~ t.message }.list + // Update activity messages + val updateActivities = Activities.filter { t => + (t.message like s"%:${oldUserName}/${oldRepositoryName}]%") || + (t.message like s"%:${oldUserName}/${oldRepositoryName}#%") + }.map { t => t.activityId ~ t.message }.list - updateActivities.foreach { case (activityId, message) => - Activities.filter(_.activityId is activityId.bind).map(_.message).update( - message - .replace(s"[repo:${oldUserName}/${oldRepositoryName}]" ,s"[repo:${newUserName}/${newRepositoryName}]") - .replace(s"[branch:${oldUserName}/${oldRepositoryName}#" ,s"[branch:${newUserName}/${newRepositoryName}#") - .replace(s"[tag:${oldUserName}/${oldRepositoryName}#" ,s"[tag:${newUserName}/${newRepositoryName}#") - .replace(s"[pullreq:${oldUserName}/${oldRepositoryName}#",s"[pullreq:${newUserName}/${newRepositoryName}#") - .replace(s"[issue:${oldUserName}/${oldRepositoryName}#" ,s"[issue:${newUserName}/${newRepositoryName}#") - ) + updateActivities.foreach { case (activityId, message) => + Activities.filter(_.activityId is activityId.bind).map(_.message).update( + message + .replace(s"[repo:${oldUserName}/${oldRepositoryName}]" ,s"[repo:${newUserName}/${newRepositoryName}]") + .replace(s"[branch:${oldUserName}/${oldRepositoryName}#" ,s"[branch:${newUserName}/${newRepositoryName}#") + .replace(s"[tag:${oldUserName}/${oldRepositoryName}#" ,s"[tag:${newUserName}/${newRepositoryName}#") + .replace(s"[pullreq:${oldUserName}/${oldRepositoryName}#",s"[pullreq:${newUserName}/${newRepositoryName}#") + .replace(s"[issue:${oldUserName}/${oldRepositoryName}#" ,s"[issue:${newUserName}/${newRepositoryName}#") + ) + } } } } From 1e8224536ba12122c075c62776e4bd953674d94c Mon Sep 17 00:00:00 2001 From: Naoki Takezoe Date: Thu, 29 May 2014 01:55:10 +0900 Subject: [PATCH 49/50] (refs #383)Disable "New Issue" button in the new issue creation page. --- src/main/twirl/issues/create.scala.html | 2 +- src/main/twirl/issues/issue.scala.html | 2 +- src/main/twirl/issues/list.scala.html | 2 +- src/main/twirl/issues/milestones/edit.scala.html | 2 +- src/main/twirl/issues/milestones/list.scala.html | 2 +- src/main/twirl/issues/tab.scala.html | 8 ++++++-- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/twirl/issues/create.scala.html b/src/main/twirl/issues/create.scala.html index 009c58de0..e32561171 100644 --- a/src/main/twirl/issues/create.scala.html +++ b/src/main/twirl/issues/create.scala.html @@ -7,7 +7,7 @@ @import view.helpers._ @html.main(s"New Issue - ${repository.owner}/${repository.name}", Some(repository)){ @html.menu("issues", repository){ - @tab("", repository) + @tab("", true, repository)
    diff --git a/src/main/twirl/issues/issue.scala.html b/src/main/twirl/issues/issue.scala.html index 9cbd6dac4..a92c5413f 100644 --- a/src/main/twirl/issues/issue.scala.html +++ b/src/main/twirl/issues/issue.scala.html @@ -10,7 +10,7 @@ @import view.helpers._ @html.main(s"${issue.title} - Issue #${issue.issueId} - ${repository.owner}/${repository.name}", Some(repository)){ @html.menu("issues", repository){ - @tab("issues", repository) + @tab("issues", false, repository)