libdolt 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/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