ginatra 2.1.1 → 2.2.0
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 +1 -0
- data/README.md +12 -1
- data/Rakefile +7 -5
- data/bin/ginatra +2 -2
- data/bin/ginatra-daemon +2 -2
- data/bin/ginatra-directory +2 -2
- data/bin/ginatra-server +10 -4
- data/config.ru +2 -2
- data/lib/ginatra.rb +29 -30
- data/lib/ginatra/config.rb +36 -1
- data/lib/ginatra/helpers.rb +37 -14
- data/lib/ginatra/repo.rb +9 -0
- data/lib/ginatra/repo_list.rb +17 -9
- data/rackup.ru +2 -2
- data/spec/repo_list_spec.rb +60 -1
- data/spec/spec_helper.rb +10 -1
- data/views/_commit_info_box.erb +3 -3
- data/views/_header.erb +1 -1
- data/views/_tree_part.erb +1 -1
- data/views/atom.builder +1 -1
- data/views/blob.erb +2 -2
- data/views/commit.erb +2 -2
- data/views/index.erb +1 -1
- data/views/layout.erb +9 -8
- data/views/log.erb +5 -5
- data/views/tree.erb +4 -4
- metadata +14 -10
- data/.gitmodules +0 -3
- data/TODO.md +0 -10
- data/VERSION +0 -1
- data/ginatra.gemspec +0 -108
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -31,7 +31,18 @@ Next, just do the following (your setup may require sudo):
|
|
31
31
|
|
32
32
|
$ gem install ginatra
|
33
33
|
|
34
|
-
This pulls down
|
34
|
+
This pulls down most of the required dependencies too.
|
35
|
+
|
36
|
+
The last dependency you need is pygments, an awesome python syntax highlighter.
|
37
|
+
To check whether you have it, run:
|
38
|
+
|
39
|
+
$ which pygmentize
|
40
|
+
|
41
|
+
If this returns a path pointing to a 'pygmentize' binary, then you're all set.
|
42
|
+
If not you'll need to install pygments. Look at the last section of the
|
43
|
+
[jekyll wiki "install" page](http://wiki.github.com/mojombo/jekyll/install)
|
44
|
+
to see how to install it. Also make sure again that the `pygmentize` binary
|
45
|
+
is on your path.
|
35
46
|
|
36
47
|
If you want to play around with the code, you can clone the repository. This also allows you
|
37
48
|
to use a special rackup file to mount it where you wish. I am yet to sort out some of the
|
data/Rakefile
CHANGED
@@ -2,8 +2,9 @@ require 'rubygems'
|
|
2
2
|
require 'cucumber/rake/task'
|
3
3
|
require 'spec/rake/spectask'
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
$:.unshift File.expand_path("#{File.dirname(__FILE__)}/lib")
|
6
|
+
|
7
|
+
require "ginatra"
|
7
8
|
|
8
9
|
task :default => ['rake:spec', 'rake:features']
|
9
10
|
|
@@ -54,7 +55,7 @@ namespace :setup do
|
|
54
55
|
|
55
56
|
desc "Installs the Required Gems"
|
56
57
|
task :gems do |t|
|
57
|
-
gems = %w(grit kematzy-sinatra-cache
|
58
|
+
gems = %w(grit kematzy-sinatra-cache)
|
58
59
|
puts %x(gem install #{gems.join(" ")})
|
59
60
|
end
|
60
61
|
|
@@ -75,10 +76,11 @@ begin
|
|
75
76
|
gemspec.email = "sam@lenary.co.uk"
|
76
77
|
gemspec.homepage = "http://lenary.github.com/ginatra"
|
77
78
|
gemspec.authors = ["Sam Elliott", "Ryan Bigg"]
|
79
|
+
gemspec.version = Ginatra::VERSION
|
78
80
|
gemspec.add_dependency('sinatra', '>=0.9.4')
|
79
81
|
gemspec.add_dependency('grit', '>=1.1.1')
|
80
|
-
gemspec.add_dependency('
|
81
|
-
gemspec.
|
82
|
+
gemspec.add_dependency('vegas', '>=0.1.0')
|
83
|
+
gemspec.add_dependency('open4', '>= 0.9.6')
|
82
84
|
end
|
83
85
|
rescue LoadError
|
84
86
|
puts "Jeweler not available. Install it with: sudo gem install jeweler"
|
data/bin/ginatra
CHANGED
data/bin/ginatra-daemon
CHANGED
data/bin/ginatra-directory
CHANGED
data/bin/ginatra-server
CHANGED
@@ -1,10 +1,16 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
begin
|
4
|
+
require 'rubygems'
|
5
|
+
rescue LoadError
|
6
|
+
end
|
7
|
+
require "vegas"
|
8
|
+
|
9
|
+
$:.unshift File.expand_path("#{File.dirname(__FILE__)}/../lib")
|
10
|
+
|
11
|
+
require "ginatra"
|
4
12
|
|
5
|
-
|
6
|
-
require "#{current_path}/../vendor/vegas/lib/vegas"
|
7
|
-
Vegas::Runner.new(Ginatra::App, 'ginatra-server', :port => Ginatra::Config.port) do |runner, opts, app|
|
13
|
+
Vegas::Runner.new(Ginatra::App, 'ginatra-server', {:port => Ginatra::Config.port, :host => Ginatra::Config.host}) do |runner, opts, app|
|
8
14
|
|
9
15
|
opts.banner = "Usage: ginatra-server [[options] start | stop | status]"
|
10
16
|
|
data/config.ru
CHANGED
data/lib/ginatra.rb
CHANGED
@@ -5,28 +5,33 @@ rescue LoadError
|
|
5
5
|
end
|
6
6
|
require 'sinatra/base'
|
7
7
|
require 'grit'
|
8
|
-
require 'coderay'
|
9
|
-
|
10
|
-
current_path = File.expand_path(File.dirname(__FILE__))
|
11
8
|
|
12
9
|
# The Ginatra Namespace Module
|
13
10
|
module Ginatra; end
|
14
11
|
|
15
|
-
#
|
16
|
-
|
12
|
+
# i feel this is cleaner than the #{current_path} shenanigans ($: is the load path)
|
13
|
+
$:.unshift File.dirname(__FILE__)
|
14
|
+
|
15
|
+
# Loading in whichever order
|
16
|
+
require "ginatra/repo"
|
17
|
+
require "ginatra/repo_list"
|
18
|
+
require "ginatra/config"
|
19
|
+
require "ginatra/helpers"
|
17
20
|
|
18
|
-
require "
|
21
|
+
require "sinatra/partials"
|
19
22
|
|
20
23
|
# Written myself. i know, what the hell?!
|
21
24
|
module Ginatra
|
22
25
|
|
23
26
|
# A standard error class for inheritance.
|
24
|
-
# @todo Look for a refactor.
|
25
27
|
class Error < StandardError; end
|
26
28
|
|
27
29
|
# An error related to a commit somewhere.
|
28
|
-
|
29
|
-
|
30
|
+
class CommitsError < Error
|
31
|
+
def initialize(repo)
|
32
|
+
super("Something went wrong looking for the commits for #{repo}")
|
33
|
+
end
|
34
|
+
end
|
30
35
|
|
31
36
|
# Error raised when commit ref passed in parameters
|
32
37
|
# does not exist in repository
|
@@ -36,9 +41,7 @@ module Ginatra
|
|
36
41
|
end
|
37
42
|
end
|
38
43
|
|
39
|
-
|
40
|
-
# @todo look for a refactor that is rip compatible
|
41
|
-
VERSION = File.new("#{current_path}/../VERSION").read
|
44
|
+
VERSION = "2.2.0"
|
42
45
|
|
43
46
|
# The main application class.
|
44
47
|
#
|
@@ -46,15 +49,21 @@ module Ginatra
|
|
46
49
|
# and is what is mounted by the +rackup.ru+ files.
|
47
50
|
class App < Sinatra::Base
|
48
51
|
|
52
|
+
# logger that can be used with the Sinatra code
|
53
|
+
def logger
|
54
|
+
Ginatra::Config.logger
|
55
|
+
end
|
56
|
+
|
49
57
|
configure do
|
50
|
-
current_path = File.expand_path(File.dirname(__FILE__))
|
51
58
|
Config.load!
|
59
|
+
set :host, Ginatra::Config[:host]
|
52
60
|
set :port, Ginatra::Config[:port]
|
53
61
|
set :raise_errors, Proc.new { test? }
|
54
62
|
set :show_exceptions, Proc.new { development? }
|
55
63
|
set :dump_errors, true
|
56
64
|
set :logging, Proc.new { !test? }
|
57
65
|
set :static, true
|
66
|
+
current_path = File.expand_path(File.dirname(__FILE__))
|
58
67
|
set :public, "#{current_path}/../public"
|
59
68
|
set :views, "#{current_path}/../views"
|
60
69
|
end
|
@@ -79,8 +88,7 @@ module Ginatra
|
|
79
88
|
end
|
80
89
|
|
81
90
|
# The root route
|
82
|
-
#
|
83
|
-
# @todo how does this work?
|
91
|
+
# This works by interacting with the Ginatra::Repolist singleton.
|
84
92
|
get '/' do
|
85
93
|
erb :index
|
86
94
|
end
|
@@ -175,6 +183,7 @@ module Ginatra
|
|
175
183
|
get '/:repo/tree/:tree' do
|
176
184
|
@repo = RepoList.find(params[:repo])
|
177
185
|
|
186
|
+
# this might look silly but it's needed to pass the --verify.
|
178
187
|
if (tag = @repo.git.method_missing('rev_parse', {}, '--verify', "#{params[:tree]}^{tree}")).empty?
|
179
188
|
# we don't have a tree.
|
180
189
|
not_found
|
@@ -184,8 +193,8 @@ module Ginatra
|
|
184
193
|
|
185
194
|
@tree = @repo.tree(params[:tree]) # can also be a ref (i think)
|
186
195
|
@path = {}
|
187
|
-
@path[:tree] = "
|
188
|
-
@path[:blob] = "
|
196
|
+
@path[:tree] = "#{params[:repo]}/tree/#{params[:tree]}"
|
197
|
+
@path[:blob] = "#{params[:repo]}/blob/#{params[:tree]}"
|
189
198
|
erb(:tree)
|
190
199
|
end
|
191
200
|
|
@@ -202,12 +211,12 @@ module Ginatra
|
|
202
211
|
if @tree.is_a?(Grit::Blob)
|
203
212
|
# we need @tree to be a tree. if it's a blob, send it to the blob page
|
204
213
|
# this allows people to put in the remaining part of the path to the file, rather than endless clicks like you need in github
|
205
|
-
redirect "
|
214
|
+
redirect "#{params[:repo]}/blob/#{params[:tree]}/#{params[:splat].first}"
|
206
215
|
else
|
207
216
|
etag(@tree.id)
|
208
217
|
@path = {}
|
209
|
-
@path[:tree] = "
|
210
|
-
@path[:blob] = "
|
218
|
+
@path[:tree] = "#{params[:repo]}/tree/#{params[:tree]}/#{params[:splat].first}"
|
219
|
+
@path[:blob] = "#{params[:repo]}/blob/#{params[:tree]}/#{params[:splat].first}"
|
211
220
|
erb(:tree)
|
212
221
|
end
|
213
222
|
end
|
@@ -239,16 +248,6 @@ module Ginatra
|
|
239
248
|
redirect "/#{params[:repo]}/tree/#{params[:tree]}/#{params[:splat].first}"
|
240
249
|
else
|
241
250
|
etag(@blob.id)
|
242
|
-
extension = params[:splat].first.split(".").last
|
243
|
-
@highlighter = case extension
|
244
|
-
when 'js'
|
245
|
-
'javascript'
|
246
|
-
when 'css'
|
247
|
-
'css'
|
248
|
-
end
|
249
|
-
|
250
|
-
@highlighter ||= 'ruby'
|
251
|
-
|
252
251
|
erb(:blob)
|
253
252
|
end
|
254
253
|
end
|
data/lib/ginatra/config.rb
CHANGED
@@ -15,9 +15,44 @@ module Ginatra
|
|
15
15
|
:git_dirs => [File.expand_path("#{current_path}/../../repos/*")],
|
16
16
|
:ignored_files => ['README.md'],
|
17
17
|
:description => "View My Git Repositories",
|
18
|
-
:port => 9797
|
18
|
+
:port => 9797,
|
19
|
+
:host => "0.0.0.0",
|
20
|
+
:prefix => "/"
|
19
21
|
}
|
20
22
|
|
23
|
+
def self.logger
|
24
|
+
return @logger if @logger
|
25
|
+
|
26
|
+
log_file = Ginatra::Config[:log_file].to_s || STDOUT
|
27
|
+
|
28
|
+
# create log_file location
|
29
|
+
# The log_file config option should be an absolute file system path
|
30
|
+
# It doesn't have to exist, but ginatra should have the proper file system privileges to create the directories
|
31
|
+
# and files along the specified path
|
32
|
+
unless log_file == STDOUT
|
33
|
+
parent_dir, separator, file_component = log_file.rpartition("/")
|
34
|
+
FileUtils.mkdir_p parent_dir
|
35
|
+
FileUtils.touch log_file
|
36
|
+
end
|
37
|
+
|
38
|
+
# determine log level from config file
|
39
|
+
# The log_level config option should be one of the Logger::Severity constant names (case doesn't matter)
|
40
|
+
# example: :log_level: debug
|
41
|
+
log_level = Ginatra::Config[:log_level]
|
42
|
+
|
43
|
+
if log_level.nil?
|
44
|
+
log_level = Logger::WARN
|
45
|
+
else
|
46
|
+
log_level = Logger.const_get(log_level.to_s.upcase.to_sym)
|
47
|
+
log_level = Logger::WARN if log_level.nil?
|
48
|
+
end
|
49
|
+
|
50
|
+
@logger = Logger.new(log_file)
|
51
|
+
@logger.level = log_level
|
52
|
+
@logger.formatter = Proc.new {|s, t, n, msg| "[#{t}] #{msg}\n"}
|
53
|
+
@logger
|
54
|
+
end
|
55
|
+
|
21
56
|
# Dumps the Default configuration to +CONFIG_PATH+,
|
22
57
|
# WITHOUT regard for what's already there.
|
23
58
|
#
|
data/lib/ginatra/helpers.rb
CHANGED
@@ -1,10 +1,22 @@
|
|
1
1
|
require "digest/md5"
|
2
|
+
require "open4"
|
2
3
|
|
3
4
|
module Ginatra
|
4
5
|
# Helpers used in the views usually,
|
5
6
|
# but not exclusively.
|
6
7
|
module Helpers
|
7
8
|
|
9
|
+
# constructs the URL used in the layout's base tag
|
10
|
+
def prefix_url(rest_of_url="")
|
11
|
+
prefix = Ginatra::Config[:prefix].to_s
|
12
|
+
|
13
|
+
if prefix.length > 0 && prefix[-1].chr == "/"
|
14
|
+
prefix.chop!
|
15
|
+
end
|
16
|
+
|
17
|
+
"#{prefix}/#{rest_of_url}"
|
18
|
+
end
|
19
|
+
|
8
20
|
# takes an email and returns a url to a secure gravatar
|
9
21
|
#
|
10
22
|
# @param [String] email the email address
|
@@ -59,7 +71,7 @@ module Ginatra
|
|
59
71
|
# @return [String] HTML link to the given ref with class attached.
|
60
72
|
def commit_ref(ref, repo_param)
|
61
73
|
ref_class = ref.class.to_s.split("::")[1].to_s
|
62
|
-
"<a class=\"ref #{ref_class}\" href=\"
|
74
|
+
"<a class=\"ref #{ref_class}\" href=\"" + prefix_url("#{repo_param}/#{ref.name}") + "\">#{ref.name}</a>"
|
63
75
|
end
|
64
76
|
|
65
77
|
# calls +Ginatra::Helpers#commit_ref+ for each ref in the commit
|
@@ -84,7 +96,7 @@ module Ginatra
|
|
84
96
|
#
|
85
97
|
# @return [String] the HTML link to the archive.
|
86
98
|
def archive_link(tree, repo_param)
|
87
|
-
"<a class=\"download\" href=\"
|
99
|
+
"<a class=\"download\" href=\"" + prefix_url("#{repo_param}/archive/#{tree.id}.tar.gz") + "\" title=\"Download a tar.gz snapshot of this Tree\">Download Archive</a>"
|
88
100
|
end
|
89
101
|
|
90
102
|
# returns a string including the link to download a patch for a certain
|
@@ -96,7 +108,7 @@ module Ginatra
|
|
96
108
|
#
|
97
109
|
# @return [String] the HTML link to the patch
|
98
110
|
def patch_link(commit, repo_param)
|
99
|
-
"<a class=\"download\" href=\"
|
111
|
+
"<a class=\"download\" href=\"" + prefix_url("#{repo_param}/commit/#{commit.id}.patch") + "\" title=\"Download a patch file of this Commit\">Download Patch</a>"
|
100
112
|
end
|
101
113
|
|
102
114
|
# returns a HTML (+<ul>+) list of the files altered in a given commit.
|
@@ -123,14 +135,6 @@ module Ginatra
|
|
123
135
|
"<ul id='files'>#{out.join}</ul>"
|
124
136
|
end
|
125
137
|
|
126
|
-
# returns some html containing the Coderay'd diff files.
|
127
|
-
#
|
128
|
-
# @param [String] diff the diff you want highlighted
|
129
|
-
# @return [String] the highlighted diff
|
130
|
-
def diff(diff)
|
131
|
-
diff = CodeRay.scan(diff, :diff).div(:line_numbers => :table, :css => :class)
|
132
|
-
end
|
133
|
-
|
134
138
|
# Formats the text to remove multiple spaces and newlines, and then inserts
|
135
139
|
# HTML linebreaks.
|
136
140
|
#
|
@@ -209,8 +213,7 @@ module Ginatra
|
|
209
213
|
end
|
210
214
|
|
211
215
|
# Returns the Hostname of the given install.
|
212
|
-
#
|
213
|
-
# @todo Where is this used?
|
216
|
+
# used in the atom feeds.
|
214
217
|
#
|
215
218
|
# stolen from Marley
|
216
219
|
#
|
@@ -226,8 +229,28 @@ module Ginatra
|
|
226
229
|
#
|
227
230
|
# @return [String] the HTML containing the link to the feed.
|
228
231
|
def atom_feed_link(repo_param, ref=nil)
|
229
|
-
"<a href=\"
|
232
|
+
"<a href=\"" + prefix_url("#{repo_param}#{"/#{ref}" if !ref.nil?}.atom") + "\" title=\"Atom Feed\" class=\"atom\">Feed</a>"
|
230
233
|
end
|
231
234
|
|
235
|
+
def pygmentize(content, filename=nil)
|
236
|
+
type = !filename ? "diff" : pygmentize_type(filename)
|
237
|
+
html_output = ''
|
238
|
+
Open4.popen4("pygmentize -l #{type} -f html") do |pid, stdin, stdout, stderr|
|
239
|
+
stdin.puts content
|
240
|
+
stdin.close
|
241
|
+
html_output = stdout.read.strip
|
242
|
+
[stdout, stderr].each {|io| io.close }
|
243
|
+
end
|
244
|
+
html_output
|
245
|
+
end
|
246
|
+
|
247
|
+
def pygmentize_type(filename)
|
248
|
+
type =''
|
249
|
+
Open4.popen4("pygmentize -N #{filename}") do |pid, stdin, stdout, stderr|
|
250
|
+
type = stdout.read.strip
|
251
|
+
[stdin, stdout, stderr].each {|io| io.close }
|
252
|
+
end
|
253
|
+
type
|
254
|
+
end
|
232
255
|
end
|
233
256
|
end
|
data/lib/ginatra/repo.rb
CHANGED
@@ -82,5 +82,14 @@ module Ginatra
|
|
82
82
|
@repo.send(sym, *args, &block)
|
83
83
|
end
|
84
84
|
|
85
|
+
# to correspond to the #method_missing definition
|
86
|
+
def respond_to?(sym)
|
87
|
+
@repo.respond_to?(sym) || super
|
88
|
+
end
|
89
|
+
|
90
|
+
# not sure why we need this but whatever.
|
91
|
+
def to_s
|
92
|
+
@name.to_s
|
93
|
+
end
|
85
94
|
end
|
86
95
|
end
|
data/lib/ginatra/repo_list.rb
CHANGED
@@ -26,13 +26,13 @@ module Ginatra
|
|
26
26
|
|
27
27
|
# searches through the configured directory globs to find all the repositories
|
28
28
|
# and adds them if they're not already there.
|
29
|
-
#
|
30
|
-
# @todo Docs: what the hell does this return?
|
31
29
|
def refresh
|
32
|
-
|
30
|
+
list.clear
|
31
|
+
Ginatra::Config.git_dirs.map do |git_dir|
|
33
32
|
files = Dir.glob(git_dir)
|
34
33
|
files.each { |e| add(e) unless Ginatra::Config.ignored_files.include?(File.split(e).last) }
|
35
34
|
end
|
35
|
+
list
|
36
36
|
end
|
37
37
|
|
38
38
|
# adds a Repo corresponding to the path it found a git repo at in the configured
|
@@ -41,12 +41,18 @@ module Ginatra
|
|
41
41
|
# @param [String] path the path of the git repo
|
42
42
|
# @param [String] param the param of the repo if it differs,
|
43
43
|
# for looking to see if it's already on the list
|
44
|
-
#
|
45
|
-
# @todo Docs: what does this return?
|
46
44
|
def add(path, param = File.split(path).last)
|
47
45
|
unless self.has_repo?(param)
|
48
|
-
|
46
|
+
begin
|
47
|
+
list << Repo.new(path)
|
48
|
+
rescue Grit::InvalidGitRepositoryError
|
49
|
+
# If the path is not a git repository, then this error is raised
|
50
|
+
# and causes an error page to result.
|
51
|
+
# Is it preferable to just log that the error happened and not show the error page?
|
52
|
+
Ginatra::Config.logger.info "Invalid git repository at #{path}. Did you create the directory and forget to run 'git init' inside that directory?"
|
53
|
+
end
|
49
54
|
end
|
55
|
+
list
|
50
56
|
end
|
51
57
|
|
52
58
|
# checks to see if the list contains a repo with a param
|
@@ -83,12 +89,14 @@ module Ginatra
|
|
83
89
|
|
84
90
|
# allows missing methods to cascade to the instance,
|
85
91
|
#
|
86
|
-
# @todo do we need this?
|
87
|
-
# @todo update the respond_to? method if we do.
|
88
|
-
#
|
89
92
|
# Caution! contains: Magic
|
90
93
|
def self.method_missing(sym, *args, &block)
|
91
94
|
instance.send(sym, *args, &block)
|
92
95
|
end
|
96
|
+
|
97
|
+
# updated to correspond to the method_missing definition
|
98
|
+
def self.respond_to?(sym)
|
99
|
+
instance.respond_to?(sym) || super
|
100
|
+
end
|
93
101
|
end
|
94
102
|
end
|
data/rackup.ru
CHANGED
data/spec/repo_list_spec.rb
CHANGED
@@ -2,7 +2,7 @@ current_path = File.expand_path(File.dirname(__FILE__))
|
|
2
2
|
require File.join(current_path, "spec_helper")
|
3
3
|
|
4
4
|
describe "Ginatra" do
|
5
|
-
|
5
|
+
|
6
6
|
describe "RepoList" do
|
7
7
|
|
8
8
|
before do
|
@@ -18,5 +18,64 @@ describe "Ginatra" do
|
|
18
18
|
@repo_list.include?(@repo)
|
19
19
|
end
|
20
20
|
|
21
|
+
it "has_repo? works for existing repo" do
|
22
|
+
Ginatra::RepoList.instance.has_repo?("test").should == true
|
23
|
+
end
|
24
|
+
|
25
|
+
it "has_repo? works for non-existant repo" do
|
26
|
+
Ginatra::RepoList.instance.has_repo?("bad-test").should == false
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "New repos added to repo directory" do
|
30
|
+
|
31
|
+
NEW_REPO_NAME = "temp-new-repo"
|
32
|
+
REPO_DIR = File.join(current_path, "..", "repos")
|
33
|
+
|
34
|
+
def print_repos_found
|
35
|
+
Ginatra::Config.git_dirs.map! do |git_dir|
|
36
|
+
files = Dir.glob(git_dir)
|
37
|
+
files.each { |e| STDOUT.puts(e) unless Ginatra::Config.ignored_files.include?(File.split(e).last) }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
before(:each) do
|
42
|
+
FileUtils.cd(REPO_DIR) do |dir|
|
43
|
+
FileUtils.mkdir(NEW_REPO_NAME)
|
44
|
+
FileUtils.cd(NEW_REPO_NAME) do |dir|
|
45
|
+
`git init`
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should detect new repo after refresh" do
|
51
|
+
repo_list = Ginatra::RepoList.list # calling this should refresh the list
|
52
|
+
|
53
|
+
Ginatra::RepoList.instance.has_repo?(NEW_REPO_NAME).should == true
|
54
|
+
|
55
|
+
new_repo = Ginatra::RepoList.find(NEW_REPO_NAME)
|
56
|
+
repo_list.should include(new_repo)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should detect when a repo has been removed after refresh" do
|
60
|
+
repo_list = Ginatra::RepoList.list # calling this should refresh the list
|
61
|
+
|
62
|
+
Ginatra::RepoList.instance.has_repo?(NEW_REPO_NAME).should == true
|
63
|
+
|
64
|
+
new_repo = Ginatra::RepoList.find(NEW_REPO_NAME)
|
65
|
+
repo_list.should include(new_repo)
|
66
|
+
|
67
|
+
# remove the new repository from the file system
|
68
|
+
FileUtils.rm_rf File.join(REPO_DIR, NEW_REPO_NAME), :secure => true
|
69
|
+
|
70
|
+
repo_list = Ginatra::RepoList.list # refresh the repo list
|
71
|
+
|
72
|
+
Ginatra::RepoList.instance.has_repo?(NEW_REPO_NAME).should == false
|
73
|
+
repo_list.should_not include(new_repo)
|
74
|
+
end
|
75
|
+
|
76
|
+
after(:each) do
|
77
|
+
FileUtils.rm_rf File.join(REPO_DIR, NEW_REPO_NAME), :secure => true
|
78
|
+
end
|
79
|
+
end
|
21
80
|
end
|
22
81
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,7 +7,16 @@ current_path = File.expand_path(File.dirname(__FILE__))
|
|
7
7
|
require "#{current_path}/../lib/ginatra"
|
8
8
|
|
9
9
|
gem 'webrat', '>=0.4.4'
|
10
|
-
|
10
|
+
begin
|
11
|
+
# When using webrat 0.6.0, there is no webrat/sinatra.rb file.
|
12
|
+
# Looking at the gem's code, it looks like it autoloads the sinatra adapter at webrat/adapters/sinatra.rb.
|
13
|
+
# So requiring just 'webrat' will also load the sinatra adapater, which is done in the rescue clause.
|
14
|
+
require 'webrat/sinatra'
|
15
|
+
rescue LoadError
|
16
|
+
STDERR.puts "WARNING: could not load webrat/sinatra: #{__FILE__}:#{__LINE__}"
|
17
|
+
require 'webrat'
|
18
|
+
end
|
19
|
+
|
11
20
|
gem 'rack-test', '>=0.3.0'
|
12
21
|
require 'rack/test'
|
13
22
|
|
data/views/_commit_info_box.erb
CHANGED
@@ -3,21 +3,21 @@
|
|
3
3
|
<dl>
|
4
4
|
<dt>commit:</dt>
|
5
5
|
<dd>
|
6
|
-
<a href='
|
6
|
+
<a href='<%= prefix_url(repo.param) %>/commit/<%= commit.id_abbrev %>'>
|
7
7
|
<code><%= commit.id %></code>
|
8
8
|
</a>
|
9
9
|
</dd><br>
|
10
10
|
|
11
11
|
<dt>tree:</dt>
|
12
12
|
<dd>
|
13
|
-
<a href='
|
13
|
+
<a href='<%= prefix_url(repo.param) %>/tree/<%= commit.tree.id[0..7] %>'>
|
14
14
|
<code><%= commit.tree.id %></code>
|
15
15
|
</a>
|
16
16
|
</dd><br>
|
17
17
|
<% commit.parents.each do |parent| %>
|
18
18
|
<dt>parent:</dt>
|
19
19
|
<dd>
|
20
|
-
<a href='
|
20
|
+
<a href='<%= prefix_url(repo.param) %>/commit/<%= parent.id_abbrev %>'>
|
21
21
|
<code><%= parent.id %></code>
|
22
22
|
</a>
|
23
23
|
</dd>
|
data/views/_header.erb
CHANGED
data/views/_tree_part.erb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
<%= partial(:tree_part, :locals => {:current_tree => next_tree, :tree_path => new_path, :path => path }) %>
|
6
6
|
<% end %>
|
7
7
|
<% current_tree.blobs.each do |next_blob| %>
|
8
|
-
<li class="blob"><a href="<%= path[:blob] %><%= tree_path %>/<%= next_blob.basename %>"><%= next_blob.basename %></a></li>
|
8
|
+
<li class="blob"><a href="<%= prefix_url(path[:blob]) %><%= tree_path %>/<%= next_blob.basename %>"><%= next_blob.basename %></a></li>
|
9
9
|
<% end %>
|
10
10
|
</ul>
|
11
11
|
</li>
|
data/views/atom.builder
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
xml.instruct! :xml, :version => '1.0', :encoding => 'utf-8'
|
2
2
|
xml.feed :'xml:lang' => 'en-US', :xmlns => 'http://www.w3.org/2005/Atom' do
|
3
3
|
base_title = "#{@repo.name}: "
|
4
|
-
base_url = "http://#{hostname}
|
4
|
+
base_url = "http://#{hostname}" + prefix_url("#{@repo.param}")
|
5
5
|
if params[:ref]
|
6
6
|
url = base_url + "/#{params[:ref]}"
|
7
7
|
title = base_title + params[:ref]
|
data/views/blob.erb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
<h3>Blob: <%= params[:splat].first %></h3>
|
3
3
|
<div class="active">
|
4
4
|
<div class="blob">
|
5
|
-
<h4><img src="
|
6
|
-
<%=
|
5
|
+
<h4><img src="<%= prefix_url("img/doc.png") %>" /><%= @blob.name %></h4>
|
6
|
+
<%= pygmentize(@blob.data, @blob.name) %>
|
7
7
|
</div>
|
8
8
|
<div class="clearfix"> </div>
|
9
9
|
</div>
|
data/views/commit.erb
CHANGED
@@ -12,8 +12,8 @@
|
|
12
12
|
<% count = 0 %>
|
13
13
|
<% @commit.diffs.select { |d| !d.deleted_file && !d.new_file }.each do |diff| %>
|
14
14
|
<% count += 1 %>
|
15
|
-
<h4><img src="
|
16
|
-
<div class="diff"><%=
|
15
|
+
<h4><img src="<%= prefix_url("img/doc.png") %>" /><a name='file_<%= count %>'><code><%= diff.b_path %></code></a></h4>
|
16
|
+
<div class="diff"><%= pygmentize(diff.diff) %></div>
|
17
17
|
<% end %>
|
18
18
|
</div>
|
19
19
|
</div>
|
data/views/index.erb
CHANGED
data/views/layout.erb
CHANGED
@@ -4,26 +4,27 @@
|
|
4
4
|
<head>
|
5
5
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
6
6
|
<title>Ginatra</title>
|
7
|
-
<link rel="stylesheet" href="
|
8
|
-
<link rel="stylesheet" href="
|
9
|
-
|
10
|
-
<script type="text/javascript" src="
|
7
|
+
<link rel="stylesheet" href="<%= prefix_url("src/index.css") %>" type="text/css" media="screen" />
|
8
|
+
<link rel="stylesheet" href="<%= prefix_url("src/default.css") %>" type="text/css" media="screen" />
|
9
|
+
|
10
|
+
<script type="text/javascript" src="<%= prefix_url("src/highlight.pack.js") %>"></script>
|
11
11
|
<script type="text/javascript">
|
12
12
|
hljs.initHighlightingOnLoad();
|
13
13
|
</script>
|
14
|
-
<script src="
|
15
|
-
<script src="
|
14
|
+
<script src="<%= prefix_url("src/jquery-1.3.2.min.js") %>" type="text/javascript"></script>
|
15
|
+
<script src="<%= prefix_url("src/ginatra.js") %>" type="text/javascript"></script>
|
16
|
+
|
16
17
|
<!--[if lt IE 8]>
|
17
18
|
<script src="http://ie7-js.googlecode.com/svn/version/2.0(beta3)/IE8.js" type="text/javascript"></script>
|
18
19
|
<style type="text/css" media="screen">
|
19
|
-
* { behavior: url("
|
20
|
+
* { behavior: url("<%= prefix_url("src/iepngfix.htc") %>") }
|
20
21
|
</style>
|
21
22
|
<![endif]-->
|
22
23
|
</head>
|
23
24
|
<body>
|
24
25
|
<div id="content">
|
25
26
|
<div id="inner">
|
26
|
-
<h1><a href="
|
27
|
+
<h1><a href="<%= prefix_url %>">Ginatra</a></h1>
|
27
28
|
<%= yield %>
|
28
29
|
</div>
|
29
30
|
<div id="footer-spacer"> </div>
|
data/views/log.erb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
<h3>Commits<% if params[:ref] %>: <%= params[:ref] %><% end %> <%= atom_feed_link(@repo.param, params[:ref]) %></h3>
|
3
3
|
<div class="active">
|
4
4
|
<% if @previous_commits %>
|
5
|
-
<a href='
|
5
|
+
<a href='<%= prefix_url(params[:repo]) %>/<%= params[:ref] %>/<%= params[:page] - 1 %>'>Previous</a>
|
6
6
|
<% end %>
|
7
7
|
|
8
8
|
<% if @separator %>
|
@@ -10,7 +10,7 @@
|
|
10
10
|
<% end %>
|
11
11
|
|
12
12
|
<% if @next_commits %>
|
13
|
-
<a href='
|
13
|
+
<a href='<%= prefix_url(params[:repo]) %>/<%= params[:ref] %>/<%= params[:page] + 1 %>'>Next</a>
|
14
14
|
<% end %>
|
15
15
|
<div class='list'>
|
16
16
|
<div id='heads'>
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<ul>
|
19
19
|
<% @repo.heads.each do |head| %>
|
20
20
|
<li>
|
21
|
-
<a href="
|
21
|
+
<a href="<%=h prefix_url(@repo.param) %>/<%=h head.name %>">
|
22
22
|
<%=h head.name %>
|
23
23
|
</a>
|
24
24
|
</li>
|
@@ -32,7 +32,7 @@
|
|
32
32
|
<ul>
|
33
33
|
<% @repo.tags.each do |tag| %>
|
34
34
|
<li>
|
35
|
-
<a href="
|
35
|
+
<a href="<%=h prefix_url(@repo.param) %>/commit/<%=h tag.name %>">
|
36
36
|
<%=h tag.name %>
|
37
37
|
</a>
|
38
38
|
</li>
|
@@ -45,7 +45,7 @@
|
|
45
45
|
</div>
|
46
46
|
<div id='commit-log'>
|
47
47
|
<% @commits.each do |commit| %>
|
48
|
-
<% url = "
|
48
|
+
<% url = prefix_url("#{@repo.param}/commit/#{commit.id_abbrev}") %>
|
49
49
|
<div id='commit_<%= commit.id_abbrev %>' class='commit' onclick="location.href='<%= url %>'">
|
50
50
|
<div class='right'>
|
51
51
|
<span class='id'>
|
data/views/tree.erb
CHANGED
@@ -3,21 +3,21 @@
|
|
3
3
|
<div class="active">
|
4
4
|
<ul class="commit-tree">
|
5
5
|
<% @tree.trees.each do |tree| %>
|
6
|
-
<% tree_path = "
|
7
|
-
<li class="tree"><a href="<%= @path[:tree] %><%= tree_path %>"><%= tree.basename %></a>
|
6
|
+
<% tree_path = "#{tree.name}"%>
|
7
|
+
<li class="tree"><a href="<%= prefix_url(@path[:tree]) %><%= tree_path %>"><%= tree.basename %></a>
|
8
8
|
<ul>
|
9
9
|
<% tree.trees.each do |next_tree| %>
|
10
10
|
<% new_path = tree_path + "/#{next_tree.name}" %>
|
11
11
|
<%= partial(:tree_part, :locals => {:current_tree => next_tree, :tree_path => new_path, :path => @path }) %>
|
12
12
|
<% end %>
|
13
13
|
<% tree.blobs.each do |next_blob| %>
|
14
|
-
<li class="blob"><a href="<%= @path[:blob]
|
14
|
+
<li class="blob"><a href="<%= prefix_url(@path[:blob]) %>/<%= tree_path %>/<%= next_blob.basename %>"><%= next_blob.basename %></a></li>
|
15
15
|
<% end %>
|
16
16
|
</ul>
|
17
17
|
</li>
|
18
18
|
<% end %>
|
19
19
|
<% @tree.blobs.each do |blob| %>
|
20
|
-
<li class="blob"><a href="<%= @path[:blob] %>/<%= blob.basename %>"><%= blob.basename %></a></li>
|
20
|
+
<li class="blob"><a href="<%= prefix_url(@path[:blob]) %>/<%= blob.basename %>"><%= blob.basename %></a></li>
|
21
21
|
<% end %>
|
22
22
|
</ul>
|
23
23
|
<div class="clearfix"> </div>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ginatra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Elliott
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date:
|
13
|
+
date: 2010-01-06 00:00:00 +00:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -34,14 +34,24 @@ dependencies:
|
|
34
34
|
version: 1.1.1
|
35
35
|
version:
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
37
|
+
name: vegas
|
38
38
|
type: :runtime
|
39
39
|
version_requirement:
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
requirements:
|
42
42
|
- - ">="
|
43
43
|
- !ruby/object:Gem::Version
|
44
|
-
version: 0.
|
44
|
+
version: 0.1.0
|
45
|
+
version:
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: open4
|
48
|
+
type: :runtime
|
49
|
+
version_requirement:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.9.6
|
45
55
|
version:
|
46
56
|
description: Host your own git repository browser through the power of Sinatra and Grit
|
47
57
|
email: sam@lenary.co.uk
|
@@ -57,11 +67,8 @@ extra_rdoc_files:
|
|
57
67
|
files:
|
58
68
|
- .gitattributes
|
59
69
|
- .gitignore
|
60
|
-
- .gitmodules
|
61
70
|
- README.md
|
62
71
|
- Rakefile
|
63
|
-
- TODO.md
|
64
|
-
- VERSION
|
65
72
|
- bin/ginatra
|
66
73
|
- bin/ginatra-daemon
|
67
74
|
- bin/ginatra-directory
|
@@ -70,7 +77,6 @@ files:
|
|
70
77
|
- features/pages.feature
|
71
78
|
- features/step_definitions/page_steps.rb
|
72
79
|
- features/support/env.rb
|
73
|
-
- ginatra.gemspec
|
74
80
|
- lib/ginatra.rb
|
75
81
|
- lib/ginatra/config.rb
|
76
82
|
- lib/ginatra/helpers.rb
|
@@ -86,9 +92,7 @@ files:
|
|
86
92
|
- public/src/blank.gif
|
87
93
|
- public/src/colour.css
|
88
94
|
- public/src/commit.css
|
89
|
-
- public/src/default.css
|
90
95
|
- public/src/ginatra.js
|
91
|
-
- public/src/highlight.pack.js
|
92
96
|
- public/src/iepngfix.htc
|
93
97
|
- public/src/index.css
|
94
98
|
- public/src/jquery-1.3.2.min.js
|
data/.gitmodules
DELETED
data/TODO.md
DELETED
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.1.1
|
data/ginatra.gemspec
DELETED
@@ -1,108 +0,0 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{ginatra}
|
8
|
-
s.version = "2.1.1"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Sam Elliott", "Ryan Bigg"]
|
12
|
-
s.date = %q{2009-12-28}
|
13
|
-
s.description = %q{Host your own git repository browser through the power of Sinatra and Grit}
|
14
|
-
s.email = %q{sam@lenary.co.uk}
|
15
|
-
s.executables = ["ginatra", "ginatra-daemon", "ginatra-directory", "ginatra-server"]
|
16
|
-
s.extra_rdoc_files = [
|
17
|
-
"README.md"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".gitattributes",
|
21
|
-
".gitignore",
|
22
|
-
".gitmodules",
|
23
|
-
"README.md",
|
24
|
-
"Rakefile",
|
25
|
-
"TODO.md",
|
26
|
-
"VERSION",
|
27
|
-
"bin/ginatra",
|
28
|
-
"bin/ginatra-daemon",
|
29
|
-
"bin/ginatra-directory",
|
30
|
-
"bin/ginatra-server",
|
31
|
-
"config.ru",
|
32
|
-
"features/pages.feature",
|
33
|
-
"features/step_definitions/page_steps.rb",
|
34
|
-
"features/support/env.rb",
|
35
|
-
"ginatra.gemspec",
|
36
|
-
"lib/ginatra.rb",
|
37
|
-
"lib/ginatra/config.rb",
|
38
|
-
"lib/ginatra/helpers.rb",
|
39
|
-
"lib/ginatra/repo.rb",
|
40
|
-
"lib/ginatra/repo_list.rb",
|
41
|
-
"lib/sinatra/partials.rb",
|
42
|
-
"public/favicon.ico",
|
43
|
-
"public/img/add.png",
|
44
|
-
"public/img/diff.png",
|
45
|
-
"public/img/doc.png",
|
46
|
-
"public/img/rm.png",
|
47
|
-
"public/img/tree.png",
|
48
|
-
"public/src/blank.gif",
|
49
|
-
"public/src/colour.css",
|
50
|
-
"public/src/commit.css",
|
51
|
-
"public/src/default.css",
|
52
|
-
"public/src/ginatra.js",
|
53
|
-
"public/src/highlight.pack.js",
|
54
|
-
"public/src/iepngfix.htc",
|
55
|
-
"public/src/index.css",
|
56
|
-
"public/src/jquery-1.3.2.min.js",
|
57
|
-
"public/src/lists.css",
|
58
|
-
"public/src/reset.css",
|
59
|
-
"public/src/table.css",
|
60
|
-
"public/src/type.css",
|
61
|
-
"rackup.ru",
|
62
|
-
"repos/README.md",
|
63
|
-
"spec/repo_list_spec.rb",
|
64
|
-
"spec/repo_spec.rb",
|
65
|
-
"spec/spec_helper.rb",
|
66
|
-
"views/_actor_box.erb",
|
67
|
-
"views/_commit_info_box.erb",
|
68
|
-
"views/_header.erb",
|
69
|
-
"views/_tree_part.erb",
|
70
|
-
"views/atom.builder",
|
71
|
-
"views/blob.erb",
|
72
|
-
"views/commit.erb",
|
73
|
-
"views/index.erb",
|
74
|
-
"views/layout.erb",
|
75
|
-
"views/log.erb",
|
76
|
-
"views/tree.erb"
|
77
|
-
]
|
78
|
-
s.homepage = %q{http://lenary.github.com/ginatra}
|
79
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
80
|
-
s.require_paths = ["lib"]
|
81
|
-
s.rubygems_version = %q{1.3.5}
|
82
|
-
s.summary = %q{A Gitweb Clone in Sinatra and Grit}
|
83
|
-
s.test_files = [
|
84
|
-
"spec/repo_list_spec.rb",
|
85
|
-
"spec/repo_spec.rb",
|
86
|
-
"spec/spec_helper.rb"
|
87
|
-
]
|
88
|
-
|
89
|
-
if s.respond_to? :specification_version then
|
90
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
91
|
-
s.specification_version = 3
|
92
|
-
|
93
|
-
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
94
|
-
s.add_runtime_dependency(%q<sinatra>, [">= 0.9.4"])
|
95
|
-
s.add_runtime_dependency(%q<grit>, [">= 1.1.1"])
|
96
|
-
s.add_runtime_dependency(%q<coderay>, [">= 0.8.0"])
|
97
|
-
else
|
98
|
-
s.add_dependency(%q<sinatra>, [">= 0.9.4"])
|
99
|
-
s.add_dependency(%q<grit>, [">= 1.1.1"])
|
100
|
-
s.add_dependency(%q<coderay>, [">= 0.8.0"])
|
101
|
-
end
|
102
|
-
else
|
103
|
-
s.add_dependency(%q<sinatra>, [">= 0.9.4"])
|
104
|
-
s.add_dependency(%q<grit>, [">= 1.1.1"])
|
105
|
-
s.add_dependency(%q<coderay>, [">= 0.8.0"])
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|