libdolt 0.6.0 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- libdolt (0.6.0)
4
+ libdolt (0.6.2)
5
5
  em_pessimistic (~> 0.1)
6
6
  em_rugged (~> 0.1.2)
7
7
  eventmachine (~> 1.0)
@@ -10,6 +10,7 @@ PATH
10
10
  makeup (~> 0)
11
11
  mime-types (~> 1.19)
12
12
  tzinfo (~> 0.3)
13
+ when (~> 0)
13
14
 
14
15
  GEM
15
16
  remote: http://rubygems.org/
@@ -18,7 +19,7 @@ GEM
18
19
  eventmachine
19
20
  em_pessimistic (0.1.2)
20
21
  eventmachine (~> 1.0)
21
- em_rugged (0.1.3)
22
+ em_rugged (0.1.5)
22
23
  eventmachine (~> 1.0)
23
24
  rugged (= 0.17.0.b6)
24
25
  eventmachine (1.0.0)
@@ -39,9 +40,10 @@ GEM
39
40
  redcarpet (2.1.1)
40
41
  rugged (0.17.0.b6)
41
42
  tilt (1.3.3)
42
- tiltout (1.0.0)
43
+ tiltout (1.1.0)
43
44
  tilt (~> 1.3)
44
45
  tzinfo (0.3.33)
46
+ when (0.1.0)
45
47
  yajl-ruby (1.1.0)
46
48
 
47
49
  PLATFORMS
data/lib/libdolt.rb CHANGED
@@ -19,6 +19,7 @@
19
19
 
20
20
  require "libdolt/version"
21
21
  require "libdolt/disk_repo_resolver"
22
+ require "libdolt/gitorious_repo_resolver"
22
23
  require "libdolt/repo_actions"
23
24
  require "libdolt/view"
24
25
 
@@ -17,37 +17,45 @@
17
17
  #++
18
18
  require "em_rugged/repository"
19
19
  require "em_pessimistic/deferrable_child_process"
20
- require "em/deferrable"
21
20
  require "libdolt/git/blame"
22
21
  require "libdolt/git/commit"
23
22
  require "libdolt/git/submodule"
24
23
  require "libdolt/git/tree"
25
- require "libdolt/async/when"
24
+ require "when"
26
25
 
27
26
  module Dolt
28
27
  module Git
29
28
  class Repository < EMRugged::Repository
30
29
  def submodules(ref)
31
- d = EventMachine::DefaultDeferrable.new
30
+ d = When.defer
32
31
  gm = rev_parse("#{ref}:.gitmodules")
33
32
  gm.callback do |config|
34
- d.succeed(Dolt::Git::Submodule.parse_config(config.content))
33
+ d.resolve(Dolt::Git::Submodule.parse_config(config.content))
35
34
  end
36
35
  # Fails if .gitmodules cannot be found, which means no submodules
37
- gm.errback { |err| d.succeed([]) }
36
+ gm.errback { |err| d.resolve([]) }
38
37
  d
39
38
  end
40
39
 
40
+ def tree_entry(ref, path)
41
+ When.defer do |d|
42
+ rp = rev_parse("#{ref}:#{path}")
43
+ rp.callback { |object| annotate_tree(d, ref, path, object) }
44
+ rp.errback { |err| d.reject(err) }
45
+ end
46
+ end
47
+
41
48
  def tree(ref, path)
42
- d = EventMachine::DefaultDeferrable.new
43
- rp = rev_parse("#{ref}:#{path}")
44
- rp.callback do |tree|
45
- break d.fail(StandardError.new("Not a tree")) unless tree.is_a?(Rugged::Tree)
46
- break d.succeed(tree) if !tree.find { |e| e[:type].nil? }
47
- annotate_submodules(ref, path, d, tree)
49
+ When.defer do |d|
50
+ rp = rev_parse("#{ref}:#{path}")
51
+ rp.callback do |object|
52
+ if !object.is_a?(Rugged::Tree)
53
+ next d.reject(StandardError.new("Not a tree"))
54
+ end
55
+ annotate_tree(d, ref, path, object)
56
+ end
57
+ rp.errback { |err| d.reject(err) }
48
58
  end
49
- rp.errback { |err| d.fail(err) }
50
- d
51
59
  end
52
60
 
53
61
  def blame(ref, path)
@@ -61,18 +69,18 @@ module Dolt
61
69
  end
62
70
 
63
71
  def tree_history(ref, path, limit = 1)
64
- d = EventMachine::DefaultDeferrable.new
72
+ d = When.defer
65
73
  rp = rev_parse("#{ref}:#{path}")
66
- rp.errback { |err| d.fail(err) }
74
+ rp.errback { |err| d.reject(err) }
67
75
  rp.callback do |tree|
68
76
  if tree.class != Rugged::Tree
69
77
  message = "#{ref}:#{path} is not a tree (#{tree.class.to_s})"
70
- break d.fail(Exception.new(message))
78
+ break d.reject(Exception.new(message))
71
79
  end
72
80
 
73
81
  building = build_history(path || "./", ref, tree, limit)
74
- building.callback { |history| d.succeed(history) }
75
- building.errback { |err| d.fail(err) }
82
+ building.callback { |history| d.resolve(history) }
83
+ building.errback { |err| d.reject(err) }
76
84
  end
77
85
  d
78
86
  end
