libdolt 0.31.0 → 0.32.0

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.31.0)
4
+ libdolt (0.32.0)
5
5
  htmlentities (~> 4.3)
6
6
  json (~> 1.7)
7
7
  makeup (~> 0.4)
@@ -17,5 +17,5 @@
17
17
  #++
18
18
 
19
19
  module Dolt
20
- VERSION = "0.31.0"
20
+ VERSION = "0.32.0"
21
21
  end
@@ -0,0 +1,140 @@
1
+ # encoding: utf-8
2
+ #--
3
+ # Copyright (C) 2013 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 SubmoduleUrl
22
+ def self.for(submodule)
23
+ url = submodule[:url]
24
+ commit = submodule[:oid]
25
+
26
+ parsers.map { |p| p.browse_url(url, commit) }.compact.first
27
+ end
28
+
29
+ def self.parsers
30
+ @parsers ||= [GitoriousOrg.new, GitHub.new, BitBucket.new, GenericParser.new]
31
+ end
32
+
33
+ def self.parsers=(value)
34
+ @parsers = value
35
+ end
36
+
37
+ module Parser
38
+ def browse_url(url, commit)
39
+ mountpoints.each do |mountpoint|
40
+ path = parse_mountpoint(mountpoint, url)
41
+ return generate_url(*path, commit) if path
42
+ end
43
+ return nil
44
+ end
45
+
46
+ private
47
+
48
+ def parse_mountpoint(mountpoint, url)
49
+ base_url = mountpoint.base_url
50
+ return nil unless url.include?(base_url)
51
+ parts = url.gsub(base_url, '').gsub(/\.git$/, '').split("/")
52
+ return parts[-2..-1]
53
+ end
54
+ end
55
+
56
+ class HttpMountPoint
57
+ attr_reader :host, :protocol
58
+
59
+ def initialize(host, protocol = 'http')
60
+ @host = host
61
+ @protocol = protocol
62
+ end
63
+
64
+ def base_url
65
+ "#{protocol}://#{host}/"
66
+ end
67
+ end
68
+
69
+ class GitMountPoint
70
+ attr_reader :host
71
+
72
+ def initialize(host)
73
+ @host = host
74
+ end
75
+
76
+ def base_url
77
+ "git://#{host}/"
78
+ end
79
+ end
80
+
81
+ class GitSshMountPoint
82
+ attr_reader :user, :host
83
+
84
+ def initialize(user, host)
85
+ @user = user
86
+ @host = host
87
+ end
88
+
89
+ def base_url
90
+ "#{user}@#{host}:"
91
+ end
92
+ end
93
+
94
+ class BitBucket
95
+ include Parser
96
+
97
+ def mountpoints
98
+ [HttpMountPoint.new("bitbucket.org", "https"), GitSshMountPoint.new("git", "bitbucket.org")]
99
+ end
100
+
101
+ def generate_url(project, repository, commit)
102
+ "https://bitbucket.org/#{project}/#{repository}/src/#{commit}"
103
+ end
104
+ end
105
+
106
+ class GitHub
107
+ include Parser
108
+
109
+ def mountpoints
110
+ [GitMountPoint.new("github.com"), HttpMountPoint.new("github.com", "https"), GitSshMountPoint.new("git", "github.com")]
111
+ end
112
+
113
+ def generate_url(project, repository, commit)
114
+ "https://github.com/#{project}/#{repository}/tree/#{commit}"
115
+ end
116
+ end
117
+
118
+ class GitoriousOrg
119
+ include Parser
120
+
121
+ def mountpoints
122
+ [GitMountPoint.new("gitorious.org"),
123
+ HttpMountPoint.new("git.gitorious.org", "http"),
124
+ HttpMountPoint.new("git.gitorious.org", "https"),
125
+ GitSshMountPoint.new("git", "gitorious.org")]
126
+ end
127
+
128
+ def generate_url(project, repository, commit)
129
+ "https://gitorious.org/#{project}/#{repository}/source/#{commit}"
130
+ end
131
+ end
132
+
133
+ class GenericParser
134
+ def browse_url(url, commit)
135
+ url
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -20,11 +20,11 @@ module Dolt
20
20
  module View
