gitdocs 0.5.0.pre7 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG +6 -0
- data/README.md +1 -0
- data/Rakefile +18 -0
- data/config.ru +21 -0
- data/gitdocs.gemspec +9 -7
- data/lib/gitdocs/browser_app.rb +150 -0
- data/lib/gitdocs/public/js/app.js +4 -32
- data/lib/gitdocs/rendering_helper.rb +48 -0
- data/lib/gitdocs/repository/path.rb +5 -0
- data/lib/gitdocs/search.rb +1 -1
- data/lib/gitdocs/server.rb +10 -154
- data/lib/gitdocs/settings_app.rb +28 -0
- data/lib/gitdocs/version.rb +1 -1
- data/lib/gitdocs/views/_header.haml +3 -1
- data/lib/gitdocs/views/dir.haml +8 -8
- data/lib/gitdocs/views/edit.haml +5 -4
- data/lib/gitdocs/views/file.haml +1 -1
- data/lib/gitdocs/views/home.haml +1 -1
- data/lib/gitdocs/views/{app.haml → layout.haml} +0 -0
- data/lib/gitdocs/views/revisions.haml +4 -3
- data/lib/gitdocs/views/search.haml +1 -1
- data/lib/gitdocs/views/settings.haml +2 -2
- data/lib/gitdocs.rb +0 -1
- data/test/integration/browse_test.rb +12 -6
- data/test/unit/repository_path_test.rb +7 -0
- data/test/unit/search_test.rb +5 -0
- metadata +39 -22
- data/lib/gitdocs/rendering.rb +0 -28
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NDc4ZmI3MTc1YjRjZjE4ZmNmNDFmNjgwMDEzY2YzZTkwY2Q5MWI4Yw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YmRjMzViNzc0MzgwMDVkMDgxOGNmMDI3MDZmYjhlMTU3OGUxMDg2ZQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjMzNzJlNGY3YmMzMWY2YWY2ZTE1ZjBjYTJmZDYwMWZmM2NjMTYyOTM0YzUw
|
10
|
+
ODkwZmFmY2NkYmVkZTI3MjYxNmZhNjUwZDliYjJmODAzOGY2YTc3M2UwZjRk
|
11
|
+
MTZiNGYwNmVmMjU5ZDkyM2U1MjcwODdlZmQ1ODJhODJjZjA4ODQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MWM2Yjk4ZGE1ODIzMTg4YTEyYTg1YTNhZTc1MWI1NWFlMTczMWFlMjg5Y2Jh
|
14
|
+
NmRhYTAzYWNmMzI4MTZhNTdjN2QwMzA3MzZhMTI5ZDRmMGFhZWE3YTdhMWVk
|
15
|
+
ZTAwODA3OWZkMDdkMDEwZThlZDQyM2ZjZDMzMzA1ZjJiNDZhOTg=
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
0.5.0 (May 2nd 2015)
|
2
|
+
* upgrade gems activerecord, minitest, haml-lint, redcarpet (@acant)
|
3
|
+
* convert web interface to use Sinatra instead of renee (@acant)
|
4
|
+
* add rake task to run the web interface standalone using the shotgun gem (@acant)
|
5
|
+
* add fenced code (and syntax highlighting) into Markdown parsing (@acant)
|
6
|
+
|
1
7
|
0.5.0.pre7 (August 3rd 2014)
|
2
8
|
|
3
9
|
* UI improvements to repo browser (@acant)
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -26,4 +26,22 @@ Rake::TestTask.new do |t|
|
|
26
26
|
t.verbose = true
|
27
27
|
end
|
28
28
|
|
29
|
+
desc 'Start the web interface for development'
|
30
|
+
task server: 'server:start'
|
31
|
+
|
32
|
+
namespace :server do
|
33
|
+
task :start do
|
34
|
+
sh('shotgun config.ru')
|
35
|
+
end
|
36
|
+
|
37
|
+
desc 'Copy the current configuration for use with the development web interface'
|
38
|
+
task :copy_config do
|
39
|
+
FileUtils.mkdir_p('./tmp/web')
|
40
|
+
FileUtils.copy(
|
41
|
+
File.expand_path('.gitdocs/config.db', ENV['HOME']),
|
42
|
+
'./tmp/web/config.db'
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
29
47
|
task default: 'test:integration'
|
data/config.ru
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require './lib/gitdocs'
|
2
|
+
require './lib/gitdocs/manager'
|
3
|
+
require './lib/gitdocs/settings_app'
|
4
|
+
require './lib/gitdocs/browser_app'
|
5
|
+
require './lib/gitdocs/repository'
|
6
|
+
require './lib/gitdocs/configuration'
|
7
|
+
|
8
|
+
use Rack::Static,
|
9
|
+
urls: %w(/css /js /img /doc),
|
10
|
+
root: './lib/gitdocs/public'
|
11
|
+
use Rack::MethodOverride
|
12
|
+
|
13
|
+
config_root = './tmp/web'
|
14
|
+
FileUtils.mkdir_p(config_root)
|
15
|
+
Gitdocs::SettingsApp.set :manager, Gitdocs::Manager.new(config_root, true)
|
16
|
+
Gitdocs::SettingsApp.set :logging, true
|
17
|
+
map('/settings') { run Gitdocs::SettingsApp }
|
18
|
+
|
19
|
+
Gitdocs::BrowserApp.set :repositories, Gitdocs::Configuration.new(config_root).shares.map { |x| Gitdocs::Repository.new(x) }
|
20
|
+
Gitdocs::BrowserApp.set :logging, true
|
21
|
+
map('/') { run Gitdocs::BrowserApp }
|
data/gitdocs.gemspec
CHANGED
@@ -7,7 +7,8 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Gitdocs::VERSION
|
8
8
|
s.authors = ['Josh Hull', 'Nathan Esquenazi']
|
9
9
|
s.email = ['joshbuddy@gmail.com', 'nesquena@gmail.com']
|
10
|
-
s.homepage = '
|
10
|
+
s.homepage = 'https://github.com/nesquena/gitdocs'
|
11
|
+
|
11
12
|
s.summary = 'Open-source Dropbox using Ruby and Git.'
|
12
13
|
s.description = 'Open-source Dropbox using Ruby and Git.'
|
13
14
|
s.license = 'MIT'
|
@@ -23,15 +24,15 @@ Gem::Specification.new do |s|
|
|
23
24
|
|
24
25
|
s.add_dependency 'joshbuddy-guard', '~> 0.10.0'
|
25
26
|
s.add_dependency 'thin', '~> 1.6.2'
|
26
|
-
s.add_dependency '
|
27
|
-
s.add_dependency 'redcarpet', '~> 3.
|
27
|
+
s.add_dependency 'sinatra', '~> 1.4.5'
|
28
|
+
s.add_dependency 'redcarpet', '~> 3.2.2'
|
28
29
|
s.add_dependency 'thor', '~> 0.14.6'
|
29
30
|
s.add_dependency 'coderay', '~> 1.1.0'
|
30
31
|
s.add_dependency 'dante', '~> 0.1.2'
|
31
32
|
s.add_dependency 'growl', '~> 1.0.3'
|
32
33
|
s.add_dependency 'haml', '~> 4.0.5'
|
33
34
|
s.add_dependency 'sqlite3', '~> 1.3.4'
|
34
|
-
s.add_dependency 'activerecord', '~> 4.
|
35
|
+
s.add_dependency 'activerecord', '~> 4.2.0'
|
35
36
|
s.add_dependency 'grit', '~> 2.5.0'
|
36
37
|
s.add_dependency 'shell_tools', '~> 0.1.0'
|
37
38
|
s.add_dependency 'mimetype-fu', '~> 0.1.2'
|
@@ -40,7 +41,7 @@ Gem::Specification.new do |s|
|
|
40
41
|
s.add_dependency 'rugged', '~> 0.19.0'
|
41
42
|
s.add_dependency 'table_print', '~> 1.5.1'
|
42
43
|
|
43
|
-
s.add_development_dependency 'minitest', '~> 5.
|
44
|
+
s.add_development_dependency 'minitest', '~> 5.5.0'
|
44
45
|
s.add_development_dependency 'capybara_minitest_spec', '~> 1.0.2'
|
45
46
|
s.add_development_dependency 'poltergeist', '~> 1.5.1'
|
46
47
|
s.add_development_dependency 'rake'
|
@@ -49,7 +50,8 @@ Gem::Specification.new do |s|
|
|
49
50
|
s.add_development_dependency 'metric_fu'
|
50
51
|
s.add_development_dependency 'aruba'
|
51
52
|
s.add_development_dependency 'rubocop'
|
52
|
-
s.add_development_dependency 'haml-lint', '~> 0.
|
53
|
+
s.add_development_dependency 'haml-lint', '~> 0.10.0'
|
53
54
|
s.add_development_dependency 'jslint_on_rails', '~> 1.1.1'
|
54
|
-
s.add_development_dependency 'coveralls'
|
55
|
+
s.add_development_dependency 'coveralls'
|
56
|
+
s.add_development_dependency 'shotgun'
|
55
57
|
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
require 'sinatra/base'
|
4
|
+
require 'uri'
|
5
|
+
require 'haml'
|
6
|
+
require 'mimetype_fu'
|
7
|
+
require 'gitdocs/rendering_helper'
|
8
|
+
|
9
|
+
module Gitdocs
|
10
|
+
class BrowserApp < Sinatra::Base
|
11
|
+
set :haml, format: :html5
|
12
|
+
|
13
|
+
helpers Gitdocs::RenderingHelper
|
14
|
+
|
15
|
+
get('/') do
|
16
|
+
if settings.repositories.size == 1
|
17
|
+
redirect to('/0/')
|
18
|
+
else
|
19
|
+
haml(
|
20
|
+
:home,
|
21
|
+
locals: {
|
22
|
+
shares: settings.repositories,
|
23
|
+
nav_state: 'home'
|
24
|
+
}
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
get('/search') do
|
30
|
+
haml(
|
31
|
+
:search,
|
32
|
+
locals: {
|
33
|
+
results: Gitdocs::Search.new(settings.repositories).search(params[:q]),
|
34
|
+
nav_state: nil
|
35
|
+
}
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
helpers do
|
40
|
+
# @return [Integer]
|
41
|
+
def id
|
42
|
+
@id ||= params[:id].to_i
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [Gitdocs::Repository::Path]
|
46
|
+
def path
|
47
|
+
halt(404) unless settings.repositories[id]
|
48
|
+
@path ||= Gitdocs::Repository::Path.new(
|
49
|
+
settings.repositories[id], URI.unescape(params[:splat].first)
|
50
|
+
)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
get('/:id*') do
|
55
|
+
default_locals = {
|
56
|
+
idx: id,
|
57
|
+
root: settings.repositories[id].root,
|
58
|
+
nav_state: nil
|
59
|
+
}
|
60
|
+
|
61
|
+
case params[:mode]
|
62
|
+
when 'meta'
|
63
|
+
begin
|
64
|
+
content_type :json
|
65
|
+
path.meta.to_json
|
66
|
+
rescue
|
67
|
+
halt(404)
|
68
|
+
end
|
69
|
+
when 'edit'
|
70
|
+
halt(404) unless path.text?
|
71
|
+
haml(
|
72
|
+
:edit,
|
73
|
+
locals: default_locals.merge(contents: path.content)
|
74
|
+
)
|
75
|
+
when 'revisions'
|
76
|
+
haml(
|
77
|
+
:revisions,
|
78
|
+
locals: default_locals.merge(revisions: path.revisions)
|
79
|
+
)
|
80
|
+
when 'raw'
|
81
|
+
send_file(path.absolute_path)
|
82
|
+
else
|
83
|
+
if path.directory?
|
84
|
+
haml(
|
85
|
+
:dir,
|
86
|
+
locals: default_locals.merge(
|
87
|
+
contents: path.file_listing,
|
88
|
+
rendered_readme: file_content_render(path.readme_path)
|
89
|
+
)
|
90
|
+
)
|
91
|
+
else
|
92
|
+
haml(
|
93
|
+
:file,
|
94
|
+
locals: default_locals.merge(
|
95
|
+
contents: file_content_render(
|
96
|
+
path.absolute_path(params[:revision])
|
97
|
+
)
|
98
|
+
)
|
99
|
+
)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
post('/:id*') do
|
105
|
+
redirect_path =
|
106
|
+
if params[:file] # upload
|
107
|
+
path.join(params[:file][:filename])
|
108
|
+
FileUtils.mv(params[:file][:tempfile].path, path.absolute_path)
|
109
|
+
"/#{id}/#{path.relative_path}"
|
110
|
+
elsif params[:filename] # add file/directory
|
111
|
+
path.join(params[:filename])
|
112
|
+
if params[:new_file]
|
113
|
+
path.touch
|
114
|
+
"/#{id}/#{path.relative_path}?mode=edit"
|
115
|
+
elsif params[:new_directory]
|
116
|
+
path.mkdir
|
117
|
+
"/#{id}/#{path.relative_path}"
|
118
|
+
else
|
119
|
+
halt(400)
|
120
|
+
end
|
121
|
+
else
|
122
|
+
halt(400)
|
123
|
+
end
|
124
|
+
redirect to(redirect_path)
|
125
|
+
end
|
126
|
+
|
127
|
+
put('/:id*') do
|
128
|
+
redirect_path =
|
129
|
+
if params[:revision] # revert
|
130
|
+
path.revert(params[:revision])
|
131
|
+
"/#{id}/#{path.relative_path}"
|
132
|
+
elsif params[:data] && params[:message] # save
|
133
|
+
path.write(params[:data], params[:message])
|
134
|
+
"/#{id}/#{path.relative_path}"
|
135
|
+
else
|
136
|
+
# No valid inputs, do nothing and redirect.
|
137
|
+
"/#{id}/#{path.relative_path}"
|
138
|
+
end
|
139
|
+
redirect to(redirect_path)
|
140
|
+
end
|
141
|
+
|
142
|
+
delete('/:id*') do
|
143
|
+
path.remove
|
144
|
+
parent = File.dirname(path.relative_path)
|
145
|
+
parent = '' if parent == '/'
|
146
|
+
parent = nil if parent == '.'
|
147
|
+
redirect to("/#{id}#{parent}")
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -8,7 +8,7 @@ GitDocs = {
|
|
8
8
|
var paths = fullPath.split("/");
|
9
9
|
$(paths).each(function(idx, subpath) {
|
10
10
|
var relPath = paths.slice(0, idx+1).join("/");
|
11
|
-
var link = "<a href='
|
11
|
+
var link = "<a href='" + relPath + "'>" + subpath + "/</a>";
|
12
12
|
fullPath = fullPath.replace(subpath + "/", link);
|
13
13
|
});
|
14
14
|
$('span.path').html(fullPath);
|
@@ -74,29 +74,6 @@ $(document).ready(function() {
|
|
74
74
|
StringFormatter.autoLink();
|
75
75
|
});
|
76
76
|
|
77
|
-
// Redirect to edit page for new file when new file form is submitted
|
78
|
-
$('form.add').live('submit', function(e){
|
79
|
-
return false;
|
80
|
-
});
|
81
|
-
|
82
|
-
$('form.add input.file').live('click', function(e) {
|
83
|
-
var docIdx = window.location.pathname.match(/\/(\d+)/);
|
84
|
-
if (!docIdx) { return false; }
|
85
|
-
var fullPath = $('span.path').text();
|
86
|
-
var newPath = "/" + docIdx[1] + (fullPath == "/" ? "/" : fullPath + "/") + $(this).parents('form').find('input.edit').val();
|
87
|
-
window.location = newPath;
|
88
|
-
e.preventDefault(); return false;
|
89
|
-
});
|
90
|
-
|
91
|
-
$('form.add input.directory').live('click', function(e) {
|
92
|
-
var docIdx = window.location.pathname.match(/\/(\d+)/);
|
93
|
-
if (!docIdx) { return false; }
|
94
|
-
var fullPath = $('span.path').text();
|
95
|
-
var newPath = "/" + docIdx[1] + (fullPath == "/" ? "/" : fullPath + "/") + $(this).parents('form').find('input.edit').val() + '?dir=true';
|
96
|
-
window.location = newPath;
|
97
|
-
e.preventDefault(); return false;
|
98
|
-
});
|
99
|
-
|
100
77
|
// Link method redirection
|
101
78
|
$('a[data-method]').live('click', function(e) {
|
102
79
|
e.preventDefault();
|
@@ -111,12 +88,7 @@ $('a[data-method]').live('click', function(e) {
|
|
111
88
|
form.submit();
|
112
89
|
});
|
113
90
|
|
114
|
-
//
|
115
|
-
$('
|
116
|
-
return confirm('
|
117
|
-
});
|
118
|
-
|
119
|
-
// Revert a revision from the revision table
|
120
|
-
$('#revisions td.revert a').live('click', function(e) {
|
121
|
-
return confirm('Are you sure?')
|
91
|
+
// Confirm form submission when specified by data attribute.
|
92
|
+
$('form[data-confirm-submit]').live('submit', function(e) {
|
93
|
+
return confirm($(this).attr('data-confirm-submit'));
|
122
94
|
});
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
require 'redcarpet'
|
4
|
+
require 'coderay'
|
5
|
+
require 'tilt'
|
6
|
+
|
7
|
+
module Gitdocs
|
8
|
+
module RenderingHelper
|
9
|
+
# @param [String, nil] pathname
|
10
|
+
#
|
11
|
+
# @return [nil] if the pathname is nil
|
12
|
+
# @return [String]
|
13
|
+
def file_content_render(pathname)
|
14
|
+
return unless pathname
|
15
|
+
|
16
|
+
tilt = Tilt.new(
|
17
|
+
pathname,
|
18
|
+
1, # line number
|
19
|
+
fenced_code_blocks: true,
|
20
|
+
renderer: CodeRayify.new(filter_html: true, hard_wrap: true)
|
21
|
+
)
|
22
|
+
%(<div class="tilt">#{tilt.render}</div>)
|
23
|
+
rescue LoadError, RuntimeError # No tilt support
|
24
|
+
if path.text?
|
25
|
+
code_ray = CodeRay.scan_file(pathname)
|
26
|
+
%(<pre class="CodeRay">#{code_ray.encode(:html)}</pre>)
|
27
|
+
else
|
28
|
+
%(<embed class="inline-file" src="#{request.path_info}?mode=raw"></embed>)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class CodeRayify < ::Redcarpet::Render::Safe
|
33
|
+
# Override the safe #block_code with CodeRay, if a language is present.
|
34
|
+
#
|
35
|
+
# @param [String] code
|
36
|
+
# @param [String] langauge
|
37
|
+
#
|
38
|
+
# @return [String]
|
39
|
+
def block_code(code, language)
|
40
|
+
if language
|
41
|
+
CodeRay.scan(code, language).div
|
42
|
+
else
|
43
|
+
super(code, language)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -15,6 +15,11 @@ class Gitdocs::Repository::Path
|
|
15
15
|
)
|
16
16
|
end
|
17
17
|
|
18
|
+
def join(path_fragment)
|
19
|
+
@relative_path = File.join(@relative_path, path_fragment)
|
20
|
+
@absolute_path = File.join(@absolute_path, path_fragment)
|
21
|
+
end
|
22
|
+
|
18
23
|
# Write the content to the path and create any necessary directories.
|
19
24
|
#
|
20
25
|
# @param [String] content
|
data/lib/gitdocs/search.rb
CHANGED
data/lib/gitdocs/server.rb
CHANGED
@@ -1,18 +1,8 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
|
-
# Disable style checks that are invalid for Renee
|
4
|
-
# rubocop:disable Blocks, MultilineBlockChain
|
5
|
-
#
|
6
|
-
# TODO: extract the WebApp into its own class but until then...
|
7
|
-
# rubocop:disable LineLength, ClassLength, CyclomaticComplexity, BlockNesting
|
8
|
-
|
9
3
|
require 'thin'
|
10
|
-
require '
|
11
|
-
require '
|
12
|
-
require 'uri'
|
13
|
-
require 'haml'
|
14
|
-
require 'mimetype_fu'
|
15
|
-
require 'launchy'
|
4
|
+
require 'gitdocs/browser_app'
|
5
|
+
require 'gitdocs/settings_app'
|
16
6
|
|
17
7
|
module Gitdocs
|
18
8
|
class Server
|
@@ -34,152 +24,18 @@ module Gitdocs
|
|
34
24
|
end
|
35
25
|
|
36
26
|
def start
|
37
|
-
|
38
|
-
|
27
|
+
Gitdocs::SettingsApp.set :manager, @manager
|
28
|
+
Gitdocs::BrowserApp.set :repositories, @repositories
|
29
|
+
|
39
30
|
Thin::Logging.debug = @manager.debug
|
40
31
|
Thin::Server.start('127.0.0.1', @port) do
|
41
|
-
use Rack::Static,
|
32
|
+
use Rack::Static,
|
33
|
+
urls: %w(/css /js /img /doc),
|
34
|
+
root: File.expand_path('../public', __FILE__)
|
42
35
|
use Rack::MethodOverride
|
43
|
-
run Renee {
|
44
|
-
if request.path_info == '/'
|
45
|
-
if manager.shares.size == 1
|
46
|
-
redirect! '/0'
|
47
|
-
else
|
48
|
-
render!(
|
49
|
-
'home',
|
50
|
-
layout: 'app',
|
51
|
-
locals: { shares: manager.shares, nav_state: 'home' }
|
52
|
-
)
|
53
|
-
end
|
54
|
-
else
|
55
|
-
path 'settings' do
|
56
|
-
get.render!(
|
57
|
-
'settings',
|
58
|
-
layout: 'app',
|
59
|
-
locals: { conf: manager, nav_state: 'settings' }
|
60
|
-
)
|
61
|
-
post do
|
62
|
-
manager.update_all(request.POST)
|
63
|
-
redirect! '/settings'
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
path('search').get do
|
68
|
-
render!(
|
69
|
-
'search',
|
70
|
-
layout: 'app',
|
71
|
-
locals: { results: @search.search(request.GET['q']), nav_state: nil }
|
72
|
-
)
|
73
|
-
end
|
74
36
|
|
75
|
-
|
76
|
-
|
77
|
-
delete do
|
78
|
-
halt(404) unless manager.remove_by_id(id)
|
79
|
-
redirect!('/settings')
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
var :int do |idx|
|
85
|
-
halt(404) unless repositories[idx]
|
86
|
-
path = Gitdocs::Repository::Path.new(
|
87
|
-
repositories[idx], URI.unescape(request.path_info)
|
88
|
-
)
|
89
|
-
|
90
|
-
mode = request.params['mode']
|
91
|
-
default_locals = {
|
92
|
-
idx: idx,
|
93
|
-
root: repositories[idx].root,
|
94
|
-
nav_state: nil
|
95
|
-
}
|
96
|
-
|
97
|
-
if mode == 'meta' # Meta
|
98
|
-
halt 200, { 'Content-Type' => 'application/json' }, [path.meta.to_json]
|
99
|
-
elsif mode == 'save' # Saving
|
100
|
-
path.write(request.params['data'], request.params['message'])
|
101
|
-
redirect!("/#{idx}/#{path.relative_path}")
|
102
|
-
elsif mode == 'upload' # Uploading
|
103
|
-
file = request.params['file']
|
104
|
-
halt 404 unless file
|
105
|
-
tempfile = file[:tempfile]
|
106
|
-
filename = file[:filename]
|
107
|
-
FileUtils.mv(tempfile.path, path.absolute_path)
|
108
|
-
redirect!("/#{idx}/#{path.relative_path}/#{filename}")
|
109
|
-
elsif !path.exist? && !request.params['dir'] # edit for non-existent file
|
110
|
-
path.touch
|
111
|
-
redirect!("/#{idx}/#{path.relative_path}?mode=edit")
|
112
|
-
elsif !path.exist? && request.params['dir'] # create directory
|
113
|
-
path.mkdir
|
114
|
-
redirect!("/#{idx}/#{path.relative_path}")
|
115
|
-
elsif path.directory? # list directory
|
116
|
-
rendered_readme =
|
117
|
-
if path.readme_path
|
118
|
-
<<-EOS.gusb(/^\s+/, '')
|
119
|
-
<h3>#{File.basename(path.readme_path)}</h3>
|
120
|
-
<div class="tilt">#{render(path.readme_path)}</div>
|
121
|
-
EOS
|
122
|
-
else
|
123
|
-
nil
|
124
|
-
end
|
125
|
-
render!(
|
126
|
-
'dir',
|
127
|
-
layout: 'app',
|
128
|
-
locals: default_locals.merge(
|
129
|
-
contents: path.file_listing,
|
130
|
-
rendered_readme: rendered_readme
|
131
|
-
)
|
132
|
-
)
|
133
|
-
elsif mode == 'revisions' # list revisions
|
134
|
-
render!(
|
135
|
-
'revisions',
|
136
|
-
layout: 'app',
|
137
|
-
locals: default_locals.merge(revisions: path.revisions)
|
138
|
-
)
|
139
|
-
elsif mode == 'revert' # revert file
|
140
|
-
path.revert(request.params['revision'])
|
141
|
-
redirect!("/#{idx}/#{path.relative_path}")
|
142
|
-
elsif mode == 'delete' # delete file
|
143
|
-
path.remove
|
144
|
-
parent = File.dirname(path.relative_path)
|
145
|
-
parent = '' if parent == '/'
|
146
|
-
parent = nil if parent == '.'
|
147
|
-
redirect!("/#{idx}#{parent}")
|
148
|
-
elsif mode == 'edit' && path.text? # edit file
|
149
|
-
render!(
|
150
|
-
'edit',
|
151
|
-
layout: 'app',
|
152
|
-
locals: default_locals.merge(contents: path.content)
|
153
|
-
)
|
154
|
-
elsif mode != 'raw' # render file
|
155
|
-
revision_path = path.absolute_path(request.params['revision'])
|
156
|
-
contents =
|
157
|
-
begin # attempting to render file
|
158
|
-
%(<div class="tilt">#{render(revision_path)}</div>)
|
159
|
-
rescue RuntimeError # not tilt supported
|
160
|
-
if path.text?
|
161
|
-
<<-EOS.gsub(/^\s+/, '')
|
162
|
-
<pre class="CodeRay">
|
163
|
-
#{CodeRay.scan_file(revision_path).encode(:html)}
|
164
|
-
</pre>
|
165
|
-
EOS
|
166
|
-
else
|
167
|
-
%(<embed class="inline-file" src="/#{idx}#{request.path_info}?mode=raw"></embed>)
|
168
|
-
end
|
169
|
-
end
|
170
|
-
render!(
|
171
|
-
'file',
|
172
|
-
layout: 'app',
|
173
|
-
locals: default_locals.merge(contents: contents)
|
174
|
-
)
|
175
|
-
else # other file
|
176
|
-
run! Rack::File.new(repositories[idx].root)
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
}.setup {
|
181
|
-
views_path(File.expand_path('../views', __FILE__))
|
182
|
-
}
|
37
|
+
map('/settings') { run Gitdocs::SettingsApp }
|
38
|
+
map('/') { run Gitdocs::BrowserApp }
|
183
39
|
end
|
184
40
|
end
|
185
41
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
require 'sinatra/base'
|
4
|
+
require 'haml'
|
5
|
+
require 'yaml'
|
6
|
+
require 'mimetype_fu'
|
7
|
+
|
8
|
+
module Gitdocs
|
9
|
+
class SettingsApp < Sinatra::Base
|
10
|
+
get('/') do
|
11
|
+
haml(
|
12
|
+
:settings,
|
13
|
+
locals: { conf: settings.manager, nav_state: 'settings' }
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
post('/') do
|
18
|
+
settings.manager.update_all(request.POST)
|
19
|
+
redirect to('/')
|
20
|
+
end
|
21
|
+
|
22
|
+
delete('/:id') do
|
23
|
+
id = params[:id].to_i
|
24
|
+
halt(404) unless settings.manager.remove_by_id(id)
|
25
|
+
redirect to('/')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/gitdocs/version.rb
CHANGED
@@ -11,4 +11,6 @@
|
|
11
11
|
%li
|
12
12
|
%a{ href: '?mode=revisions' } Revisions
|
13
13
|
%li
|
14
|
-
%
|
14
|
+
%form{ method: 'POST', :'data-confirm-submit' => 'Are you sure?' }
|
15
|
+
%input{ name: '_method', type: 'hidden', value: 'delete' }
|
16
|
+
%input.btn.danger{ type: 'submit', value: 'Delete' }
|
data/lib/gitdocs/views/dir.haml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
- @title = root
|
2
2
|
|
3
|
-
=
|
3
|
+
= haml(:_header, locals: { file: false, idx: idx })
|
4
4
|
|
5
5
|
- if contents && contents.any?
|
6
6
|
%table#fileListing.condensed-table.zebra-striped
|
@@ -16,7 +16,7 @@
|
|
16
16
|
%tr
|
17
17
|
%td
|
18
18
|
%img{ src: "/img/#{f.is_directory ? 'folder' : 'file'}.png", width: 16, height: 16 }
|
19
|
-
%a{ href: "
|
19
|
+
%a{ href: "#{request.path_info}/#{f.name}" }
|
20
20
|
= f.name
|
21
21
|
%td.author
|
22
22
|
%td.modified
|
@@ -27,16 +27,16 @@
|
|
27
27
|
|
28
28
|
.row
|
29
29
|
.span6
|
30
|
-
%form.upload{ method: 'POST', enctype: 'multipart/form-data'
|
30
|
+
%form.upload{ method: 'POST', enctype: 'multipart/form-data' }
|
31
31
|
%p Upload file to this directory
|
32
|
-
%input.uploader{ type: 'file',
|
32
|
+
%input.uploader{ type: 'file', value: 'Select a file', name: 'file', size: 12 }
|
33
33
|
%input.btn.secondary{ type: 'submit', value: 'Upload file' }
|
34
34
|
.span8
|
35
|
-
%form.add
|
35
|
+
%form.add{ method: 'POST' }
|
36
36
|
%p Add new file or directory
|
37
|
-
%input
|
38
|
-
%input.btn.
|
39
|
-
%input.btn.secondary
|
37
|
+
%input{ type: 'text', name: 'filename', placeholder: 'somefile.md or somedir' }
|
38
|
+
%input.btn.secondary{ type: 'submit', name: 'new_file', value: 'New file' }
|
39
|
+
%input.btn.secondary{ type: 'submit', name: 'new_directory', value: 'New directory' }
|
40
40
|
|
41
41
|
- if rendered_readme
|
42
42
|
.contents
|
data/lib/gitdocs/views/edit.haml
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
- @title = root
|
2
2
|
|
3
|
-
=
|
3
|
+
= haml(:_header, locals: { file: true, idx: idx })
|
4
4
|
|
5
|
-
%form.edit{
|
5
|
+
%form.edit{ method: 'POST', style: 'display:none;' }
|
6
6
|
#editor
|
7
7
|
%textarea#data{ name: 'data' }= preserve contents
|
8
8
|
.clearfix
|
9
9
|
%textarea.span16#message{ name: 'message', placeholder: 'Optional commit message.' }
|
10
|
+
%input{ name: '_method', type: 'hidden', value: 'put' }
|
10
11
|
%input.btn.primary{ type: 'submit', value: 'Save' }
|
11
|
-
%a.btn.secondary{ href:
|
12
|
+
%a.btn.secondary{ href: request.path_info } Cancel
|
12
13
|
%input.filename{ type: 'hidden', value: request.path_info }
|
13
14
|
|
14
|
-
=
|
15
|
+
= erb(:_ace_scripts)
|
data/lib/gitdocs/views/file.haml
CHANGED
data/lib/gitdocs/views/home.haml
CHANGED
File without changes
|
@@ -1,6 +1,6 @@
|
|
1
1
|
- @title = root
|
2
2
|
|
3
|
-
=
|
3
|
+
= haml(:_header, locals: { file: true, idx: idx })
|
4
4
|
|
5
5
|
- if revisions && revisions.any?
|
6
6
|
%table#revisions.condensed-table.zebra-striped
|
@@ -22,7 +22,8 @@
|
|
22
22
|
%td.author= r[:author]
|
23
23
|
%td.date.reldate= r[:date].iso8601
|
24
24
|
%td.revert
|
25
|
-
%
|
26
|
-
|
25
|
+
%form{ method: 'POST', :'data-confirm-submit' => 'Are you sure?' }
|
26
|
+
%input{ name: '_method', type: 'hidden', value: 'put' }
|
27
|
+
%input.btn{ type: 'submit', name: 'revision', value: r[:commit] }
|
27
28
|
- if revisions.empty?
|
28
29
|
%p No revisions for this file could be found.
|
@@ -1,7 +1,7 @@
|
|
1
1
|
- @title = 'Settings'
|
2
2
|
%script{ src: '/js/settings.js', type: 'text/javascript', charset: 'utf-8' }
|
3
3
|
|
4
|
-
%form#settings{ method: 'POST', action: '/
|
4
|
+
%form#settings{ method: 'POST', action: url('/') }
|
5
5
|
%h2 Gitdocs
|
6
6
|
#config.field.config
|
7
7
|
%dl
|
@@ -51,7 +51,7 @@
|
|
51
51
|
%input{ type: 'checkbox', value: '1', name: "share[#{idx}][notification]", checked: share.notification ? 'checked' : nil }
|
52
52
|
%span Notifications?
|
53
53
|
.delete
|
54
|
-
%a.remote_share.btn.danger{ href: "
|
54
|
+
%a.remote_share.btn.danger{ href: url("/#{share.id}"), :'data-method' => 'delete' }
|
55
55
|
Delete
|
56
56
|
|
57
57
|
%input.btn.primary{ value: 'Save', type: 'submit' }
|
data/lib/gitdocs.rb
CHANGED
@@ -20,6 +20,8 @@ describe 'browse and edit repository file through the UI' do
|
|
20
20
|
repository.commit
|
21
21
|
write_file('local/file2', 'A5A5A5A5')
|
22
22
|
repository.commit
|
23
|
+
write_file('local/README.md', 'hello i am a README')
|
24
|
+
repository.commit
|
23
25
|
|
24
26
|
start_daemon
|
25
27
|
|
@@ -32,10 +34,14 @@ describe 'browse and edit repository file through the UI' do
|
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
37
|
+
it 'should show the README' do
|
38
|
+
page.must_have_content('hello i am a README')
|
39
|
+
end
|
40
|
+
|
35
41
|
it 'should browse text files' do
|
36
42
|
within('table#fileListing') do
|
37
43
|
within('tbody') do
|
38
|
-
page.must_have_css('tr', count:
|
44
|
+
page.must_have_css('tr', count: 3)
|
39
45
|
click_link('file1')
|
40
46
|
end
|
41
47
|
end
|
@@ -80,7 +86,7 @@ describe 'browse and edit repository file through the UI' do
|
|
80
86
|
page.must_have_css('tr', count: 2)
|
81
87
|
within(:xpath, '//tr[2]') do
|
82
88
|
within('td.revert') do
|
83
|
-
find('
|
89
|
+
find('input.btn').click
|
84
90
|
end
|
85
91
|
end
|
86
92
|
end
|
@@ -107,7 +113,7 @@ describe 'browse and edit repository file through the UI' do
|
|
107
113
|
describe 'creation' do
|
108
114
|
it 'should allow directory creation' do
|
109
115
|
within('form.add') do
|
110
|
-
fill_in('
|
116
|
+
fill_in('filename', with: 'new_directory')
|
111
117
|
click_button('directory')
|
112
118
|
end
|
113
119
|
within('h2') { page.must_have_content('/new_directory') }
|
@@ -116,7 +122,7 @@ describe 'browse and edit repository file through the UI' do
|
|
116
122
|
|
117
123
|
it 'should allow file creation' do
|
118
124
|
within('form.add') do
|
119
|
-
fill_in('
|
125
|
+
fill_in('filename', with: 'new_file')
|
120
126
|
click_button('file')
|
121
127
|
end
|
122
128
|
|
@@ -137,10 +143,10 @@ describe 'browse and edit repository file through the UI' do
|
|
137
143
|
|
138
144
|
it 'should allow file deletion' do
|
139
145
|
within('table#fileListing') { within('tbody') { click_link('file1') } }
|
140
|
-
|
146
|
+
click_on('Delete')
|
141
147
|
within('table#fileListing') do
|
142
148
|
within('tbody') do
|
143
|
-
page.must_have_css('tr', count:
|
149
|
+
page.must_have_css('tr', count: 2)
|
144
150
|
page.wont_have_content('file1')
|
145
151
|
page.must_have_content('file2')
|
146
152
|
end
|
@@ -12,6 +12,13 @@ describe Gitdocs::Repository::Path do
|
|
12
12
|
FileUtils.rm_rf('tmp/unit')
|
13
13
|
end
|
14
14
|
|
15
|
+
describe '#join' do
|
16
|
+
subject { path.join('new_file') }
|
17
|
+
before { subject }
|
18
|
+
it { path.relative_path.must_equal('directory/file/new_file') }
|
19
|
+
it { path.absolute_path.must_equal(absolute_local_path('new_file')) }
|
20
|
+
end
|
21
|
+
|
15
22
|
describe '#write' do
|
16
23
|
subject { path.write('foobar', :message) }
|
17
24
|
before { repository.expects(:write_commit_message).with(:message) }
|
data/test/unit/search_test.rb
CHANGED
@@ -18,6 +18,11 @@ describe Gitdocs::Search do
|
|
18
18
|
repository2.stubs(:root).returns('root')
|
19
19
|
end
|
20
20
|
|
21
|
+
describe 'term is missing' do
|
22
|
+
let(:term) { nil }
|
23
|
+
it { subject.must_equal({}) }
|
24
|
+
end
|
25
|
+
|
21
26
|
describe 'term is empty' do
|
22
27
|
let(:term) { '' }
|
23
28
|
it { subject.must_equal({}) }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitdocs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.0
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Hull
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-05-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: joshbuddy-guard
|
@@ -40,33 +40,33 @@ dependencies:
|
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: 1.6.2
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
43
|
+
name: sinatra
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - ~>
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: 1.4.5
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - ~>
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: 1.4.5
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: redcarpet
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - ~>
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 3.
|
62
|
+
version: 3.2.2
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - ~>
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 3.
|
69
|
+
version: 3.2.2
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: thor
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,14 +157,14 @@ dependencies:
|
|
157
157
|
requirements:
|
158
158
|
- - ~>
|
159
159
|
- !ruby/object:Gem::Version
|
160
|
-
version: 4.
|
160
|
+
version: 4.2.0
|
161
161
|
type: :runtime
|
162
162
|
prerelease: false
|
163
163
|
version_requirements: !ruby/object:Gem::Requirement
|
164
164
|
requirements:
|
165
165
|
- - ~>
|
166
166
|
- !ruby/object:Gem::Version
|
167
|
-
version: 4.
|
167
|
+
version: 4.2.0
|
168
168
|
- !ruby/object:Gem::Dependency
|
169
169
|
name: grit
|
170
170
|
requirement: !ruby/object:Gem::Requirement
|
@@ -269,14 +269,14 @@ dependencies:
|
|
269
269
|
requirements:
|
270
270
|
- - ~>
|
271
271
|
- !ruby/object:Gem::Version
|
272
|
-
version: 5.
|
272
|
+
version: 5.5.0
|
273
273
|
type: :development
|
274
274
|
prerelease: false
|
275
275
|
version_requirements: !ruby/object:Gem::Requirement
|
276
276
|
requirements:
|
277
277
|
- - ~>
|
278
278
|
- !ruby/object:Gem::Version
|
279
|
-
version: 5.
|
279
|
+
version: 5.5.0
|
280
280
|
- !ruby/object:Gem::Dependency
|
281
281
|
name: capybara_minitest_spec
|
282
282
|
requirement: !ruby/object:Gem::Requirement
|
@@ -395,14 +395,14 @@ dependencies:
|
|
395
395
|
requirements:
|
396
396
|
- - ~>
|
397
397
|
- !ruby/object:Gem::Version
|
398
|
-
version: 0.
|
398
|
+
version: 0.10.0
|
399
399
|
type: :development
|
400
400
|
prerelease: false
|
401
401
|
version_requirements: !ruby/object:Gem::Requirement
|
402
402
|
requirements:
|
403
403
|
- - ~>
|
404
404
|
- !ruby/object:Gem::Version
|
405
|
-
version: 0.
|
405
|
+
version: 0.10.0
|
406
406
|
- !ruby/object:Gem::Dependency
|
407
407
|
name: jslint_on_rails
|
408
408
|
requirement: !ruby/object:Gem::Requirement
|
@@ -421,16 +421,30 @@ dependencies:
|
|
421
421
|
name: coveralls
|
422
422
|
requirement: !ruby/object:Gem::Requirement
|
423
423
|
requirements:
|
424
|
-
- -
|
424
|
+
- - ! '>='
|
425
425
|
- !ruby/object:Gem::Version
|
426
|
-
version: 0
|
426
|
+
version: '0'
|
427
427
|
type: :development
|
428
428
|
prerelease: false
|
429
429
|
version_requirements: !ruby/object:Gem::Requirement
|
430
430
|
requirements:
|
431
|
-
- -
|
431
|
+
- - ! '>='
|
432
|
+
- !ruby/object:Gem::Version
|
433
|
+
version: '0'
|
434
|
+
- !ruby/object:Gem::Dependency
|
435
|
+
name: shotgun
|
436
|
+
requirement: !ruby/object:Gem::Requirement
|
437
|
+
requirements:
|
438
|
+
- - ! '>='
|
432
439
|
- !ruby/object:Gem::Version
|
433
|
-
version: 0
|
440
|
+
version: '0'
|
441
|
+
type: :development
|
442
|
+
prerelease: false
|
443
|
+
version_requirements: !ruby/object:Gem::Requirement
|
444
|
+
requirements:
|
445
|
+
- - ! '>='
|
446
|
+
- !ruby/object:Gem::Version
|
447
|
+
version: '0'
|
434
448
|
description: Open-source Dropbox using Ruby and Git.
|
435
449
|
email:
|
436
450
|
- joshbuddy@gmail.com
|
@@ -451,8 +465,10 @@ files:
|
|
451
465
|
- README.md
|
452
466
|
- Rakefile
|
453
467
|
- bin/gitdocs
|
468
|
+
- config.ru
|
454
469
|
- gitdocs.gemspec
|
455
470
|
- lib/gitdocs.rb
|
471
|
+
- lib/gitdocs/browser_app.rb
|
456
472
|
- lib/gitdocs/cli.rb
|
457
473
|
- lib/gitdocs/configuration.rb
|
458
474
|
- lib/gitdocs/manager.rb
|
@@ -512,20 +528,21 @@ files:
|
|
512
528
|
- lib/gitdocs/public/js/search.js
|
513
529
|
- lib/gitdocs/public/js/settings.js
|
514
530
|
- lib/gitdocs/public/js/util.js
|
515
|
-
- lib/gitdocs/
|
531
|
+
- lib/gitdocs/rendering_helper.rb
|
516
532
|
- lib/gitdocs/repository.rb
|
517
533
|
- lib/gitdocs/repository/path.rb
|
518
534
|
- lib/gitdocs/runner.rb
|
519
535
|
- lib/gitdocs/search.rb
|
520
536
|
- lib/gitdocs/server.rb
|
537
|
+
- lib/gitdocs/settings_app.rb
|
521
538
|
- lib/gitdocs/version.rb
|
522
539
|
- lib/gitdocs/views/_ace_scripts.erb
|
523
540
|
- lib/gitdocs/views/_header.haml
|
524
|
-
- lib/gitdocs/views/app.haml
|
525
541
|
- lib/gitdocs/views/dir.haml
|
526
542
|
- lib/gitdocs/views/edit.haml
|
527
543
|
- lib/gitdocs/views/file.haml
|
528
544
|
- lib/gitdocs/views/home.haml
|
545
|
+
- lib/gitdocs/views/layout.haml
|
529
546
|
- lib/gitdocs/views/revisions.haml
|
530
547
|
- lib/gitdocs/views/search.haml
|
531
548
|
- lib/gitdocs/views/settings.haml
|
@@ -543,7 +560,7 @@ files:
|
|
543
560
|
- test/unit/runner_test.rb
|
544
561
|
- test/unit/search_test.rb
|
545
562
|
- test/unit/test_helper.rb
|
546
|
-
homepage:
|
563
|
+
homepage: https://github.com/nesquena/gitdocs
|
547
564
|
licenses:
|
548
565
|
- MIT
|
549
566
|
metadata: {}
|
@@ -558,9 +575,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
558
575
|
version: '1.9'
|
559
576
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
560
577
|
requirements:
|
561
|
-
- - ! '
|
578
|
+
- - ! '>='
|
562
579
|
- !ruby/object:Gem::Version
|
563
|
-
version:
|
580
|
+
version: '0'
|
564
581
|
requirements: []
|
565
582
|
rubyforge_project: gitdocs
|
566
583
|
rubygems_version: 2.0.7
|
data/lib/gitdocs/rendering.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
|
-
# rubocop:disable LineLength
|
4
|
-
|
5
|
-
# This should not exist but I cannot find any other way to prevent redcarpet
|
6
|
-
# from complaining
|
7
|
-
# > WARN: tilt autoloading 'redcarpet' in a non thread-safe way; explicit require'redcarpet' suggested.
|
8
|
-
# > !! Unexpected error while processing request: Input must be UTF-8 or US-ASCII, ASCII-8BIT given
|
9
|
-
# > Input must be UTF-8 or US-ASCII, ASCII-8BIT given
|
10
|
-
# > gems/redcarpet-2.0.1/lib/redcarpet.rb:70:in `render'
|
11
|
-
# > gems/redcarpet-2.0.1/lib/redcarpet.rb:70:in `to_html'
|
12
|
-
# > gems/tilt-1.3.3/lib/tilt/markdown.rb:38:in `evaluate'
|
13
|
-
# > gems/tilt-1.3.3/lib/tilt/markdown.rb:61:in `evaluate'
|
14
|
-
# > gems/tilt-1.3.3/lib/tilt/template.rb:76:in `render'
|
15
|
-
|
16
|
-
require 'redcarpet'
|
17
|
-
|
18
|
-
# Compatibility class;
|
19
|
-
# Creates a instance of Redcarpet with the RedCloth
|
20
|
-
# API. This instance has no extensions enabled whatsoever,
|
21
|
-
# and no accessors to change this. 100% pure, standard
|
22
|
-
# Markdown.
|
23
|
-
class RedcarpetCompat
|
24
|
-
def to_html(*_dummy)
|
25
|
-
@text = @text.force_encoding('utf-8') if @text.respond_to?(:force_encoding)
|
26
|
-
@markdown.render(@text)
|
27
|
-
end
|
28
|
-
end
|