@@ -85,19 +93,27 @@ module Dolt
85
93
  end
86
94
 
87
95
  def build_history(path, ref, entries, limit)
88
- d = EventMachine::DefaultDeferrable.new
96
+ d = When.defer
89
97
  resolve = lambda { |p| path == "" ? p : File.join(path, p) }
90
98
  progress = When.all(entries.map do |e|
91
99
  entry_history(ref, resolve.call(e[:name]), limit)
92
100
  end)
93
- progress.errback { |e| d.fail(e) }
101
+ progress.errback { |e| d.reject(e) }
94
102
  progress.callback do |history|
95
- d.succeed(entries.map { |e| e.merge({ :history => history.shift }) })
103
+ d.resolve(entries.map { |e| e.merge({ :history => history.shift }) })
96
104
  end
97
105
  d
98
106
  end
99
107
 
100
- def annotate_submodules(ref, path, deferrable, tree)
108
+ def annotate_tree(d, ref, path, object)
109
+ if object.class.to_s.match(/Blob/) || !object.find { |e| e[:type].nil? }
110
+ return d.resolve(object)
111
+ end
112
+
113
+ annotate_submodules(d, ref, path, object)
114
+ end
115
+
116
+ def annotate_submodules(deferrable, ref, path, tree)
101
117
  submodules(ref).callback do |submodules|
102
118
  entries = tree.entries.map do |entry|
103
119
  if entry[:type].nil?
@@ -111,21 +127,21 @@ module Dolt
111
127
  entry
112
128
  end
113
129
 
114
- deferrable.succeed(Dolt::Git::Tree.new(tree.oid, entries))
130
+ deferrable.resolve(Dolt::Git::Tree.new(tree.oid, entries))
115
131
  end
116
132
  end
117
133
 
118
134
  def deferred_method(cmd, &block)
119
- d = EventMachine::DefaultDeferrable.new
135
+ d = When.defer
120
136
  cmd = git(cmd)
121
137
  p = EMPessimistic::DeferrableChildProcess.open(cmd)
122
138
 
123
139
  p.callback do |output, status|
124
- d.succeed(block.call(output, status))
140
+ d.resolve(block.call(output, status))
125
141
  end
126
142
 
127
143
  p.errback do |stderr, status|
128
- d.fail(stderr)
144
+ d.reject(stderr)
129
145
  end
130
146
 
131
147
  d
@@ -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
+
19
+ module Dolt
20
+ class GitoriousRepoResolver
21
+ def initialize(repository)
22
+ @repository = repository
23
+ end
24
+
25
+ def resolve(repo)
26
+ Dolt::Git::Repository.new(@repository.full_repository_path)
27
+ end
28
+ end
29
+ end
@@ -36,6 +36,16 @@ module Dolt
36
36
  repo_action(repo, ref, path, :tree, :tree, ref, path, &block)
37
37
  end
38
38
 
39
+ def tree_entry(repo, ref, path, &block)
40
+ repository = repo_resolver.resolve(repo)
41
+ d = repository.tree_entry(ref, path)
42
+ d.callback do |result|
43
+ key = result.class.to_s.match(/Blob/) ? :blob : :tree
44
+ block.call(nil, tpl_data(repo, ref, path, { key => result, :type => key }))
45
+ end
46
+ d.errback { |err| block.call(err, nil) }
47
+ end
48
+
39
49
  def blame(repo, ref, path, &block)
40
50
  repo_action(repo, ref, path, :blame, :blame, ref, path, &block)
41
51
  end
@@ -17,5 +17,5 @@
17
17
  #++
18
18
 
19
19
  module Dolt
20
- VERSION = "0.6.0"
20
+ VERSION = "0.6.2"
21
21
  end
@@ -51,26 +51,6 @@ The content you're attempting to browse appears to be binary.
51
51
  multiline(entityfy(content))
52
52
  end
53
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
54
  def format_whitespace(text)
75
55
  text
76
56
  end
@@ -23,10 +23,10 @@ module Dolt
23
23
  dirs = path.split("/")
24
24
  filename = dirs.pop
25
25
  dir_html = accumulate_dirs(dirs, repository, ref)
26
- url = repo_url(repository, "/tree/#{ref}")
26
+ url = tree_url(repository, ref)
27
27
  <<-HTML
28
28
  <ul class="breadcrumb">
29
- <li><a href="#{url}:"><i class="icon icon-file"></i> /</a></li>
29
+ <li><a href="#{url}"><i class="icon icon-file"></i> /</a></li>
30
30
  #{dir_html}<li class="active">#{filename}</li>
31
31
  </ul>
32
32
  HTML
@@ -38,7 +38,7 @@ module Dolt
38
38
  divider = "<span class=\"divider\">/</span>"
39
39
  dir_html = dirs.inject("") do |html, dir|
40
40
  accumulated << dir
41
- url = repo_url(repository, "/tree/#{ref}:#{accumulated.join('/')}")
41
+ url = tree_url(repository, ref, accumulated.join('/'))
42
42
  "#{html}<li><a href=\"#{url}\">#{dir}#{divider}</a></li>"
43
43
  end
44
44
  end
@@ -19,16 +19,6 @@
19
19
  module Dolt
20
20
  module View
21
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
22
  def object_icon_class(entry)
33
23
  case entry[:type]
34
24
  when :blob
