ghoul 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +39 -0
- data/LICENSE +20 -0
- data/README.md +46 -0
- data/Rakefile +1 -0
- data/bin/ghoul +19 -0
- data/config.ru +30 -0
- data/ghoul.gemspec +51 -0
- data/lib/ghoul/app.rb +119 -0
- data/lib/ghoul/lib/helpers.rb +64 -0
- data/lib/ghoul/lib/repository.rb +41 -0
- data/lib/ghoul/lib/url_helpers.rb +53 -0
- data/lib/ghoul/public/css/buttons.css +38 -0
- data/lib/ghoul/public/css/coderay.css +136 -0
- data/lib/ghoul/public/css/github-buttons.css +393 -0
- data/lib/ghoul/public/flash/clippy.swf +0 -0
- data/lib/ghoul/public/images/bg.png +0 -0
- data/lib/ghoul/public/images/big_logo.png +0 -0
- data/lib/ghoul/public/images/dir.png +0 -0
- data/lib/ghoul/public/images/gh-icons.png +0 -0
- data/lib/ghoul/public/images/logo-hover.png +0 -0
- data/lib/ghoul/public/images/logo.png +0 -0
- data/lib/ghoul/public/images/txt.png +0 -0
- data/lib/ghoul/views/404.erb +10 -0
- data/lib/ghoul/views/app.sass +316 -0
- data/lib/ghoul/views/blob.erb +11 -0
- data/lib/ghoul/views/commits.erb +11 -0
- data/lib/ghoul/views/diff.erb +16 -0
- data/lib/ghoul/views/error.erb +6 -0
- data/lib/ghoul/views/layout.erb +25 -0
- data/lib/ghoul/views/new_repo.erb +16 -0
- data/lib/ghoul/views/no_commits.erb +34 -0
- data/lib/ghoul/views/partials/_breadcrumbs.erb +6 -0
- data/lib/ghoul/views/partials/_commit.erb +10 -0
- data/lib/ghoul/views/partials/_footer.erb +5 -0
- data/lib/ghoul/views/partials/_repo_header.erb +17 -0
- data/lib/ghoul/views/partials/_repo_top_bar.erb +8 -0
- data/lib/ghoul/views/repo_settings.erb +18 -0
- data/lib/ghoul/views/repositories.erb +73 -0
- data/lib/ghoul/views/setup_repos_path.erb +8 -0
- data/lib/ghoul/views/tree.erb +17 -0
- data/lib/ghoul.rb +24 -0
- data/lib/server.rb +39 -0
- data/lib/version.rb +3 -0
- data/sample +0 -0
- data/spec/ghoul_helpers_spec.rb +62 -0
- data/spec/spec_helper.rb +0 -0
- data/spec/url_helper_spec.rb +56 -0
- metadata +195 -0
@@ -0,0 +1,316 @@
|
|
1
|
+
*
|
2
|
+
:padding 0
|
3
|
+
:margin 0
|
4
|
+
|
5
|
+
body
|
6
|
+
:font-family "Lucida Grande","Lucida Sans Unicode",Helvetica,sans-serif,Verdana,Arial
|
7
|
+
:font-size 13px
|
8
|
+
:background url(data:image/png;base64,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)
|
9
|
+
|
10
|
+
.container
|
11
|
+
:width 810px
|
12
|
+
:margin 0 auto
|
13
|
+
|
14
|
+
.gravatar
|
15
|
+
:border 2px solid #f1f1f1
|
16
|
+
:float left
|
17
|
+
:margin-right 10px
|
18
|
+
:width 30px
|
19
|
+
:height 30px
|
20
|
+
|
21
|
+
#page
|
22
|
+
:float left
|
23
|
+
:width 760px
|
24
|
+
:padding 20px
|
25
|
+
:background #fff
|
26
|
+
:border 5px solid #f1f1f1
|
27
|
+
:margin-top 30px
|
28
|
+
:border-radius 10px
|
29
|
+
|
30
|
+
#header
|
31
|
+
:float left
|
32
|
+
:width 100%
|
33
|
+
:margin-top 20px
|
34
|
+
a#logo
|
35
|
+
:float left
|
36
|
+
:width 139px
|
37
|
+
:height 60px
|
38
|
+
:background url(/images/logo.png)
|
39
|
+
:text-indent -9999px
|
40
|
+
ul
|
41
|
+
:float right
|
42
|
+
:width auto
|
43
|
+
:margin-top 20px
|
44
|
+
:margin-right 20px
|
45
|
+
li
|
46
|
+
:float right
|
47
|
+
:width auto
|
48
|
+
:list-style none
|
49
|
+
:margin-left 30px
|
50
|
+
a
|
51
|
+
:color #fff
|
52
|
+
:font-size 22px
|
53
|
+
:text-decoration none
|
54
|
+
|
55
|
+
#footer
|
56
|
+
:float left
|
57
|
+
:width 100%
|
58
|
+
:padding 20px 0
|
59
|
+
:text-align center
|
60
|
+
p
|
61
|
+
:margin-top 10px
|
62
|
+
:color #666
|
63
|
+
a
|
64
|
+
:color #777
|
65
|
+
|
66
|
+
h1
|
67
|
+
:float left
|
68
|
+
:margin 20px 0
|
69
|
+
|
70
|
+
#commits
|
71
|
+
:float left
|
72
|
+
//:margin-top 20px
|
73
|
+
.commit
|
74
|
+
:float left
|
75
|
+
:border 1px solid #ccc
|
76
|
+
:padding 5px
|
77
|
+
:width 748px
|
78
|
+
:background #f6f9fe
|
79
|
+
:margin-bottom 20px
|
80
|
+
&.indent
|
81
|
+
:background #fff
|
82
|
+
:width 720px
|
83
|
+
:margin-left 28px
|
84
|
+
.data
|
85
|
+
:width 668px
|
86
|
+
.diff a
|
87
|
+
:float right
|
88
|
+
:color #777
|
89
|
+
:text-decoration none
|
90
|
+
&:hover
|
91
|
+
:text-decoration underline
|
92
|
+
.commit_hash
|
93
|
+
:font-size 10px
|
94
|
+
:float left
|
95
|
+
:width 100%
|
96
|
+
:margin-top 10px
|
97
|
+
.data
|
98
|
+
:float left
|
99
|
+
:width 696px
|
100
|
+
.meta
|
101
|
+
:float left
|
102
|
+
:width 100%
|
103
|
+
:margin-top 3px
|
104
|
+
:font-size 12px
|
105
|
+
.name
|
106
|
+
:float left
|
107
|
+
.committed_date
|
108
|
+
:float left
|
109
|
+
:color #888
|
110
|
+
:margin-left 10px
|
111
|
+
a.mailto
|
112
|
+
:color #888
|
113
|
+
:text-decoration none
|
114
|
+
&:hover
|
115
|
+
:text-decoration underline
|
116
|
+
.message
|
117
|
+
:font-size 13px
|
118
|
+
:font-weight bold
|
119
|
+
:float left
|
120
|
+
:width 100%
|
121
|
+
a
|
122
|
+
:color #333
|
123
|
+
:text-decoration none
|
124
|
+
&:hover
|
125
|
+
:text-decoration underline
|
126
|
+
|
127
|
+
#tree
|
128
|
+
:float left
|
129
|
+
:width 100%
|
130
|
+
:background #fff
|
131
|
+
:border-top 1px solid #ccc
|
132
|
+
.tree
|
133
|
+
.name
|
134
|
+
:background url(/images/dir.png) 8px center no-repeat
|
135
|
+
.blob
|
136
|
+
.name
|
137
|
+
:background url(/images/txt.png) 8px center no-repeat
|
138
|
+
.blob, .tree
|
139
|
+
:float left
|
140
|
+
:width 760px
|
141
|
+
:padding 10px 0
|
142
|
+
:border 1px solid #ccc
|
143
|
+
:border-top none
|
144
|
+
:text-indent 20px
|
145
|
+
:background -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(47%,#f6f6f6), color-stop(100%,#ededed))
|
146
|
+
.name
|
147
|
+
:float left
|
148
|
+
:padding-left 10px
|
149
|
+
a
|
150
|
+
:color steelblue
|
151
|
+
:text-decoration none
|
152
|
+
&:hover
|
153
|
+
:text-decoration underline
|
154
|
+
|
155
|
+
#repo_header
|
156
|
+
:float left
|
157
|
+
:width 100%
|
158
|
+
:margin-bottom 20px
|
159
|
+
h2
|
160
|
+
:float left
|
161
|
+
:width 60%
|
162
|
+
:font-size 25px
|
163
|
+
#actions
|
164
|
+
:float left
|
165
|
+
:width 40%
|
166
|
+
.button
|
167
|
+
:float right
|
168
|
+
:margin-left 20px
|
169
|
+
|
170
|
+
.section_bar
|
171
|
+
:float left
|
172
|
+
:width 758px
|
173
|
+
:border 1px solid #ccc
|
174
|
+
:border-bottom none
|
175
|
+
:background -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(47%,#f6f6f6), color-stop(100%,#ededed))
|
176
|
+
a, .title
|
177
|
+
:color #333
|
178
|
+
:text-decoration none
|
179
|
+
:float left
|
180
|
+
:font-weight bold
|
181
|
+
a
|
182
|
+
:padding 5px
|
183
|
+
|
184
|
+
#blob
|
185
|
+
:float left
|
186
|
+
:width 760px
|
187
|
+
:background #f1f1f1
|
188
|
+
:overflow auto
|
189
|
+
|
190
|
+
|
191
|
+
#breadcrumbs
|
192
|
+
:float left
|
193
|
+
:width 100%
|
194
|
+
:font-size 18px
|
195
|
+
:margin-bottom 20px
|
196
|
+
a
|
197
|
+
:color #333
|
198
|
+
|
199
|
+
#repo_info
|
200
|
+
:float left
|
201
|
+
:width 758px
|
202
|
+
:background #f1f1f1
|
203
|
+
:border 1px solid #ccc
|
204
|
+
:border-bottom none
|
205
|
+
#git_url
|
206
|
+
:float left
|
207
|
+
:padding 3px 5px
|
208
|
+
:background #fff
|
209
|
+
:border 1px solid #ccc
|
210
|
+
:border-radius 4px
|
211
|
+
:margin 10px
|
212
|
+
:width 600px
|
213
|
+
#clippy
|
214
|
+
:float left
|
215
|
+
:margin-top 8px
|
216
|
+
|
217
|
+
#repositories
|
218
|
+
:float left
|
219
|
+
:width 100%
|
220
|
+
:font-size 30px
|
221
|
+
:border-top 1px solid #ccc
|
222
|
+
a
|
223
|
+
:text-decoration none
|
224
|
+
:color #333
|
225
|
+
.repository
|
226
|
+
:padding 10px
|
227
|
+
:border 1px solid #ccc
|
228
|
+
:border-top none
|
229
|
+
:float left
|
230
|
+
:width 738px
|
231
|
+
:background -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(47%,#f6f6f6), color-stop(100%,#ededed))
|
232
|
+
.data
|
233
|
+
:float left
|
234
|
+
:width 100%
|
235
|
+
:margin-top 10px
|
236
|
+
.message, .new_repo
|
237
|
+
:float left
|
238
|
+
:margin-top 3px
|
239
|
+
:font-size 10px
|
240
|
+
:background #fff
|
241
|
+
:border 1px solid #ccc
|
242
|
+
:padding 4px
|
243
|
+
:border-radius 5px
|
244
|
+
:font-weight bold
|
245
|
+
|
246
|
+
#diffs
|
247
|
+
.diff
|
248
|
+
:float left
|
249
|
+
:width 100%
|
250
|
+
:overflow none
|
251
|
+
:margin-bottom 20px
|
252
|
+
|
253
|
+
#guide
|
254
|
+
:float left
|
255
|
+
:width 100%
|
256
|
+
code
|
257
|
+
:float left
|
258
|
+
:background #f6f9fe
|
259
|
+
:padding 5px
|
260
|
+
:border 1px solid #ccc
|
261
|
+
:width 740px
|
262
|
+
:margin 10px 0
|
263
|
+
:border-radius 5px
|
264
|
+
h2
|
265
|
+
:margin-top 40px
|
266
|
+
:float left
|
267
|
+
:width 100%
|
268
|
+
p
|
269
|
+
:float left
|
270
|
+
:margin-top 20px
|
271
|
+
:width 100%
|
272
|
+
:line-height 22px
|
273
|
+
ul
|
274
|
+
:float left
|
275
|
+
:margin-left 40px
|
276
|
+
:width 700px
|
277
|
+
:margin-top 10px
|
278
|
+
li
|
279
|
+
:float left
|
280
|
+
:width 100%
|
281
|
+
:margin-top 10px
|
282
|
+
|
283
|
+
form
|
284
|
+
:float left
|
285
|
+
:width 100%
|
286
|
+
:margin-bottom 30px
|
287
|
+
input
|
288
|
+
:font-size 28px
|
289
|
+
:padding 4px
|
290
|
+
:width 740px
|
291
|
+
|
292
|
+
#repo_settings
|
293
|
+
:float left
|
294
|
+
:border 1px solid #ccc
|
295
|
+
:width 738px
|
296
|
+
:padding 10px
|
297
|
+
p
|
298
|
+
:margin-top 20px
|
299
|
+
code
|
300
|
+
:background #f1f1f1
|
301
|
+
:padding 3px
|
302
|
+
:float left
|
303
|
+
:width 730px
|
304
|
+
:margin 20px 0
|
305
|
+
:border 1px solid #ccc
|
306
|
+
a
|
307
|
+
:margin-top 20px
|
308
|
+
|
309
|
+
#big_link
|
310
|
+
:float left
|
311
|
+
:width 100%
|
312
|
+
:padding 40px 0
|
313
|
+
:font-size 26px
|
314
|
+
|
315
|
+
a
|
316
|
+
:color dodgerblue
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<% title "#{@repository} #{params[:splat][0]}" %>
|
2
|
+
|
3
|
+
<%=partial(:repo_header) %>
|
4
|
+
|
5
|
+
<div class="section_bar">
|
6
|
+
<%=link_to "Raw", raw_blob_for_commit_path(@repository, params[:commit], params[:splat][0]) %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div id="blob">
|
10
|
+
<%=@syntaxer%>
|
11
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% title "diffs on #{@commit}" %>
|
2
|
+
|
3
|
+
<%=partial(:repo_header) %>
|
4
|
+
|
5
|
+
<div id="diffs">
|
6
|
+
<% @commit.diffs.each do |diff| %>
|
7
|
+
<div class="section_bar">
|
8
|
+
<div class="title">
|
9
|
+
<%=link_to diff.b_path, blob_for_commit_path(@repository, @commit, diff.b_path) %>
|
10
|
+
</div>
|
11
|
+
<div class="diff">
|
12
|
+
<%=CodeRay.scan(diff.diff, :diff, :highlight_code => false, :inline_diff => false).div(:css => :class) %>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
16
|
+
</div>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
5
|
+
<title><%= @title %> - Ghoul v<%= Ghoul::VERSION %></title>
|
6
|
+
<%= stylesheet_link_tag :app, :coderay, :buttons, :'github-buttons' %>
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
<div class="container">
|
10
|
+
<div id="header">
|
11
|
+
<a href="<%= url("/") %>" id="logo">Ghoul v<%= Ghoul::VERSION %></a>
|
12
|
+
<% if repos_path_exists? %>
|
13
|
+
<ul>
|
14
|
+
<li><%= link_to "Repositories", repositories_path %></li>
|
15
|
+
<li><a href="<%= url("/new_repo") %>" class="thoughtbot_button">New Repo</a></li>
|
16
|
+
</ul>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
<div id="page">
|
20
|
+
<%= yield %>
|
21
|
+
</div>
|
22
|
+
<%= partial(:footer) %>
|
23
|
+
</div>
|
24
|
+
</body>
|
25
|
+
</html>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% title "New repository" %>
|
2
|
+
<form action="<%=url("/new_repo")%>" method="post">
|
3
|
+
<input name="name" placeholder="Repository name"/>
|
4
|
+
</form>
|
5
|
+
|
6
|
+
<div id="guide">
|
7
|
+
<h2>Creating A Repository</h2>
|
8
|
+
|
9
|
+
<p>Please bear in mind when you create a repository that:</p>
|
10
|
+
|
11
|
+
<p>There is currently no authentication built into Ghoul. This first version is a proof of concept and I hope that something will be able to be built into future versions of this software.</p>
|
12
|
+
|
13
|
+
<p>If you change ports you will need to change add the remote repository again on your local repository.</p>
|
14
|
+
|
15
|
+
</div>
|
16
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<% title "Setting up your repository" %>
|
2
|
+
|
3
|
+
<div id="guide">
|
4
|
+
<h2>Global Setup:</h2>
|
5
|
+
<pre><code>
|
6
|
+
git config --global user.name "Your Name"
|
7
|
+
git config --global user.email author@accountsapp.com
|
8
|
+
</code>
|
9
|
+
</pre>
|
10
|
+
|
11
|
+
<h2>Next Steps:</h2>
|
12
|
+
<pre><code>
|
13
|
+
mkdir <%=@repository%>
|
14
|
+
cd <%=@repository%>
|
15
|
+
touch README
|
16
|
+
git init
|
17
|
+
git add README
|
18
|
+
git commit -m 'first commit'
|
19
|
+
git remote add origin <%=repository_git_url(@repository)%>
|
20
|
+
git push -u origin master
|
21
|
+
</code>
|
22
|
+
</pre>
|
23
|
+
|
24
|
+
<h2>Existing Repository:</h2>
|
25
|
+
<pre><code>
|
26
|
+
cd existing_repository
|
27
|
+
git remote add origin <%=repository_git_url(@repository)%>
|
28
|
+
git push -u origin master
|
29
|
+
</code>
|
30
|
+
</pre>
|
31
|
+
|
32
|
+
<p>When you're done, <%= link_to "click here", repository_path(@repository) %></p>
|
33
|
+
</div>
|
34
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<%= gravatar_image(commit.author.email, 30) %>
|
2
|
+
|
3
|
+
<div class="data">
|
4
|
+
<div class="message"><%= link_to commit.message, tree_for_commit_path(@repository, commit.id) %></div>
|
5
|
+
<div class="meta">
|
6
|
+
<div class="name"><%= mail_to commit.author.email, commit.author.name %></div>
|
7
|
+
<div class="committed_date"><%= date_format commit.committed_date %></div>
|
8
|
+
<div class="diff"><%= link_to "diff", diff_for_commit_path(@repository, commit.id) %></div>
|
9
|
+
</div>
|
10
|
+
</div>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<div id='footer'>
|
2
|
+
<p>Powered by <%= link_to "Ghoul", "http://github.com/georgedrummond/ghoul" %> v<%=Ghoul::VERSION %></p>
|
3
|
+
<p>© <%= link_to "George Drummond", "http://www.georgedrummond.com" %> & <%= link_to "AccountsApp Ltd", "http://accountsapp.com" %> 2011. All rights reserved</p>
|
4
|
+
<p>Released under the MIT license</p>
|
5
|
+
</div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%= partial :repo_top_bar %>
|
2
|
+
|
3
|
+
<div id="repo_info">
|
4
|
+
<div id="git_url"><%= repository_git_url(@repository) %></div>
|
5
|
+
<div id="clippy"><%= clippy(repository_git_url(@repository), '#f1f1f1') %></div>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<div id="commits">
|
9
|
+
<div class="commit"><%= partial(:commit, :commit => @newest_commit) %></div>
|
10
|
+
<% if @commit.id != @newest_commit.id %>
|
11
|
+
<div class="indent commit">
|
12
|
+
<%= partial(:commit, :commit => @commit) %>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<%= partial(:breadcrumbs) unless @hide_breadcrumbs %>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<div id="repo_header">
|
2
|
+
<h2><%=@repository %></h2>
|
3
|
+
<div id="actions">
|
4
|
+
<a class="button log icon" href="<%=commits_path(@repository)%>">Commits</a>
|
5
|
+
<a class="button settings icon" href="<%=repository_settings_path(@repository)%>">Settings</a>
|
6
|
+
<a class="button home icon" href="<%=repository_path(@repository)%>">Trunk</a>
|
7
|
+
</div>
|
8
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% title "Settings for #{@repository}" %>
|
2
|
+
|
3
|
+
<%=partial :repo_top_bar %>
|
4
|
+
|
5
|
+
<div id="repo_settings">
|
6
|
+
<h2>About this <%=@repository %> repository</h2>
|
7
|
+
|
8
|
+
<p>You can clone your repository by running the command <b>git clone <%=clone_url(@repository) %></b>.</p>
|
9
|
+
|
10
|
+
<p>Please note that <b>Ghoul</b> currently <b>does not use any form of authentication</b>. This will be added in future versions. Until we build in authentication please only use this to host your repositories in a secure environment as <b>anyone can push to your repository</b>.</p>
|
11
|
+
|
12
|
+
<pre><code>Want to delete this repository? Just delete the folder at <%= repos_path %>/<%= @repository %></code></pre>
|
13
|
+
<!--
|
14
|
+
<form action="<%= url("/repository/#{@repository}/delete") %>" method="post" style="margin-top:40px">
|
15
|
+
<button class="danger button">Delete repository</button>
|
16
|
+
</form>
|
17
|
+
-->
|
18
|
+
</div>
|
@@ -0,0 +1,73 @@
|
|
1
|
+
<% title "Repositories" %>
|
2
|
+
|
3
|
+
<% unless @repositories.count == 2 %>
|
4
|
+
<h1>Repositories</h1>
|
5
|
+
<div id="repositories">
|
6
|
+
<% @repositories.each do |repo| %>
|
7
|
+
<% unless repo == "." || repo == ".." %>
|
8
|
+
<div class="repository">
|
9
|
+
<div class="name"><%= link_to repo, repository_path(repo) %></div>
|
10
|
+
<div class="data">
|
11
|
+
<% begin %>
|
12
|
+
<% last_commit = commit_from_repository(repo, "trunk") %>
|
13
|
+
<div class="message">
|
14
|
+
Last updated by <%= last_commit.author.name %> on <%= date_format(last_commit.committed_date) %>
|
15
|
+
</div>
|
16
|
+
<% rescue %>
|
17
|
+
<div class="message">New repository</div>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
<% end %>
|
22
|
+
<% end %>
|
23
|
+
</div>
|
24
|
+
<% else %>
|
25
|
+
|
26
|
+
<div id="guide">
|
27
|
+
<h1>Ghoul - Prettier Git For Everyone :)</h1>
|
28
|
+
<p><a href="http://github.com/georgedrummond/ghoul">Ghoul</a> is a simple yet good looking interface for your git repositories written in <a href="http://sinatrarb.com">sinatra</a>. It is currently only for demonstration purposes and use on your secure local machine as it does not enforce any authentication as of yet.</p>
|
29
|
+
|
30
|
+
<h2>Installation</h2>
|
31
|
+
<p>Ghoul can be run either using the ghoul gem or by downloading the git repository and running through the rackup command.</p>
|
32
|
+
<pre><code># Installing via rubygems
|
33
|
+
|
34
|
+
gem install ghoul
|
35
|
+
ghoul server</code></pre>
|
36
|
+
<pre><code># Installing from the git repository
|
37
|
+
|
38
|
+
git clone http://github.com/georgedrummond/ghoul
|
39
|
+
cd ghoul
|
40
|
+
bundle install
|
41
|
+
rackup
|
42
|
+
</code></pre>
|
43
|
+
|
44
|
+
<h2>How it works</h2>
|
45
|
+
<p>Ghoul uses the grit, written by the guys at github for parsing your repositories which are located in a folder named "repos" within your
|
46
|
+
home folder e.g. /Users/georgedrummond/repos. For git push, ghoul uses grack. Grack has no authentication so ghoul should only be used
|
47
|
+
on your local machine.</p>
|
48
|
+
|
49
|
+
<h2>License</h2>
|
50
|
+
<pre><code>Copyright (c) 2011 George Drummond, george@accountsapp.com
|
51
|
+
|
52
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
53
|
+
a copy of this software and associated documentation files (the
|
54
|
+
"Software"), to deal in the Software without restriction, including
|
55
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
56
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
57
|
+
permit persons to whom the Software is furnished to do so, subject to
|
58
|
+
the following conditions:
|
59
|
+
|
60
|
+
The above copyright notice and this permission notice shall be
|
61
|
+
included in all copies or substantial portions of the Software.
|
62
|
+
|
63
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
64
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
65
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
66
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
67
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
68
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
69
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</code></pre>
|
70
|
+
</div>
|
71
|
+
|
72
|
+
<% end %>
|
73
|
+
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<% title "Please set up the repos path"%>
|
2
|
+
<div id="guide">
|
3
|
+
<h2>Please Set Up The Repos Path</h2>
|
4
|
+
<p>Before you can run <b>Ghoul</b> you must setup the home for your ghoul repositories. This is where we will store our bare repositories and its where you will push to.</p>
|
5
|
+
<p>To continue please create an empty folder in <b><%= repos_path %></b></p>
|
6
|
+
<pre><code>$ mkdir <%= repos_path %></code></pre>
|
7
|
+
<p>When you have done that please <a href="<%= repositories_path %>">click here</a></p>
|
8
|
+
</div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<% title "#{@repository} tree" %>
|
2
|
+
|
3
|
+
<%=partial :repo_header %>
|
4
|
+
|
5
|
+
<div id="tree">
|
6
|
+
<% @resource.contents.sort { |a, b| [b.class.name, a.name.downcase] <=> [a.class.name, b.name.downcase] }.each do |f| %>
|
7
|
+
<% if f.is_a?(Grit::Tree) %>
|
8
|
+
<div class="tree">
|
9
|
+
<div class="name"><%= link_to "#{f.name}/", tree_for_commit_path(@repository, params[:commit], params[:splat][0], f.name) %></div>
|
10
|
+
</div>
|
11
|
+
<% else %>
|
12
|
+
<div class="blob">
|
13
|
+
<div class="name"><%= link_to f.name, blob_for_commit_path(@repository, params[:commit], params[:splat][0], f.name) %></div>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
data/lib/ghoul.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
$:.unshift File.dirname(__FILE__)
|
3
|
+
|
4
|
+
|
5
|
+
require "sinatra"
|
6
|
+
require "sass"
|
7
|
+
require "georgedrummond_sinatra_helpers"
|
8
|
+
require "grit"
|
9
|
+
require "coderay"
|
10
|
+
require "redcarpet"
|
11
|
+
require "time"
|
12
|
+
require "erb"
|
13
|
+
|
14
|
+
def require_all(path)
|
15
|
+
glob = File.join(File.dirname(__FILE__), path, '*.rb')
|
16
|
+
Dir[glob].each do |f|
|
17
|
+
require f
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
require "version"
|
22
|
+
require_all "ghoul/lib"
|
23
|
+
require "ghoul/app"
|
24
|
+
|