Skip to content

Commit 28f15c4

Browse files
committed
Add revisions page
1 parent 641ea36 commit 28f15c4

File tree

2 files changed

+166
-25
lines changed

2 files changed

+166
-25
lines changed

src/main/scala/app/GistController.scala

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import java.io.File
44
import jp.sf.amateras.scalatra.forms._
55
import model.{GistUser, Gist, Account}
66
import service.{AccountService, GistService}
7+
import util.Directory._
78
import util.{UsersAuthenticator, GistEditorAuthenticator, JGitUtil, StringUtil}
89
import util.ControlUtil._
910
import org.eclipse.jgit.api.Git
@@ -104,31 +105,27 @@ trait GistControllerBase extends ControllerBase {
104105
val userName = params("userName")
105106
val repoName = params("repoName")
106107

107-
if(isEditable(userName)){
108-
val loginAccount = context.loginAccount.get
109-
val files = getFileParameters(true)
110-
// TODO Save isPrivate and description
111-
//val isPrivate = params("private")
112-
val description = params("description")
113-
val gitdir = new File(GistRepoDir, userName + "/" + repoName)
114-
115-
// Commit files
116-
using(Git.open(gitdir)){ git =>
117-
val commitId = commitFiles(git, loginAccount, "Update", files)
118-
119-
// update refs
120-
val refUpdate = git.getRepository.updateRef(Constants.HEAD)
121-
refUpdate.setNewObjectId(commitId)
122-
refUpdate.setForceUpdate(false)
123-
refUpdate.setRefLogIdent(new org.eclipse.jgit.lib.PersonIdent(loginAccount.fullName, loginAccount.mailAddress))
124-
//refUpdate.setRefLogMessage("merged", true)
125-
refUpdate.update()
126-
}
127-
128-
redirect(s"${context.path}/gist/${loginAccount.userName}/${repoName}")
129-
} else {
130-
// TODO Permission Error
108+
val loginAccount = context.loginAccount.get
109+
val files = getFileParameters(true)
110+
// TODO Save isPrivate and description
111+
//val isPrivate = params("private")
112+
val description = params("description")
113+
val gitdir = new File(GistRepoDir, userName + "/" + repoName)
114+
115+
// Commit files
116+
using(Git.open(gitdir)){ git =>
117+
val commitId = commitFiles(git, loginAccount, "Update", files)
118+
119+
// update refs
120+
val refUpdate = git.getRepository.updateRef(Constants.HEAD)
121+
refUpdate.setNewObjectId(commitId)
122+
refUpdate.setForceUpdate(false)
123+
refUpdate.setRefLogIdent(new org.eclipse.jgit.lib.PersonIdent(loginAccount.fullName, loginAccount.mailAddress))
124+
//refUpdate.setRefLogMessage("merged", true)
125+
refUpdate.update()
131126
}
127+
128+
redirect(s"${context.path}/gist/${loginAccount.userName}/${repoName}")
132129
})
133130