@@ -19,8 +19,13 @@
19
19
  module Dolt
20
20
  module View
21
21
  module Tree
22
- def tree_url(repository, ref, path)
23
- repo_url(repository, "/tree/#{ref}:#{path}")
22
+ def object_path(root, object)
23
+ File.join(root, object[:name]).sub(/^\//, "")
24
+ end
25
+
26
+ def object_url(repository, ref, path, object)
27
+ return object[:url] if object[:type] == :submodule
28
+ send(:"#{object[:type]}_url", repository, ref, object_path(path, object))
24
29
  end
25
30
 
26
31
  def tree_entries(tree)
@@ -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 Urls
22
+ def tree_url(repository, ref, path = "")
23
+ repo_url(repository, "/tree/#{ref}:#{path}")
24
+ end
25
+
26
+ def blob_url(repository, ref, path)
27
+ repo_url(repository, "/blob/#{ref}:#{path}")
28
+ end
29
+
30
+ def blame_url(repository, ref, path)
31
+ repo_url(repository, "/blame/#{ref}:#{path}")
32
+ end
33
+
34
+ def history_url(repository, ref, path)
35
+ repo_url(repository, "/history/#{ref}:#{path}")
36
+ end
37
+
38
+ def raw_url(repository, ref, path)
39
+ repo_url(repository, "/raw/#{ref}:#{path}")
40
+ end
41
+
42
+ def tree_history_url(repository, ref, path)
43
+ repo_url(repository, "/tree_history/#{ref}:#{path}")
44
+ end
45
+ end
46
+ end
47
+ end
data/libdolt.gemspec CHANGED
@@ -14,6 +14,7 @@ Gem::Specification.new do |s|
14
14
  s.rubyforge_project = "libdolt"
15
15
 
16
16
  s.add_dependency "eventmachine", "~>1.0"
17
+ s.add_dependency "when", "~>0"
17
18
  s.add_dependency "em_pessimistic", "~>0.1"
18
19
  s.add_dependency "em_rugged", "~> 0.1.2"
19
20
  s.add_dependency "tzinfo", "~> 0.3"
@@ -64,6 +64,31 @@ describe Dolt::Git::Repository do
64
64
  end
65
65
  end
66
66
 
67
+ describe "#tree_entry" do
68
+ it "includes submodule data for trees" do
69
+ @repository.tree_entry("3dc532f", "vendor").callback do |tree|
70
+ assert_equal({
71
+ :type => :submodule,
72
+ :filemode => 57344,
73
+ :name => "ui",
74
+ :oid => "d167e3e1c17a27e4cf459dd380670801b0659659",
75
+ :url => "git://gitorious.org/gitorious/ui3.git"
76
+ }, tree.entries.first)
77
+ done!
78
+ end
79
+ wait!
80
+ end
81
+
82
+ it "yields blob" do
83
+ @repository.tree_entry("3dc532f", "Gemfile").callback do |blob|
84
+ assert blob.is_a?(Rugged::Blob)
85
+ assert_equal "source \"http://rubygems.org\"\n\ngemspec\n", blob.content
86
+ done!
87
+ end
88
+ wait!
89
+ end
90
+ end
91
+
67
92
  describe "#blame" do
68
93
  it "returns deferrable" do
69
94
  deferrable = @repository.blame("master", "Gemfile")
@@ -17,13 +17,14 @@
17
17
  #++
18
18
  require "test_helper"
19
19
  require "libdolt/repo_actions"
20
- require "libdolt/async/when"
20
+ require "when"
21
21
  require "ostruct"
22
22
 
23
23
  class Repository
24
24
  attr_reader :name
25
25
  def initialize(name); @name = name; end
26
26
  def tree(ref, path); stub; end
27
+ def tree_entry(ref, path); stub; end
27
28
  def rev_parse(rev); stub; end
28
29
  def blame(ref, path); stub; end
29
30
  def log(ref, path, limit); stub; end
@@ -36,7 +37,7 @@ class Repository
36
37
 
37
38
  private
38
39
  def stub
39
- @deferred = When::Deferred.new
40
+ @deferred = When.defer
40
41
  @deferred.promise
41
42
  end
42
43
  end
@@ -52,6 +53,8 @@ class Resolver
52
53
  end
53
54
  end
54
55
 
56
+ class FakeBlob; end
57
+
55
58
  describe Dolt::RepoActions do
56
59
  before do
57
60
  @resolver = Resolver.new
@@ -108,6 +111,41 @@ describe Dolt::RepoActions do
108
111
  end
109
112
  end
110
113
 
114
+ describe "#tree_entry" do
115
+ it "yields tree, repo and ref to block" do
116
+ data = nil
117
+ @actions.tree_entry("gitorious", "babd120", "") { |err, d| data = d }
118
+ repo = @resolver.resolved.last
119
+ repo.resolve_promise "Tree"
120
+
121
+ expected = {
122
+ :tree => "Tree",
123
+ :repository => "gitorious",
124
+ :ref => "babd120",
125
+ :path => "",
126
+ :type => :tree
127
+ }
128
+ assert_equal expected, data
129
+ end
130
+
131
+ it "yields tree, repo and ref to block" do
132
+ data = nil
133
+ @actions.tree_entry("gitorious", "babd120", "Gemfile") { |err, d| data = d }
134
+ repo = @resolver.resolved.last
135
+ blob = FakeBlob.new
136
+ repo.resolve_promise(blob)
137
+
138
+ expected = {
139
+ :blob => blob,
140
+ :repository => "gitorious",
141
+ :ref => "babd120",
142
+ :path => "Gemfile",
143
+ :type => :blob
144
+ }
145
+ assert_equal expected, data
146
+ end
147
+ end
148
+
111
149
  describe "#blame" do
112
150
  it "resolves repository" do
113
151
  @actions.blame("gitorious", "master", "app")
@@ -98,6 +98,7 @@ describe "blob template" do
98
98
  @helpers = [Dolt::View::SingleRepository,
99
99
  Dolt::View::Breadcrumb,
100
100
  Dolt::View::Blob,
101
+ Dolt::View::Urls,
101
102
  Dolt::View::SmartBlobRenderer]
102
103
  end
103
104
 
@@ -21,7 +21,7 @@ require "libdolt/view/blob"
21
21
  require "libdolt/view/binary_blob_embedder"
22
22
 
23
23
  describe Dolt::View::BinaryBlobEmbedder do
24
- include Dolt::View::Blob
24
+ include Dolt::View::Urls
25
25
  include Dolt::View::BinaryBlobEmbedder
26
26
  include Dolt::View::SingleRepository
27
27
 
@@ -17,49 +17,13 @@
17
17
  #++
18
18
  require "test_helper"
19
19
  require "libdolt/view/single_repository"
20
- require "libdolt/view/multi_repository"
21
20
  require "libdolt/view/blob"
21
+ require "libdolt/view/urls"
22
22
 
23
23
  describe Dolt::View::Blob do
24
24
  include Dolt::View::Blob
25
-
26
- describe "single repo mode" do
27
- include Dolt::View::SingleRepository
28
-
29
- it "returns blame url" do
30
- url = blame_url("myrepo", "master", "some/path")
31
- assert_equal "/blame/master:some/path", url
32
- end
33
-
34
- it "returns history url" do
35
- url = history_url("myrepo", "master", "some/path")
36
- assert_equal "/history/master:some/path", url
37
- end
38
-
39
- it "returns raw url" do
40
- url = raw_url("myrepo", "master", "some/path")
41
- assert_equal "/raw/master:some/path", url
42
- end
43
- end
44
-
45
- describe "multi repo mode" do
46
- include Dolt::View::MultiRepository
47
-
48
- it "returns blame url" do
49
- url = blame_url("myrepo", "master", "some/path")
50
- assert_equal "/myrepo/blame/master:some/path", url
51
- end
52
-
53
- it "returns history url" do
54
- url = history_url("myrepo", "master", "some/path")
55
- assert_equal "/myrepo/history/master:some/path", url
56
- end
57
-
58
- it "returns raw url" do
59
- url = raw_url("myrepo", "master", "some/path")
60
- assert_equal "/myrepo/raw/master:some/path", url
61
- end
62
- end
25
+ include Dolt::View::Urls
26
+ include Dolt::View::SingleRepository
63
27
 
64
28
  describe "#multiline" do
65
29
  it "adds line number markup to code" do
@@ -89,8 +53,6 @@ describe Dolt::View::Blob do
89
53
  end
90
54
 
91
55
  describe "#format_binary_blob" do
92
- include Dolt::View::SingleRepository
93
-
94
56
  it "renders link to binary blob" do
95
57
  content = "GIF89aK\000 \000\367\000\000\266\270\274\335\336\337\214"
96
58
  html = format_binary_blob("some/file.gif", content, "gitorious", "master")
@@ -100,8 +62,6 @@ describe Dolt::View::Blob do
100
62
  end
101
63
 
102
64
  describe "#format_blob" do
103
- include Dolt::View::SingleRepository
104
-
105
65
  it "renders link to binary blob" do
106
66
  content = "GIF89aK\000 \000\367\000\000\266\270\274\335\336\337\214"
107
67
  html = format_blob("file.gif", content, "gitorious", "master")
@@ -21,6 +21,7 @@ require "libdolt/view/breadcrumb"
21
21
  describe Dolt::View::Breadcrumb do
22
22
  include Dolt::Html
23
23
  include Dolt::View::SingleRepository
24
+ include Dolt::View::Urls
24
25
  include Dolt::View::Breadcrumb
25
26
 
26
27
  it "renders li element for root" do
@@ -23,44 +23,6 @@ require "libdolt/view/object"
23
23
  describe Dolt::View::Object do
24
24
  include Dolt::View::Object
25
25
 
26
- describe "single repo mode" do
27
- include Dolt::View::SingleRepository
28
-
29
- it "returns blob url" do
30
- object = { :type => "blob", :name => "Gemfile" }
31
- url = object_url("myrepo", "master", "", object)
32
- assert_equal "/blob/master:Gemfile", url
33
- end
34
-
35
- it "returns tree url" do
36
- object = { :type => "tree", :name => "models" }
37
- url = object_url("myrepo", "master", "app", object)
38
- assert_equal "/tree/master:app/models", url
39
- end
40
-
41
- it "returns blob url in directory" do
42
- object = { :type => "blob", :name => "Gemfile" }
43
- url = object_url("myrepo", "master", "lib/mything", object)
44
- assert_equal "/blob/master:lib/mything/Gemfile", url
45
- end
46
- end
47
-
48
- describe "multi repo mode" do
49
- include Dolt::View::MultiRepository
50
-
51
- it "returns blob url" do
52
- object = { :type => "blob", :name => "Gemfile" }
53
- url = object_url("myrepo", "master", "", object)
54
- assert_equal "/myrepo/blob/master:Gemfile", url
55
- end
56
-
57
- it "returns blob url in directory" do
58
- object = { :type => "blob", :name => "Gemfile" }
59
- url = object_url("myrepo", "master", "lib/mything", object)
60
- assert_equal "/myrepo/blob/master:lib/mything/Gemfile", url
61
- end
62
- end
63
-
64
26
  describe "#object_icon_class" do
65
27
  it "returns blob icon type" do
66
28
  assert_equal "icon-file", object_icon_class({ :type => :blob })
@@ -74,10 +36,4 @@ describe Dolt::View::Object do
74
36
  assert_equal "icon-hdd", object_icon_class({ :type => :submodule })
75
37
  end
76
38
  end
77
-
78
- it "links submodule object to submodule" do
79
- url = "git://gitorious.org/gitorious/ui3.git"
80
- object = { :type => :submodule, :url => url }
81
- assert_equal url, object_url("gitorious", "master", "vendor", object)
82
- end
83
39
  end
@@ -17,17 +17,21 @@
17
17
  #++
18
18
  require "test_helper"
19
19
  require "libdolt/view/single_repository"
20
+ require "libdolt/view/multi_repository"
20
21
  require "libdolt/view/object"
21
22
  require "libdolt/view/tree"
23
+ require "libdolt/view/urls"
22
24
  require "ostruct"
23
25
 
24
26
  describe Dolt::View::Tree do
25
27
  include Dolt::Html
26
- include Dolt::View::SingleRepository
27
28
  include Dolt::View::Object
28
29
  include Dolt::View::Tree
30
+ include Dolt::View::Urls
29
31
 
30
32
  describe "#tree_entries" do
33
+ include Dolt::View::SingleRepository
34
+
31
35
  before do
32
36
  async = { :name => "async", :type => :tree }
33
37
  disk_repo_resolver = { :type => :blob, :name => "disk_repo_resolver.rb" }
@@ -132,6 +136,8 @@ describe Dolt::View::Tree do
132
136
  end
133
137
 
134
138
  describe "#tree_context" do
139
+ include Dolt::View::SingleRepository
140
+
135
141
  def context(path, maxdepth = nil)
136
142
  tree_context("gitorious", "master", accumulate_path(partition_path(path, maxdepth)))
137
143
  end
@@ -193,4 +199,48 @@ describe Dolt::View::Tree do
193
199
  assert_equal "<a href=\"/tree/master:src/phorkie/Database\">/ Database</a>", links[3]
194
200
  end
195
201
  end
202
+
203
+ describe "single repo mode" do
204
+ include Dolt::View::SingleRepository
205
+
206
+ it "returns blob url" do
207
+ object = { :type => "blob", :name => "Gemfile" }
208
+ url = object_url("myrepo", "master", "", object)
209
+ assert_equal "/blob/master:Gemfile", url
210
+ end
211
+
212
+ it "returns tree url" do
213
+ object = { :type => "tree", :name => "models" }
214
+ url = object_url("myrepo", "master", "app", object)
215
+ assert_equal "/tree/master:app/models", url
216
+ end
217
+
218
+ it "returns blob url in directory" do
219
+ object = { :type => "blob", :name => "Gemfile" }
220
+ url = object_url("myrepo", "master", "lib/mything", object)
221
+ assert_equal "/blob/master:lib/mything/Gemfile", url
222
+ end
223
+ end
224
+
225
+ describe "multi repo mode" do
226
+ include Dolt::View::MultiRepository
227
+
228
+ it "returns blob url" do
229
+ object = { :type => "blob", :name => "Gemfile" }
230
+ url = object_url("myrepo", "master", "", object)
231
+ assert_equal "/myrepo/blob/master:Gemfile", url
232
+ end
233
+
234
+ it "returns blob url in directory" do
235
+ object = { :type => "blob", :name => "Gemfile" }
236
+ url = object_url("myrepo", "master", "lib/mything", object)
237
+ assert_equal "/myrepo/blob/master:lib/mything/Gemfile", url
238
+ end
239
+ end
240
+
241
+ it "links submodule object to submodule" do
242
+ url = "git://gitorious.org/gitorious/ui3.git"
243
+ object = { :type => :submodule, :url => url }
244
+ assert_equal url, object_url("gitorious", "master", "vendor", object)
245
+ end
196
246
  end
@@ -0,0 +1,63 @@
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 "test_helper"
19
+ require "libdolt/view/single_repository"
20
+ require "libdolt/view/multi_repository"
21
+ require "libdolt/view/urls"
22
+
23
+ describe Dolt::View::Urls do
24
+ include Dolt::View::Urls
25
+
26
+ describe "single repo mode" do
27
+ include Dolt::View::SingleRepository
28
+
29
+ it "returns blame url" do
30
+ url = blame_url("myrepo", "master", "some/path")
31
+ assert_equal "/blame/master:some/path", url
32
+ end
33
+
34
+ it "returns history url" do
35
+ url = history_url("myrepo", "master", "some/path")
36
+ assert_equal "/history/master:some/path", url
37
+ end
38
+
39
+ it "returns raw url" do
40
+ url = raw_url("myrepo", "master", "some/path")
41
+ assert_equal "/raw/master:some/path", url
42
+ end
43
+ end
44
+
45
+ describe "multi repo mode" do
46
+ include Dolt::View::MultiRepository
47
+
48
+ it "returns blame url" do
49
+ url = blame_url("myrepo", "master", "some/path")
50
+ assert_equal "/myrepo/blame/master:some/path", url
51
+ end
52
+
53
+ it "returns history url" do
54
+ url = history_url("myrepo", "master", "some/path")
55
+ assert_equal "/myrepo/history/master:some/path", url
56
+ end
57
+
58
+ it "returns raw url" do
59
+ url = raw_url("myrepo", "master", "some/path")
60
+ assert_equal "/myrepo/raw/master:some/path", url
61
+ end
62
+ end
63
+ end
data/test/test_helper.rb CHANGED
@@ -36,6 +36,7 @@ module Dolt
36
36
  root = File.join(File.dirname(__FILE__), "..", "views")
37
37
  renderer = Tiltout.new(root, options)
38
38
  renderer.helper(helpers || [Dolt::View::MultiRepository,
39
+ Dolt::View::Urls,
39
40
  Dolt::View::Object,
40
41
  Dolt::View::Blob,
41
42
  Dolt::View::Tree,
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libdolt
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 0
10
- version: 0.6.0
9
+ - 2
10
+ version: 0.6.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Christian Johansen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-10-05 00:00:00 +02:00
18
+ date: 2012-10-10 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -34,9 +34,23 @@ dependencies:
34
34
  type: :runtime
35
35
  version_requirements: *id001
36
36
  - !ruby/object:Gem::Dependency
37
- name: em_pessimistic
37
+ name: when
38
38
  prerelease: false
39
39
  requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: em_pessimistic
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
40
54
  none: false
41
55
  requirements:
42
56
  - - ~>
@@ -47,11 +61,11 @@ dependencies:
47
61
  - 1
48
62
  version: "0.1"
49
63
  type: :runtime
50
- version_requirements: *id002
64
+ version_requirements: *id003
51
65
  - !ruby/object:Gem::Dependency
52
66
  name: em_rugged
53
67
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
68
+ requirement: &id004 !ruby/object:Gem::Requirement
55
69
  none: false
56
70
  requirements:
57
71
  - - ~>
@@ -63,11 +77,11 @@ dependencies:
63
77
  - 2
64
78
  version: 0.1.2
65
79
  type: :runtime
66
- version_requirements: *id003
80
+ version_requirements: *id004
67
81
  - !ruby/object:Gem::Dependency
68
82
  name: tzinfo
69
83
  prerelease: false
70
- requirement: &id004 !ruby/object:Gem::Requirement
84
+ requirement: &id005 !ruby/object:Gem::Requirement
71
85
  none: false
72
86
  requirements:
73
87
  - - ~>
@@ -78,11 +92,11 @@ dependencies:
78
92
  - 3
79
93
  version: "0.3"
80
94
  type: :runtime
81
- version_requirements: *id004
95
+ version_requirements: *id005
82
96
  - !ruby/object:Gem::Dependency
83
97
  name: makeup
84
98
  prerelease: false
85
- requirement: &id005 !ruby/object:Gem::Requirement
99
+ requirement: &id006 !ruby/object:Gem::Requirement
86
100
  none: false
87
101
  requirements:
88
102
  - - ~>
@@ -92,11 +106,11 @@ dependencies:
92
106
  - 0
93
107
  version: "0"
94
108
  type: :runtime
95
- version_requirements: *id005
109
+ version_requirements: *id006
96
110
  - !ruby/object:Gem::Dependency
97
111
  name: htmlentities
98
112
  prerelease: false
99
- requirement: &id006 !ruby/object:Gem::Requirement
113
+ requirement: &id007 !ruby/object:Gem::Requirement
100
114
  none: false
101
115
  requirements:
102
116
  - - ~>
@@ -107,11 +121,11 @@ dependencies:
107
121
  - 3
108
122
  version: "4.3"
109
123
  type: :runtime
110
- version_requirements: *id006
124
+ version_requirements: *id007
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: json
113
127
  prerelease: false
114
- requirement: &id007 !ruby/object:Gem::Requirement
128
+ requirement: &id008 !ruby/object:Gem::Requirement
115
129
  none: false
116
130
  requirements:
117
131
  - - ~>
@@ -122,11 +136,11 @@ dependencies:
122
136
  - 7
123
137
  version: "1.7"
124
138
  type: :runtime
125
- version_requirements: *id007
139
+ version_requirements: *id008
126
140
  - !ruby/object:Gem::Dependency
127
141
  name: mime-types
128
142
  prerelease: false
129
- requirement: &id008 !ruby/object:Gem::Requirement
143
+ requirement: &id009 !ruby/object:Gem::Requirement
130
144
  none: false
131
145
  requirements:
132
146
  - - ~>
@@ -137,11 +151,11 @@ dependencies:
137
151
  - 19
138
152
  version: "1.19"
139
153
  type: :runtime
140
- version_requirements: *id008
154
+ version_requirements: *id009
141
155
  - !ruby/object:Gem::Dependency
142
156
  name: minitest
143
157
  prerelease: false
144
- requirement: &id009 !ruby/object:Gem::Requirement
158
+ requirement: &id010 !ruby/object:Gem::Requirement
145
159
  none: false
146
160
  requirements:
147
161
  - - ~>
@@ -152,11 +166,11 @@ dependencies:
152
166
  - 0
153
167
  version: "2.0"
154
168
  type: :development
155
- version_requirements: *id009
169
+ version_requirements: *id010
156
170
  - !ruby/object:Gem::Dependency
157
171
  name: em-minitest-spec
158
172
  prerelease: false
159
- requirement: &id010 !ruby/object:Gem::Requirement
173
+ requirement: &id011 !ruby/object:Gem::Requirement
160
174
  none: false
161
175
  requirements:
162
176
  - - ~>
@@ -167,11 +181,11 @@ dependencies:
167
181
  - 1
168
182
  version: "1.1"
169
183
  type: :development
170
- version_requirements: *id010
184
+ version_requirements: *id011
171
185
  - !ruby/object:Gem::Dependency
172
186
  name: rake
173
187
  prerelease: false
174
- requirement: &id011 !ruby/object:Gem::Requirement
188
+ requirement: &id012 !ruby/object:Gem::Requirement
175
189
  none: false
176
190
  requirements:
177
191
  - - ~>
@@ -182,11 +196,11 @@ dependencies:
182
196
  - 9
183
197
  version: "0.9"
184
198
  type: :development
185
- version_requirements: *id011
199
+ version_requirements: *id012
186
200
  - !ruby/object:Gem::Dependency
187
201
  name: redcarpet
188
202
  prerelease: false
189
- requirement: &id012 !ruby/object:Gem::Requirement
203
+ requirement: &id013 !ruby/object:Gem::Requirement
190
204
  none: false
191
205
  requirements:
192
206
  - - ">="
@@ -196,11 +210,11 @@ dependencies:
196
210
  - 0
197
211
  version: "0"
198
212
  type: :development
199
- version_requirements: *id012
213
+ version_requirements: *id013
200
214
  - !ruby/object:Gem::Dependency
201
215
  name: tiltout
202
216
  prerelease: false
203
- requirement: &id013 !ruby/object:Gem::Requirement
217
+ requirement: &id014 !ruby/object:Gem::Requirement
204
218
  none: false
205
219
  requirements:
206
220
  - - ~>
@@ -210,7 +224,7 @@ dependencies:
210
224
  - 1
211
225
  version: "1"
212
226
  type: :development
213
- version_requirements: *id013
227
+ version_requirements: *id014
214
228
  description: Dolt API for serving git trees and syntax highlighted blobs
215
229
  email:
216
230
  - christian@gitorious.org
@@ -226,13 +240,13 @@ files:
226
240
  - Rakefile
227
241
  - Readme.md
228
242
  - lib/libdolt.rb
229
- - lib/libdolt/async/when.rb
230
243
  - lib/libdolt/disk_repo_resolver.rb
231
244
  - lib/libdolt/git/blame.rb
232
245
  - lib/libdolt/git/commit.rb
233
246
  - lib/libdolt/git/repository.rb
234
247
  - lib/libdolt/git/submodule.rb
235
248
  - lib/libdolt/git/tree.rb
249
+ - lib/libdolt/gitorious_repo_resolver.rb
236
250
  - lib/libdolt/repo_actions.rb
237
251
  - lib/libdolt/version.rb
238
252
  - lib/libdolt/view.rb
@@ -250,8 +264,8 @@ files:
250
264
  - lib/libdolt/view/syntax_highlight.rb
251
265
  - lib/libdolt/view/tab_width.rb
252
266
  - lib/libdolt/view/tree.rb
267
+ - lib/libdolt/view/urls.rb
253
268
  - libdolt.gemspec
254
- - test/libdolt/async/when_test.rb
255
269
  - test/libdolt/git/blame_test.rb
256
270
  - test/libdolt/git/commit_test.rb
257
271
  - test/libdolt/git/repository_test.rb
@@ -277,6 +291,7 @@ files:
277
291
  - test/libdolt/view/syntax_highlight_test.rb
278
292
  - test/libdolt/view/tab_width_test.rb
279
293
  - test/libdolt/view/tree_test.rb
294
+ - test/libdolt/view/urls_test.rb
280
295
  - test/test_helper.rb
281
296
  - views/500.erb
282
297
  - views/blame.erb
@@ -1,128 +0,0 @@
1
- require "eventmachine"
2
-
3
- module When
4
- class Promise
5
- def initialize(deferred = EM::DefaultDeferrable.new)
6
- @deferred = deferred
7
- end
8
-
9
- def callback(&block)
10
- @deferred.callback(&block)
11
- self
12
- end
13
-
14
- def errback(&block)
15
- @deferred.errback(&block)
16
- self
17
- end
18
- end
19
-
20
- class Resolver
21
- def initialize(deferred = EM::DefaultDeferrable.new)
22
- @deferred = deferred
23
- @resolved = false
24
- end
25
-
26
- def resolve(*args)
27
- mark_resolved
28
- @deferred.succeed(*args)
29
- end
30
-
31
- def reject(*args)
32
- mark_resolved
33
- @deferred.fail(*args)
34
- end
35
-
36
- def resolved?
37
- @resolved
38
- end
39
-
40
- private
41
- def mark_resolved
42
- raise StandardError.new("Already resolved") if @resolved
43
- @resolved = true
44
- end
45
- end
46
-
47
- class Deferred
48
- attr_reader :resolver, :promise
49
-
50
- def initialize
51
- deferred = EM::DefaultDeferrable.new
52
- @resolver = Resolver.new(deferred)
53
- @promise = Promise.new(deferred)
54
- end
55
-
56
- def resolve(*args)
57
- @resolver.resolve(*args)
58
- end
59
-
60
- def reject(*args)
61
- @resolver.reject(*args)
62
- end
63
-
64
- def callback(&block)
65
- @promise.callback(&block)
66
- end
67
-
68
- def errback(&block)
69
- @promise.errback(&block)
70
- end
71
-
72
- def resolved?
73
- @resolver.resolved?
74
- end
75
-
76
- def self.resolved(value)
77
- d = self.new
78
- d.resolve(value)
79
- d
80
- end
81
-
82
- def self.rejected(value)
83
- d = self.new
84
- d.reject(value)
85
- d
86
- end
87
- end
88
-
89
- def self.deferred(val)
90
- return val if val.respond_to?(:callback) && val.respond_to?(:errback)
91
- Deferred.resolved(val).promise
92
- end
93
-
94
- def self.all(promises)
95
- raise(ArgumentError, "expected enumerable promises") if !promises.is_a?(Enumerable)
96
- resolved = 0
97
- results = []
98
- d = Deferred.new
99
-
100
- attempt_resolution = lambda do |err, res|
101
- break if d.resolved?
102
- if err.nil?
103
- d.resolve(res) if promises.length == resolved
104
- else
105
- d.reject(err)
106
- end
107
- end
108
-
109
- wait_for_all(promises) do |err, result, index|
110
- resolved += 1
111
- results[index] = result
112
- attempt_resolution.call(err, results)
113
- end
114
-
115
- attempt_resolution.call(nil, results) if promises.length == 0
116
- d.promise
117
- end
118
-
119
- private
120
- def self.wait_for_all(promises, &block)
121
- promises.each_with_index do |p, i|
122
- p.callback do |result|
123
- block.call(nil, result, i)
124
- end
125
- p.errback { |e| block.call(e, nil, i) }
126
- end
127
- end
128
- end
@@ -1,112 +0,0 @@
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 "test_helper"
19
- require "libdolt/async/when"
20
-
21
- describe When do
22
- include EM::MiniTest::Spec
23
-
24
- describe ".all" do
25
- it "returns deferrable" do
26
- d = When.all([When.deferred(42)])
27
- assert d.respond_to?(:callback)
28
- assert d.respond_to?(:errback)
29
- end
30
-
31
- it "resolves immediately if no promises" do
32
- d = When.all([])
33
- d.callback do |results|
34
- assert_equal [], results
35
- done!
36
- end
37
- wait!
38
- end
39
-
40
- it "resolves when single deferrable resolves" do
41
- deferred = When::Deferred.new
42
- d = When.all([deferred.promise])
43
- resolved = false
44
- d.callback { |results| resolved = true }
45
-
46
- assert !resolved
47
- deferred.resolve(42)
48
- assert resolved
49
- end
50
-
51
- it "resolves when all deferrables are resolved" do
52
- deferreds = [When::Deferred.new, When::Deferred.new, When::Deferred.new]
53
- d = When.all(deferreds.map(&:promise))
54
- resolved = false
55
- d.callback { |results| resolved = true }
56
-
57
- assert !resolved
58
- deferreds[0].resolve(42)
59
- assert !resolved
60
- deferreds[1].resolve(13)
61
- assert !resolved
62
- deferreds[2].resolve(3)
63
- assert resolved
64
- end
65
-
66
- it "rejects when single deferrable rejects" do
67
- deferred = When::Deferred.new
68
- d = When.all([deferred.promise])
69
- rejected = false
70
- d.errback { |results| rejected = true }
71
-
72
- assert !rejected
73
- deferred.reject(StandardError.new)
74
- assert rejected
75
- end
76
-
77
- it "rejects on first rejection" do
78
- deferreds = [When::Deferred.new, When::Deferred.new, When::Deferred.new]
79
- d = When.all(deferreds.map(&:promise))
80
- rejected = false
81
- d.errback { |results| rejected = true }
82
-
83
- deferreds[0].resolve(42)
84
- deferreds[2].reject(StandardError.new)
85
- deferreds[1].resolve(13)
86
-
87
- assert rejected
88
- end
89
-
90
- it "proxies resolution vaule in array" do
91
- deferred = When::Deferred.new
92
- d = When.all([deferred.promise])
93
- results = nil
94
- d.callback { |res| results = res }
95
-
96
- deferred.resolve(42)
97
- assert_equal [42], results
98
- end
99
-
100
- it "orders results like input" do
101
- deferred1 = When::Deferred.new
102
- deferred2 = When::Deferred.new
103
- d = When.all([deferred1.promise, deferred2.promise])
104
- results = nil
105
- d.callback { |res| results = res }
106
-
107
- deferred2.resolve(42)
108
- deferred1.resolve(13)
109
- assert_equal [13, 42], results
110
- end
111
- end
112
- end