21
21
  module Tree
22
22
  def object_path(root, object)
23
+ return object if object[:type] == :submodule
23
24
  File.join(root, object[:name]).sub(/^\//, "")
24
25
  end
25
26
 
26
27
  def object_url(repository, ref, path, object)
27
- return object[:url] if object[:type] == :submodule
28
28
  send(:"#{object[:type]}_url", repository, ref, object_path(path, object))
29
29
  end
30
30
 
@@ -19,6 +19,10 @@
19
19
  module Dolt
20
20
  module View
21
21
  module Urls
22
+ def submodule_url(repository, ref, object)
23
+ SubmoduleUrl.for(object)
24
+ end
25
+
22
26
  def tree_url(repository, ref, path = "")
23
27
  repo_url(repository, "/tree/#{ref}:#{path}")
24
28
  end
@@ -0,0 +1,102 @@
1
+ # encoding: utf-8
2
+ #--
3
+ # Copyright (C) 2013 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
+ class SubmoduleUrlTest < MiniTest::Spec
22
+ describe SubmoduleUrl do
23
+ it "recognizes urls from gitorious.org" do
24
+ submodule = { :url => "http://git.gitorious.org/bar/baz.git", :oid => "sha123" }
25
+
26
+ assert_equal "https://gitorious.org/bar/baz/source/sha123", SubmoduleUrl.for(submodule)
27
+ end
28
+
29
+ it "recognizes urls from bitbucket.org" do
30
+ submodule = { :url => "https://bitbucket.org/bar/baz.git", :oid => "sha123" }
31
+
32
+ assert_equal "https://bitbucket.org/bar/baz/src/sha123", SubmoduleUrl.for(submodule)
33
+ end
34
+
35
+ it "recognizes urls from github.com" do
36
+ submodule = { :url => "git://github.com/bar/baz.git", :oid => "sha123" }
37
+
38
+ assert_equal "https://github.com/bar/baz/tree/sha123", SubmoduleUrl.for(submodule)
39
+ end
40
+
41
+ it "returns other urls unchanged" do
42
+ submodule = { :url => "git://foobar.com/bar/baz.git", :oid => "sha123" }
43
+
44
+ assert_equal "git://foobar.com/bar/baz.git", SubmoduleUrl.for(submodule)
45
+ end
46
+ end
47
+
48
+ describe SubmoduleUrl::GitoriousOrg do
49
+ let(:parser) { SubmoduleUrl::GitoriousOrg.new }
50
+ let(:expected_url) { "https://gitorious.org/foo/bar/source/sha123" }
51
+
52
+ describe "ssh urls" do
53
+ it "returns nil for other users" do
54
+ assert_nil parser.browse_url("foo@gitorious.org:foo/bar.git", "sha123")
55
+ end
56
+
57
+ it "returns nil for other domains" do
58
+ assert_nil parser.browse_url("git@github.com:foo/bar.git", "sha123")
59
+ end
60
+
61
+ it "returns repository url for matching protocol and domain" do
62
+ assert_equal expected_url, parser.browse_url("git@gitorious.org:foo/bar.git", "sha123")
63
+ end
64
+ end
65
+
66
+ describe "https urls" do
67
+ it "returns nil for other domains" do
68
+ assert_nil parser.browse_url("http://git.github.com/foo/bar.git", "sha123")
69
+ end
70
+
71
+ it "returns repository url for matching protocol and domain" do
72
+ assert_equal expected_url, parser.browse_url("http://git.gitorious.org/foo/bar.git", "sha123")
73
+ end
74
+ end
75
+
76
+ describe "git urls" do
77
+ it "returns nil for other domains" do
78
+ assert_nil parser.browse_url("git://github.com/foo/bar.git", "sha123")
79
+ end
80
+
81
+ it "returns repository url for matching protocol and domain" do
82
+ assert_equal expected_url, parser.browse_url("git://gitorious.org/foo/bar.git", "sha123")
83
+ end
84
+ end
85
+
86
+ describe "legacy urls" do
87
+ it "returns repository url for legacy git url" do
88
+ assert_equal expected_url, parser.browse_url("git://gitorious.org/~baz/foo/bar.git", "sha123")
89
+ end
90
+
91
+ it "returns repository url for legacy http url" do
92
+ assert_equal expected_url, parser.browse_url("http://git.gitorious.org/~baz/foo/bar.git", "sha123")
93
+ end
94
+
95
+ it "returns repository url for legacy ssh url" do
96
+ assert_equal expected_url, parser.browse_url("git@gitorious.org:+baz/foo/bar.git", "sha123")
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -238,9 +238,41 @@ describe Dolt::View::Tree do
238
238
  end
239
239
  end
240
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)
241
+ describe "submodule url" do
242
+ def generated_url(url)
243
+ object = { :type => :submodule, :url => url, :oid => "sha123" }
244
+ object_url("gitorious", "master", "vendor", object)
245
+ end
246
+
247
+ it "links submodules with unknown hosting to original url" do
248
+ url = "git://example.com/gitorious/ui3.git"
249
+ assert_equal url, generated_url(url)
250
+ end
251
+
252
+ it "links submodules hosted on github.com to the correct commit on github.com" do
253
+ correct_url = "https://github.com/gitorious/ui3/tree/sha123"
254
+
255
+ assert_equal correct_url, generated_url("git@github.com:gitorious/ui3.git")
256
+ assert_equal correct_url, generated_url("git://github.com/gitorious/ui3.git")
257
+ assert_equal correct_url, generated_url("https://github.com/gitorious/ui3.git")
258
+ end
259
+
260
+ it "links submodules hosted on gitorious.org to the correct commit on gitorious.org" do
261
+ correct_url = "https://gitorious.org/gitorious/ui3/source/sha123"
262
+
263
+ assert_equal correct_url, generated_url("git@gitorious.org:gitorious/ui3.git")
264
+ assert_equal correct_url, generated_url("git://gitorious.org/gitorious/ui3.git")
265
+ assert_equal correct_url, generated_url("http://git.gitorious.org/gitorious/ui3.git")
266
+ assert_equal correct_url, generated_url("https://git.gitorious.org/gitorious/ui3.git")
267
+ assert_equal correct_url, generated_url("http://git.gitorious.org/~foo/gitorious/ui3.git")
268
+ assert_equal correct_url, generated_url("http://git.gitorious.org/+bar/gitorious/ui3.git")
269
+ end
270
+
271
+ it "links submodules hosted on bitbucket.org to the correct commit on bitbucket.org" do
272
+ correct_url = "https://bitbucket.org/gitorious/ui3/src/sha123"
273
+
274
+ assert_equal correct_url, generated_url("git@bitbucket.org:gitorious/ui3.git")
275
+ assert_equal correct_url, generated_url("https://bitbucket.org/gitorious/ui3.git")
276
+ end
245
277
  end
246
278
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libdolt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.31.0
4
+ version: 0.32.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-22 00:00:00.000000000 Z
12
+ date: 2013-09-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rugged
@@ -225,6 +225,7 @@ files:
225
225
  - lib/libdolt/view/object.rb
226
226
  - lib/libdolt/view/single_repository.rb
227
227
  - lib/libdolt/view/smart_blob_renderer.rb
228
+ - lib/libdolt/view/submodule_url.rb
228
229
  - lib/libdolt/view/syntax_highlight.rb
229
230
  - lib/libdolt/view/tab_width.rb
230
231
  - lib/libdolt/view/tree.rb
@@ -299,6 +300,7 @@ files:
299
300
  - test/libdolt/view/object_test.rb
300
301
  - test/libdolt/view/single_repository_test.rb
301
302
  - test/libdolt/view/smart_blob_renderer_test.rb
303
+ - test/libdolt/view/submodule_url_test.rb
302
304
  - test/libdolt/view/syntax_highlight_test.rb
303
305
  - test/libdolt/view/tab_width_test.rb
304
306
  - test/libdolt/view/tree_test.rb