libdolt 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -0
- data/Gemfile.lock +56 -0
- data/Rakefile +10 -0
- data/Readme.md +99 -0
- data/lib/libdolt/async/when.rb +128 -0
- data/lib/libdolt/disk_repo_resolver.rb +39 -0
- data/lib/libdolt/git/blame.rb +112 -0
- data/lib/libdolt/git/commit.rb +73 -0
- data/lib/libdolt/git/repository.rb +139 -0
- data/lib/libdolt/git/submodule.rb +35 -0
- data/lib/libdolt/git/tree.rb +42 -0
- data/lib/libdolt/repo_actions.rb +95 -0
- data/lib/libdolt/version.rb +21 -0
- data/lib/libdolt/view/binary_blob_embedder.rb +41 -0
- data/lib/libdolt/view/blame.rb +57 -0
- data/lib/libdolt/view/blob.rb +97 -0
- data/lib/libdolt/view/breadcrumb.rb +47 -0
- data/lib/libdolt/view/commit.rb +27 -0
- data/lib/libdolt/view/gravatar.rb +29 -0
- data/lib/libdolt/view/markup.rb +44 -0
- data/lib/libdolt/view/multi_repository.rb +27 -0
- data/lib/libdolt/view/object.rb +44 -0
- data/lib/libdolt/view/single_repository.rb +27 -0
- data/lib/libdolt/view/smart_blob_renderer.rb +33 -0
- data/lib/libdolt/view/syntax_highlight.rb +40 -0
- data/lib/libdolt/view/tab_width.rb +30 -0
- data/lib/libdolt/view/tree.rb +100 -0
- data/lib/libdolt/view.rb +23 -0
- data/lib/libdolt.rb +29 -0
- data/libdolt.gemspec +35 -0
- data/test/libdolt/async/when_test.rb +112 -0
- data/test/libdolt/git/blame_test.rb +128 -0
- data/test/libdolt/git/commit_test.rb +89 -0
- data/test/libdolt/git/repository_test.rb +186 -0
- data/test/libdolt/repo_actions_test.rb +236 -0
- data/test/libdolt/templates/blame_test.rb +54 -0
- data/test/libdolt/templates/blob_test.rb +116 -0
- data/test/libdolt/templates/commits_test.rb +59 -0
- data/test/libdolt/templates/raw_test.rb +39 -0
- data/test/libdolt/templates/refs_test.rb +36 -0
- data/test/libdolt/templates/tree_history_test.rb +91 -0
- data/test/libdolt/templates/tree_test.rb +63 -0
- data/test/libdolt/view/binary_blob_embedder_test.rb +49 -0
- data/test/libdolt/view/blame_test.rb +122 -0
- data/test/libdolt/view/blob_test.rb +116 -0
- data/test/libdolt/view/breadcrumb_test.rb +46 -0
- data/test/libdolt/view/commit_test.rb +31 -0
- data/test/libdolt/view/gravatar_test.rb +30 -0
- data/test/libdolt/view/markup_test.rb +70 -0
- data/test/libdolt/view/multi_repository_test.rb +35 -0
- data/test/libdolt/view/object_test.rb +83 -0
- data/test/libdolt/view/single_repository_test.rb +30 -0
- data/test/libdolt/view/smart_blob_renderer_test.rb +38 -0
- data/test/libdolt/view/syntax_highlight_test.rb +80 -0
- data/test/libdolt/view/tab_width_test.rb +40 -0
- data/test/libdolt/view/tree_test.rb +196 -0
- data/test/test_helper.rb +50 -0
- data/views/500.erb +22 -0
- data/views/blame.erb +42 -0
- data/views/blob.erb +31 -0
- data/views/commits.erb +26 -0
- data/views/index.erb +25 -0
- data/views/layout.erb +45 -0
- data/views/raw.erb +19 -0
- data/views/refs.erb +22 -0
- data/views/tree.erb +50 -0
- data/views/tree_history.erb +19 -0
- metadata +326 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Dolt
|
20
|
+
module Git
|
21
|
+
class Tree
|
22
|
+
attr_reader :oid, :entries
|
23
|
+
include Enumerable
|
24
|
+
|
25
|
+
def initialize(oid, entries)
|
26
|
+
@oid = oid
|
27
|
+
@entries = entries
|
28
|
+
end
|
29
|
+
|
30
|
+
def each(&block)
|
31
|
+
entries.each(&block)
|
32
|
+
end
|
33
|
+
|
34
|
+
# From Rugged::Tree
|
35
|
+
def inspect
|
36
|
+
data = "#<Dolt::Git::Tree:#{object_id} {oid: #{oid}}>\n"
|
37
|
+
self.each { |e| data << " <\"#{e[:name]}\" #{e[:oid]}>\n" }
|
38
|
+
data
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
|
2
|
+
# encoding: utf-8
|
3
|
+
#--
|
4
|
+
# Copyright (C) 2012 Gitorious AS
|
5
|
+
#
|
6
|
+
# This program is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
require "eventmachine"
|
20
|
+
|
21
|
+
# Need consistent Time formatting in JSON
|
22
|
+
require "time"
|
23
|
+
class Time; def to_json(*args); "\"#{iso8601}\""; end; end
|
24
|
+
|
25
|
+
module Dolt
|
26
|
+
class RepoActions
|
27
|
+
def initialize(repo_resolver)
|
28
|
+
@repo_resolver = repo_resolver
|
29
|
+
end
|
30
|
+
|
31
|
+
def blob(repo, ref, path, &block)
|
32
|
+
repo_action(repo, ref, path, :blob, :rev_parse, "#{ref}:#{path}", &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def tree(repo, ref, path, &block)
|
36
|
+
repo_action(repo, ref, path, :tree, :tree, ref, path, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def blame(repo, ref, path, &block)
|
40
|
+
repo_action(repo, ref, path, :blame, :blame, ref, path, &block)
|
41
|
+
end
|
42
|
+
|
43
|
+
def history(repo, ref, path, count, &block)
|
44
|
+
repo_action(repo, ref, path, :commits, :log, ref, path, count, &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
def refs(repo, &block)
|
48
|
+
repository = repo_resolver.resolve(repo)
|
49
|
+
d = repository.refs
|
50
|
+
d.callback do |refs|
|
51
|
+
names = refs.map(&:name)
|
52
|
+
block.call(nil, {
|
53
|
+
:repository => repo,
|
54
|
+
:tags => stripped_ref_names(names, :tags),
|
55
|
+
:heads => stripped_ref_names(names, :heads)
|
56
|
+
})
|
57
|
+
end
|
58
|
+
d.errback { |err| block.call(err, nil) }
|
59
|
+
end
|
60
|
+
|
61
|
+
def tree_history(repo, ref, path, count, &block)
|
62
|
+
repo_action(repo, ref, path, :tree, :tree_history, ref, path, count, &block)
|
63
|
+
end
|
64
|
+
|
65
|
+
def repositories
|
66
|
+
repo_resolver.all
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
def repo_resolver; @repo_resolver; end
|
71
|
+
|
72
|
+
def repo_action(repo, ref, path, data, method, *args, &block)
|
73
|
+
repository = repo_resolver.resolve(repo)
|
74
|
+
d = repository.send(method, *args)
|
75
|
+
d.callback do |result|
|
76
|
+
block.call(nil, tpl_data(repo, ref, path, { data => result }))
|
77
|
+
end
|
78
|
+
d.errback { |err| block.call(err, nil) }
|
79
|
+
end
|
80
|
+
|
81
|
+
def tpl_data(repo, ref, path, locals = {})
|
82
|
+
{
|
83
|
+
:repository => repo,
|
84
|
+
:path => path,
|
85
|
+
:ref => ref
|
86
|
+
}.merge(locals)
|
87
|
+
end
|
88
|
+
|
89
|
+
def stripped_ref_names(names, type)
|
90
|
+
names.select { |n| n =~ /#{type}/ }.map do |n|
|
91
|
+
n.sub(/^refs\/#{type}\//, "")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Dolt
|
20
|
+
VERSION = "0.6.0"
|
21
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
require "mime/types"
|
19
|
+
|
20
|
+
module Dolt
|
21
|
+
module View
|
22
|
+
module BinaryBlobEmbedder
|
23
|
+
def image?(path, content)
|
24
|
+
MIME::Types.type_for(path).any? { |mt| mt.media_type == "image" }
|
25
|
+
end
|
26
|
+
|
27
|
+
def format_binary_blob(path, content, repository, ref)
|
28
|
+
if !image?(path, content)
|
29
|
+
return link_binary_blob(path, content, repository, ref)
|
30
|
+
end
|
31
|
+
|
32
|
+
url = raw_url(repository, ref, path)
|
33
|
+
<<-HTML
|
34
|
+
<p class="prettyprint">
|
35
|
+
<a href="#{url}"><img src="#{url}" alt="#{path}"></a>
|
36
|
+
</p>
|
37
|
+
HTML
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Dolt
|
20
|
+
module View
|
21
|
+
module Blame
|
22
|
+
def blame_annotations(blame)
|
23
|
+
blame.chunks.inject([]) do |blames, chunk|
|
24
|
+
blames << chunk
|
25
|
+
(chunk[:lines].length - 1).times { blames << nil }
|
26
|
+
blames
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def blame_lines(path, blame)
|
31
|
+
lines = blame.chunks.inject([]) do |lines, chunk|
|
32
|
+
lines.concat(chunk[:lines])
|
33
|
+
end
|
34
|
+
|
35
|
+
return lines unless respond_to?(:highlight)
|
36
|
+
highlight(path, lines.join("\n")).split("\n")
|
37
|
+
end
|
38
|
+
|
39
|
+
def blame_annotation_cell(annotation)
|
40
|
+
class_name = "gts-blame-annotation" + (annotation.nil? ? "" : " gts-annotated")
|
41
|
+
return "<td class=\"#{class_name}\"></td>" if annotation.nil?
|
42
|
+
|
43
|
+
<<-HTML
|
44
|
+
<td class="#{class_name}">
|
45
|
+
<span class="gts-sha">#{annotation[:oid][0..7]}</span>
|
46
|
+
#{annotation[:committer][:time].strftime("%Y-%m-%d")}
|
47
|
+
#{annotation[:committer][:name]}
|
48
|
+
</td>
|
49
|
+
HTML
|
50
|
+
end
|
51
|
+
|
52
|
+
def blame_code_cell(line)
|
53
|
+
"<td class=\"gts-code\"><code>#{line}</code></td>"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
require "htmlentities"
|
19
|
+
|
20
|
+
module Dolt
|
21
|
+
module View
|
22
|
+
module Blob
|
23
|
+
def binary?(content)
|
24
|
+
!content[0...(content.length-1)].index("\000").nil?
|
25
|
+
end
|
26
|
+
|
27
|
+
def entityfy(content)
|
28
|
+
@coder ||= HTMLEntities.new
|
29
|
+
@coder.encode(content)
|
30
|
+
end
|
31
|
+
|
32
|
+
def format_blob(path, content, repo = nil, ref = nil)
|
33
|
+
return format_binary_blob(path, content, repo, ref) if binary?(content)
|
34
|
+
format_text_blob(path, content, repo, ref)
|
35
|
+
end
|
36
|
+
|
37
|
+
def format_binary_blob(path, content, repository = nil, ref = nil)
|
38
|
+
link_binary_blob(path, content, repository, ref)
|
39
|
+
end
|
40
|
+
|
41
|
+
def link_binary_blob(path, content, repository = nil, ref = nil)
|
42
|
+
<<-HTML
|
43
|
+
<p class="prettyprint">
|
44
|
+
The content you're attempting to browse appears to be binary.
|
45
|
+
<a href="#{raw_url(repository, ref, path)}">Download #{File.basename(path)}</a>.
|
46
|
+
</p>
|
47
|
+
HTML
|
48
|
+
end
|
49
|
+
|
50
|
+
def format_text_blob(path, content, repository = nil, ref = nil)
|
51
|
+
multiline(entityfy(content))
|
52
|
+
end
|
53
|
+
|
54
|
+
def blob_url(repository, ref, path)
|
55
|
+
repo_url(repository, "/blob/#{ref}:#{path}")
|
56
|
+
end
|
57
|
+
|
58
|
+
def blame_url(repository, ref, path)
|
59
|
+
repo_url(repository, "/blame/#{ref}:#{path}")
|
60
|
+
end
|
61
|
+
|
62
|
+
def history_url(repository, ref, path)
|
63
|
+
repo_url(repository, "/history/#{ref}:#{path}")
|
64
|
+
end
|
65
|
+
|
66
|
+
def raw_url(repository, ref, path)
|
67
|
+
repo_url(repository, "/raw/#{ref}:#{path}")
|
68
|
+
end
|
69
|
+
|
70
|
+
def tree_history_url(repository, ref, path)
|
71
|
+
repo_url(repository, "/tree_history/#{ref}:#{path}")
|
72
|
+
end
|
73
|
+
|
74
|
+
def format_whitespace(text)
|
75
|
+
text
|
76
|
+
end
|
77
|
+
|
78
|
+
def multiline(blob, options = {})
|
79
|
+
class_names = options[:class_names] || []
|
80
|
+
class_names << "prettyprint" << "linenums"
|
81
|
+
|
82
|
+
num = 0
|
83
|
+
lines = blob.split("\n").inject("") do |html, line|
|
84
|
+
num += 1
|
85
|
+
# Empty elements causes annoying rendering artefacts
|
86
|
+
# Forcing one space on each line affects copy-paste negatively
|
87
|
+
# TODO: Don't force one space, find CSS fix
|
88
|
+
line = format_whitespace(line).sub(/^$/, " ")
|
89
|
+
"#{html}<li class=\"L#{num}\"><span class=\"line\">#{line}</span></li>"
|
90
|
+
end
|
91
|
+
|
92
|
+
"<pre class=\"#{class_names.join(' ')}\">" +
|
93
|
+
"<ol class=\"linenums\">#{lines}</ol></pre>"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Dolt
|
20
|
+
module View
|
21
|
+
module Breadcrumb
|
22
|
+
def breadcrumb(repository, ref, path)
|
23
|
+
dirs = path.split("/")
|
24
|
+
filename = dirs.pop
|
25
|
+
dir_html = accumulate_dirs(dirs, repository, ref)
|
26
|
+
url = repo_url(repository, "/tree/#{ref}")
|
27
|
+
<<-HTML
|
28
|
+
<ul class="breadcrumb">
|
29
|
+
<li><a href="#{url}:"><i class="icon icon-file"></i> /</a></li>
|
30
|
+
#{dir_html}<li class="active">#{filename}</li>
|
31
|
+
</ul>
|
32
|
+
HTML
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def accumulate_dirs(dirs, repository, ref)
|
37
|
+
accumulated = []
|
38
|
+
divider = "<span class=\"divider\">/</span>"
|
39
|
+
dir_html = dirs.inject("") do |html, dir|
|
40
|
+
accumulated << dir
|
41
|
+
url = repo_url(repository, "/tree/#{ref}:#{accumulated.join('/')}")
|
42
|
+
"#{html}<li><a href=\"#{url}\">#{dir}#{divider}</a></li>"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Dolt
|
20
|
+
module View
|
21
|
+
module Commit
|
22
|
+
def commit_oid(oid)
|
23
|
+
oid[0...7]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
require 'digest/md5'
|
19
|
+
|
20
|
+
module Dolt
|
21
|
+
module View
|
22
|
+
module Gravatar
|
23
|
+
def gravatar(email)
|
24
|
+
hashed = Digest::MD5.hexdigest(email.downcase)
|
25
|
+
"http://www.gravatar.com/avatar/#{hashed}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
require "makeup/markup"
|
19
|
+
require "makeup/syntax_highlighter"
|
20
|
+
|
21
|
+
module Dolt
|
22
|
+
module View
|
23
|
+
module Markup
|
24
|
+
def render_markup(path, content)
|
25
|
+
"<div class=\"gts-markup\">#{markuper.render(path, content)}</div>"
|
26
|
+
end
|
27
|
+
|
28
|
+
def supported_markup_format?(path)
|
29
|
+
Makeup::Markup.can_render?(path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def format_text_blob(path, code, repo = nil, ref = nil)
|
33
|
+
render_markup(path, code)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def markuper
|
38
|
+
return @markuper if @markuper
|
39
|
+
highlighter = Makeup::SyntaxHighlighter.new
|
40
|
+
@markuper = Makeup::Markup.new(:highlighter => highlighter)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Dolt
|
20
|
+
module View
|
21
|
+
module MultiRepository
|
22
|
+
def repo_url(repository, url)
|
23
|
+
"/#{repository}#{url}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Dolt
|
20
|
+
module View
|
21
|
+
module Object
|
22
|
+
def object_url(repository, ref, path, object)
|
23
|
+
return object[:url] if object[:type] == :submodule
|
24
|
+
url = "/#{object[:type]}/#{ref}:#{object_path(path, object)}"
|
25
|
+
repo_url(repository, url)
|
26
|
+
end
|
27
|
+
|
28
|
+
def object_path(root, object)
|
29
|
+
File.join(root, object[:name]).sub(/^\//, "")
|
30
|
+
end
|
31
|
+
|
32
|
+
def object_icon_class(entry)
|
33
|
+
case entry[:type]
|
34
|
+
when :blob
|
35
|
+
"icon-file"
|
36
|
+
when :tree
|
37
|
+
"icon-folder-close"
|
38
|
+
when :submodule
|
39
|
+
"icon-hdd"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Dolt
|
20
|
+
module View
|
21
|
+
module SingleRepository
|
22
|
+
def repo_url(repository, url)
|
23
|
+
url
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
require "libdolt/view/syntax_highlight"
|
19
|
+
require "libdolt/view/markup"
|
20
|
+
|
21
|
+
module Dolt
|
22
|
+
module View
|
23
|
+
module SmartBlobRenderer
|
24
|
+
include Dolt::View::Markup
|
25
|
+
include Dolt::View::SyntaxHighlight
|
26
|
+
|
27
|
+
def format_text_blob(path, content, repo = nil, ref = nil, options = {})
|
28
|
+
return render_markup(path, content) if supported_markup_format?(path)
|
29
|
+
highlight_multiline(path, content, options)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8 -- Copyright (C) 2012 Gitorious AS
|
2
|
+
#
|
3
|
+
# This program is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU Affero General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU Affero General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Affero General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
#++
|
16
|
+
require "makeup/syntax_highlighter"
|
17
|
+
|
18
|
+
module Dolt
|
19
|
+
module View
|
20
|
+
module SyntaxHighlight
|
21
|
+
def highlighter
|
22
|
+
@highlighter ||= Makeup::SyntaxHighlighter.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def highlight(path, code, options = {})
|
26
|
+
highlighter.highlight(path, code, options).code
|
27
|
+
end
|
28
|
+
|
29
|
+
def highlight_multiline(path, code, options = {})
|
30
|
+
return highlight(path, code, options) unless respond_to?(:multiline)
|
31
|
+
res = highlighter.highlight(path, code, options)
|
32
|
+
multiline(res.code, :class_names => [res.lexer])
|
33
|
+
end
|
34
|
+
|
35
|
+
def format_text_blob(path, code, repo = nil, ref = nil, options = {})
|
36
|
+
highlight_multiline(path, code, options)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|