134131
get("/gist/:userName/:repoName/delete")(editorOnly {
@@ -176,6 +173,28 @@ trait GistControllerBase extends ControllerBase {
176173
_gist(params("userName"), Some(params("repoName")))
177174
}
178175

176+
get("/gist/:userName/:repoName/revisions"){
177+
val userName = params("userName")
178+
val repoName = params("repoName")
179+
val gitdir = new File(GistRepoDir, userName + "/" + repoName)
180+
181+
using(Git.open(gitdir)){ git =>
182+
JGitUtil.getCommitLog(git, "master") match {
183+
case Right((revisions, hasNext)) => {
184+
val commits = revisions.map { revision =>
185+
defining(JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(revision.id))){ revCommit =>
186+
JGitUtil.getDiffs(git, revision.id) match { case (diffs, oldCommitId) =>
187+
(revision, diffs)
188+
}
189+
}
190+
}
191+
gist.html.revisions("revision", getGist(userName, repoName).get, isEditable(userName), commits)
192+
}
193+
case Left(_) => NotFound
194+
}
195+
}
196+
}
197+
179198
get("/gist/:userName"){
180199
_gist(params("userName"))
181200
}
@@ -228,7 +247,7 @@ trait GistControllerBase extends ControllerBase {
228247
file.name -> StringUtil.convertFromByteArray(JGitUtil.getContentFromId(git, file.id, true).get)
229248
}
230249

231-
_root_.gist.html.detail("code", gist, files, isEditable(userName))(context)
250+
_root_.gist.html.detail("code", gist, files, isEditable(userName))
232251
} else {
233252
// TODO Permission Error
234253
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
@(active: String, gist: model.Gist, editable: Boolean,
2+
revisions: List[(util.JGitUtil.CommitInfo, List[util.JGitUtil.DiffInfo])])(implicit context: app.Context)
3+
@import context._
4+
@import view.helpers._
5+
@import org.eclipse.jgit.diff.DiffEntry.ChangeType
6+
7+
@sidemenu(path: String, name: String, label: String, count: Int = 0) = {
8+
<li @if(active == name){class="active"}>
9+
<div class="@if(active == name){margin} else {gradient} pull-left"></div>
10+
<a href="@context.path/gist/@path">
11+
@if(active == name){
12+
<img src="@assets/common/images/menu-@{name}-active.png">
13+
} else {
14+
<img src="@assets/common/images/menu-@{name}-active.png" class="menu-icon-active" style="display:none;">
15+
<img src="@assets/common/images/menu-@{name}.png" class="menu-icon">
16+
}
17+
@label
18+
@if(count > 0){
19+
<div class="pull-right"><span class="label">@count</span></div>
20+
}
21+
</a>
22+
</li>
23+
}
24+
25+
@html.main("Snippet"){
26+
<div class="container">
27+
<div class="head">
28+
@avatar(gist.userName, 24)
29+
<a href="@path/gist/@gist.userName">@gist.userName</a> /
30+
<a href="@path/gist/@gist.userName/@gist.repositoryName" class="strong">@gist.title</a>
31+
@if(gist.isPrivate){
32+
<span class="label label-warning">Secret</span>
33+
}
34+
@if(editable){
35+
<div class="pull-right">
36+
<a href="@path/gist/@gist.userName/@gist.repositoryName/edit" class="btn">Edit</a>
37+
<a href="@path/gist/@gist.userName/@gist.repositoryName/delete" class="btn" id="delete">Delete</a>
38+
</div>
39+
}
40+
</div>
41+
<div class="muted" style="margin-top: -10px; margin-left: 30px;">
42+
Created at @gist.registeredDate
43+
</div>
44+
</div>
45+
<hr style="margin-bottom: 20px;"/>
46+
<div class="container body">
47+
<div style="width: 170px;" class="pull-right">
48+
<ul class="sidemenu">
49+
<li style="height: 12px"><div class="gradient pull-left" style="height: 12px"></div></li>
50+
@sidemenu(s"${gist.userName}/${gist.repositoryName}", "code" , "Code")
51+
@sidemenu(s"${gist.userName}/${gist.repositoryName}/revisions", "revision", "Revision")
52+
</ul>
53+
</div>
54+
<div style="margin-right: 180px;">
55+
@revisions.map { case (revision, diffs) =>
56+
<div>
57+
<div style="margin-bottom: 8px;">
58+
@avatar(revision, 20) <a href="@path/gist/@revision.authorName">@revision.authorName</a> revised this @helper.html.datetimeago(revision.authorTime)
59+
<div class="pull-right">
60+
<a href="#" class="btn btn-mini monospace">@revision.id.substring(0, 7)</a>
61+
</div>
62+
</div>
63+
<div>
64+
@diffs.zipWithIndex.map { case (diff, i) =>
65+
<table class="table table-bordered">
66+
<tr>
67+
<th style="font-weight: normal; line-height: 27px;" class="box-header">
68+
@diff.changeType match {
69+
case ChangeType.ADD => {
70+
<img src="@assets/common/images/diff_add.png"/> @diff.newPath
71+
}
72+
case ChangeType.MODIFY => {
73+
<img src="@assets/common/images/diff_edit.png"/> @diff.newPath
74+
}
75+
case ChangeType.DELETE => {
76+
<img src="@assets/common/images/diff_delete.png"/> @diff.oldPath
77+
}
78+
case _ => {
79+
}
80+
}
81+
</th>
82+
</tr>
83+
<tr>
84+
<td style="padding: 0;">
85+
@if(diff.newContent != None || diff.oldContent != None){
86+
<div id="[email protected](0, 7)-@i"></div>
87+
<textarea id="[email protected](0, 7)-@i" style="display: none;">@diff.newContent.getOrElse("")</textarea>
88+
<textarea id="[email protected](0, 7)-@i" style="display: none;">@diff.oldContent.getOrElse("")</textarea>
89+
} else {
90+
Not supported
91+
}
92+
</td>
93+
</tr>
94+
</table>
95+
}
96+
</div>
97+
</div>
98+
}
99+
</div>
100+
</div>
101+
<script type="text/javascript" src="@assets/vendors/jsdifflib/difflib.js"></script>
102+
<script type="text/javascript" src="@assets/vendors/jsdifflib/diffview.js"></script>
103+
<link href="@assets/vendors/jsdifflib/diffview.css" type="text/css" rel="stylesheet" />
104+
<script>
105+
$(function(){
106+
renderDiffs(1);
107+
108+
function renderDiffs(viewType){
109+
window.viewType = viewType;
110+
@revisions.map { case (revision, diffs) =>
111+
@diffs.zipWithIndex.map { case (diff, i) =>
112+
@if(diff.newContent != None || diff.oldContent != None){
113+
if($('#[email protected](0, 7)-@i').length > 0){
114+
diffUsingJS('[email protected](0, 7)-@i', '[email protected](0, 7)-@i', '[email protected](0, 7)-@i', viewType);
115+
}
116+
}
117+
}
118+
}
119+
}
120+
});
121+
</script>
122+
}

0 commit comments

Comments
 (0)