buildr-resolver 0.3.4 → 0.3.5
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 +2 -3
- data/Rakefile +2 -4
- data/VERSION +1 -1
- data/buildr-resolver.gemspec +15 -12
- data/lib/buildr/override/core/transports.rb +103 -0
- data/lib/buildr/override/packaging/artifact.rb +175 -0
- data/lib/buildr/packaging/repository_array.rb +108 -0
- data/lib/buildr/resolver.rb +12 -16
- data/spec/repository_array_spec.rb +107 -0
- data/spec/resolver_spec.rb +33 -8
- metadata +105 -83
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -9,11 +9,9 @@ rescue Bundler::BundlerError => e
|
|
9
9
|
end
|
10
10
|
require 'rake'
|
11
11
|
|
12
|
-
require '
|
12
|
+
require 'rspec/core/rake_task'
|
13
13
|
|
14
|
-
|
15
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
16
|
-
end
|
14
|
+
RSpec::Core::RakeTask.new(:spec)
|
17
15
|
|
18
16
|
task :test => :spec
|
19
17
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.5
|
data/buildr-resolver.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{buildr-resolver}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Michael Guymon"]
|
12
|
-
s.date = %q{2011-03-
|
12
|
+
s.date = %q{2011-03-30}
|
13
13
|
s.description = %q{Java dependency resolver for Buildr using Maven's Aether}
|
14
14
|
s.email = %q{michael.guymon@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -23,40 +23,43 @@ Gem::Specification.new do |s|
|
|
23
23
|
"Rakefile",
|
24
24
|
"VERSION",
|
25
25
|
"buildr-resolver.gemspec",
|
26
|
+
"lib/buildr/override/core/transports.rb",
|
27
|
+
"lib/buildr/override/packaging/artifact.rb",
|
28
|
+
"lib/buildr/packaging/repository_array.rb",
|
26
29
|
"lib/buildr/resolver.rb",
|
27
30
|
"lib/buildr/resolver/java.rb",
|
31
|
+
"spec/repository_array_spec.rb",
|
28
32
|
"spec/resolver_spec.rb"
|
29
33
|
]
|
30
34
|
s.homepage = %q{http://github.com/mguymon/buildr-resolver}
|
31
35
|
s.licenses = ["Apache"]
|
32
36
|
s.require_paths = ["lib"]
|
33
37
|
s.rubyforge_project = %q{buildr-resolver}
|
34
|
-
s.rubygems_version = %q{1.
|
38
|
+
s.rubygems_version = %q{1.3.7}
|
35
39
|
s.summary = %q{Java dependency resolver for Buildr using Maven's Aether}
|
36
40
|
s.test_files = [
|
41
|
+
"spec/repository_array_spec.rb",
|
37
42
|
"spec/resolver_spec.rb"
|
38
43
|
]
|
39
44
|
|
40
45
|
if s.respond_to? :specification_version then
|
46
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
41
47
|
s.specification_version = 3
|
42
48
|
|
43
49
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
-
s.add_runtime_dependency(%q<naether>, ["= 0.3.
|
45
|
-
s.add_runtime_dependency(%q<buildr>, ["
|
46
|
-
s.add_development_dependency(%q<rspec>, ["~> 1.3.1"])
|
50
|
+
s.add_runtime_dependency(%q<naether>, ["= 0.3.4"])
|
51
|
+
s.add_runtime_dependency(%q<buildr>, ["= 1.4.5"])
|
47
52
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
48
53
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
49
54
|
else
|
50
|
-
s.add_dependency(%q<naether>, ["= 0.3.
|
51
|
-
s.add_dependency(%q<buildr>, ["
|
52
|
-
s.add_dependency(%q<rspec>, ["~> 1.3.1"])
|
55
|
+
s.add_dependency(%q<naether>, ["= 0.3.4"])
|
56
|
+
s.add_dependency(%q<buildr>, ["= 1.4.5"])
|
53
57
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
54
58
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
55
59
|
end
|
56
60
|
else
|
57
|
-
s.add_dependency(%q<naether>, ["= 0.3.
|
58
|
-
s.add_dependency(%q<buildr>, ["
|
59
|
-
s.add_dependency(%q<rspec>, ["~> 1.3.1"])
|
61
|
+
s.add_dependency(%q<naether>, ["= 0.3.4"])
|
62
|
+
s.add_dependency(%q<buildr>, ["= 1.4.5"])
|
60
63
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
61
64
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
62
65
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'buildr'
|
2
|
+
|
3
|
+
module URI
|
4
|
+
class HTTP #:nodoc:
|
5
|
+
|
6
|
+
def read(options = nil, &block)
|
7
|
+
options ||= {}
|
8
|
+
|
9
|
+
user = self.user || options[:username]
|
10
|
+
password = self.password || options[:password]
|
11
|
+
|
12
|
+
connect do |http|
|
13
|
+
trace "Requesting #{self}"
|
14
|
+
headers = { 'If-Modified-Since' => CGI.rfc1123_date(options[:modified].utc) } if options[:modified]
|
15
|
+
request = Net::HTTP::Get.new(request_uri.empty? ? '/' : request_uri, headers)
|
16
|
+
request.basic_auth user, password if user
|
17
|
+
|
18
|
+
http.request request do |response|
|
19
|
+
case response
|
20
|
+
when Net::HTTPNotModified
|
21
|
+
# No modification, nothing to do.
|
22
|
+
trace 'Not modified since last download'
|
23
|
+
return nil
|
24
|
+
when Net::HTTPRedirection
|
25
|
+
# Try to download from the new URI, handle relative redirects.
|
26
|
+
trace "Redirected to #{response['Location']}"
|
27
|
+
rself = self + URI.parse(response['Location'])
|
28
|
+
rself.user, rself.password = user, password
|
29
|
+
return rself.read(options, &block)
|
30
|
+
when Net::HTTPOK
|
31
|
+
info "Downloading #{self}"
|
32
|
+
result = nil
|
33
|
+
with_progress_bar options[:progress], path.split('/').last, response.content_length do |progress|
|
34
|
+
if block
|
35
|
+
response.read_body do |chunk|
|
36
|
+
block.call chunk
|
37
|
+
progress << chunk
|
38
|
+
end
|
39
|
+
else
|
40
|
+
result = ''
|
41
|
+
response.read_body do |chunk|
|
42
|
+
result << chunk
|
43
|
+
progress << chunk
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
return result
|
48
|
+
when Net::HTTPNotFound
|
49
|
+
raise NotFoundError, "Looking for #{self} and all I got was a 404!"
|
50
|
+
else
|
51
|
+
raise RuntimeError, "Failed to download #{self}: #{response.message}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def write_internal(options, &block) #:nodoc:
|
61
|
+
options ||= {}
|
62
|
+
user = self.user || options[:username]
|
63
|
+
password = self.password || options[:password]
|
64
|
+
|
65
|
+
connect do |http|
|
66
|
+
trace "Uploading to #{path}"
|
67
|
+
content = StringIO.new
|
68
|
+
while chunk = yield(RW_CHUNK_SIZE)
|
69
|
+
content << chunk
|
70
|
+
end
|
71
|
+
headers = { 'Content-MD5'=>Digest::MD5.hexdigest(content.string), 'Content-Type'=>'application/octet-stream' }
|
72
|
+
request = Net::HTTP::Put.new(request_uri.empty? ? '/' : request_uri, headers)
|
73
|
+
|
74
|
+
request.basic_auth user, password if user
|
75
|
+
|
76
|
+
response = nil
|
77
|
+
with_progress_bar options[:progress], path.split('/').last, content.size do |progress|
|
78
|
+
request.content_length = content.size
|
79
|
+
content.rewind
|
80
|
+
stream = Object.new
|
81
|
+
class << stream ; self ;end.send :define_method, :read do |count|
|
82
|
+
bytes = content.read(count)
|
83
|
+
progress << bytes if bytes
|
84
|
+
bytes
|
85
|
+
end
|
86
|
+
request.body_stream = stream
|
87
|
+
response = http.request(request)
|
88
|
+
end
|
89
|
+
|
90
|
+
case response
|
91
|
+
when Net::HTTPRedirection
|
92
|
+
# Try to download from the new URI, handle relative redirects.
|
93
|
+
trace "Redirected to #{response['Location']}"
|
94
|
+
content.rewind
|
95
|
+
return (self + URI.parse(response['location'])).write_internal(options) { |bytes| content.read(bytes) }
|
96
|
+
when Net::HTTPSuccess
|
97
|
+
else
|
98
|
+
raise RuntimeError, "Failed to upload #{self}: #{response.message}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
2
|
+
# contributor license agreements. See the NOTICE file distributed with this
|
3
|
+
# work for additional information regarding copyright ownership. The ASF
|
4
|
+
# licenses this file to you under the Apache License, Version 2.0 (the
|
5
|
+
# "License"); you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
require 'buildr'
|
17
|
+
require 'buildr/packaging/repository_array'
|
18
|
+
|
19
|
+
|
20
|
+
module Buildr
|
21
|
+
|
22
|
+
# A file task referencing an artifact in the local repository.
|
23
|
+
#
|
24
|
+
# This task includes all the artifact attributes (group, id, version, etc). It points
|
25
|
+
# to the artifact's path in the local repository. When invoked, it will download the
|
26
|
+
# artifact into the local repository if the artifact does not already exist.
|
27
|
+
#
|
28
|
+
# Note: You can enhance this task to create the artifact yourself, e.g. download it from
|
29
|
+
# a site that doesn't have a remote repository structure, copy it from a different disk, etc.
|
30
|
+
class Artifact
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
# :call-seq:
|
35
|
+
# download
|
36
|
+
#
|
37
|
+
# Downloads an artifact from one of the remote repositories, and stores it in the local
|
38
|
+
# repository. Raises an exception if the artifact is not found.
|
39
|
+
#
|
40
|
+
# This method attempts to download the artifact from each repository in the order in
|
41
|
+
# which they are returned from #remote, until successful.
|
42
|
+
def download
|
43
|
+
trace "Downloading #{to_spec}"
|
44
|
+
remote = Buildr.repositories.remote
|
45
|
+
remote = remote.each { |repo| repo[:url].path += '/' unless repo[:url].path[-1] == '/' }
|
46
|
+
fail "Unable to download #{to_spec}. No remote repositories defined." if remote.empty?
|
47
|
+
exact_success = remote.find do |repo|
|
48
|
+
begin
|
49
|
+
path = "#{group_path}/#{id}/#{version}/#{File.basename(name)}"
|
50
|
+
download_artifact(repo[:url] + path, repo)
|
51
|
+
true
|
52
|
+
rescue URI::NotFoundError
|
53
|
+
false
|
54
|
+
rescue Exception=>error
|
55
|
+
info error
|
56
|
+
trace error.backtrace.join("\n")
|
57
|
+
false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
if exact_success
|
62
|
+
return
|
63
|
+
elsif snapshot?
|
64
|
+
download_m2_snapshot(remote)
|
65
|
+
else
|
66
|
+
fail_download(remote)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def download_m2_snapshot(repos)
|
71
|
+
repos.find do |repo|
|
72
|
+
snapshot_url = current_snapshot_repo_url(repo)
|
73
|
+
if snapshot_url
|
74
|
+
begin
|
75
|
+
download_artifact snapshot_url
|
76
|
+
true
|
77
|
+
rescue URI::NotFoundError
|
78
|
+
false
|
79
|
+
end
|
80
|
+
else
|
81
|
+
false
|
82
|
+
end
|
83
|
+
end or fail_download(repos)
|
84
|
+
end
|
85
|
+
|
86
|
+
def current_snapshot_repo_url(repo)
|
87
|
+
begin
|
88
|
+
metadata_path = "#{group_path}/#{id}/#{version}/maven-metadata.xml"
|
89
|
+
metadata_xml = StringIO.new
|
90
|
+
URI.download repo[:url] + metadata_path, metadata_xml
|
91
|
+
metadata = REXML::Document.new(metadata_xml.string).root
|
92
|
+
timestamp = REXML::XPath.first(metadata, '//timestamp')
|
93
|
+
build_number = REXML::XPath.first(metadata, '//buildNumber')
|
94
|
+
error "No timestamp provided for the snapshot #{to_spec}" if timestamp.nil?
|
95
|
+
error "No build number provided for the snapshot #{to_spec}" if build_number.nil?
|
96
|
+
return nil if timestamp.nil? || build_number.nil?
|
97
|
+
snapshot_of = version[0, version.size - 9]
|
98
|
+
repo[:url] + "#{group_path}/#{id}/#{version}/#{id}-#{snapshot_of}-#{timestamp.text}-#{build_number.text}.#{type}"
|
99
|
+
rescue URI::NotFoundError
|
100
|
+
nil
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def fail_download(repos)
|
105
|
+
fail "Failed to download #{to_spec}, tried the following repositories:\n#{repos.map{ |repo| "#{repo[:url].to_s}#{' as ' + repo[:username] if repo[:username]}" }.join("\n")}"
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
# :call-seq:
|
111
|
+
# download_artifact
|
112
|
+
#
|
113
|
+
# Downloads artifact from given repository,
|
114
|
+
# supports downloading snapshot artifact with relocation on succeed to local repository
|
115
|
+
def download_artifact(path, opts = {})
|
116
|
+
download_file = "#{name}.#{Time.new.to_i}"
|
117
|
+
begin
|
118
|
+
URI.download path, download_file, opts
|
119
|
+
if File.exist?(download_file)
|
120
|
+
FileUtils.mkdir_p(File.dirname(name))
|
121
|
+
FileUtils.mv(download_file, name)
|
122
|
+
end
|
123
|
+
ensure
|
124
|
+
File.delete(download_file) if File.exist?(download_file)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# :call-seq:
|
129
|
+
# :download_needed?
|
130
|
+
#
|
131
|
+
# Validates whether artifact is required to be downloaded from repository
|
132
|
+
def download_needed?(task)
|
133
|
+
return true if !File.exist?(name)
|
134
|
+
|
135
|
+
if snapshot?
|
136
|
+
return false if offline? && File.exist?(name)
|
137
|
+
return true if update_snapshot? || old?
|
138
|
+
end
|
139
|
+
|
140
|
+
return false
|
141
|
+
end
|
142
|
+
|
143
|
+
|
144
|
+
end
|
145
|
+
|
146
|
+
# Holds the path to the local repository, URLs for remote repositories, and settings for release server.
|
147
|
+
#
|
148
|
+
# You can access this object from the #repositories method. For example:
|
149
|
+
# puts repositories.local
|
150
|
+
# repositories.remote << 'http://example.com/repo'
|
151
|
+
# repositories.release_to = 'sftp://example.com/var/www/public/repo'
|
152
|
+
class Repositories
|
153
|
+
include Singleton
|
154
|
+
|
155
|
+
|
156
|
+
# :call-seq:
|
157
|
+
# remote = Array
|
158
|
+
# remote = url
|
159
|
+
# remote = nil
|
160
|
+
#
|
161
|
+
# With a String argument, clears the array and set it to that single URL.
|
162
|
+
#
|
163
|
+
# With an Array argument, clears the array and set it to these specific URLs.
|
164
|
+
#
|
165
|
+
# With nil, clears the array.
|
166
|
+
def remote=(urls)
|
167
|
+
case urls
|
168
|
+
when nil then @remote = nil
|
169
|
+
when Array then @remote = RepositoryArray.new(urls.dup)
|
170
|
+
else @remote = RepositoryArray.new([urls])
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
2
|
+
# contributor license agreements. See the NOTICE file distributed with this
|
3
|
+
# work for additional information regarding copyright ownership. The ASF
|
4
|
+
# licenses this file to you under the Apache License, Version 2.0 (the
|
5
|
+
# "License"); you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
module Buildr
|
17
|
+
# Extention of Array to standardize URLs into { :url => 'url', :username => 'username', :password => 'password' }.
|
18
|
+
# :url = url of remote repository
|
19
|
+
# :username = optional username for authentication
|
20
|
+
# :password = optional password for authentication
|
21
|
+
class RepositoryArray < Array
|
22
|
+
|
23
|
+
def initialize( *args )
|
24
|
+
if !args.nil? && args.is_a?(Array) && args.size == 1
|
25
|
+
args = args[0]
|
26
|
+
converted = args.map {|url| convert_remote_url(url) }
|
27
|
+
super(converted)
|
28
|
+
else
|
29
|
+
super(args)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Concatenation—Returns a new array built by concatenating the two arrays together to produce a third array of standardized URL Hashes.
|
34
|
+
def +(urls)
|
35
|
+
concat(urls)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Append—Pushes the given object on to the end of this array, as a standardize URL Hash. This expression returns the array itself, so several appends may be chained together.
|
39
|
+
def <<(url)
|
40
|
+
converted = convert_remote_url( url )
|
41
|
+
super( converted )
|
42
|
+
end
|
43
|
+
|
44
|
+
# Appends the elements in other_array to self, as standardized URL Hashes
|
45
|
+
def concat(urls)
|
46
|
+
if !urls.nil?
|
47
|
+
converted = urls.map { |url| convert_remote_url( url ) }
|
48
|
+
super(converted)
|
49
|
+
else
|
50
|
+
super(nil)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# :call-seq:
|
55
|
+
# url = url => hash
|
56
|
+
# url = Hash => hash
|
57
|
+
#
|
58
|
+
# With a String url, returns a standardize URL Hash.
|
59
|
+
#
|
60
|
+
# With a Hash argument { :url => 'url', :username => 'username', :password => 'password' }, returns a standardize URL Hash.
|
61
|
+
#
|
62
|
+
def convert_remote_url(url)
|
63
|
+
if url.is_a? String
|
64
|
+
return {:url => URI.parse(url)}
|
65
|
+
elsif url.is_a? Hash
|
66
|
+
hash = { :url => URI.parse((url[:url] || url['url'])) }
|
67
|
+
username = url[:username] || url['username']
|
68
|
+
hash[:username] = username if username
|
69
|
+
|
70
|
+
password = (url[:password] || url['password'])
|
71
|
+
hash[:password] = password if password
|
72
|
+
|
73
|
+
return hash
|
74
|
+
elsif url.is_a? URI
|
75
|
+
return { :url => url }
|
76
|
+
else
|
77
|
+
raise ArgumentError, "Unsupported :url, must be String, Hash, or URI: #{url.inspect}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Inserts the given values before the element with the given index (which may be negative), as standardized URL Hashes
|
82
|
+
def insert( index, *args)
|
83
|
+
if !args.nil?
|
84
|
+
pos = index
|
85
|
+
args.each do |url|
|
86
|
+
convert = convert_remote_url( url )
|
87
|
+
super( pos, convert )
|
88
|
+
if index >= 0
|
89
|
+
pos = pos + 1
|
90
|
+
end
|
91
|
+
end
|
92
|
+
else
|
93
|
+
super( index, nil )
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# Replaces the contents of self with the contents of other_array, truncating or expanding if necessary. The contents of other_array
|
98
|
+
# is converted standardized URL Hashes.
|
99
|
+
def replace( other_array )
|
100
|
+
if !other_array.nil?
|
101
|
+
converted = other_array.map { |url| convert_remote_url( url ) }
|
102
|
+
super( converted )
|
103
|
+
else
|
104
|
+
super( nil )
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/lib/buildr/resolver.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'naether'
|
3
|
-
require "
|
3
|
+
require "buildr/resolver/java"
|
4
|
+
require "buildr/packaging/repository_array"
|
5
|
+
require "buildr/override/core/transports"
|
6
|
+
require "buildr/override/packaging/artifact"
|
4
7
|
|
5
8
|
module Buildr
|
6
9
|
module Resolver
|
@@ -17,7 +20,7 @@ module Buildr
|
|
17
20
|
#
|
18
21
|
# Options
|
19
22
|
# * :excludes - an array of dependencies to regex exclude
|
20
|
-
# * :
|
23
|
+
# * :download - have Buildr::Resolver download artifacts instead of Buildr
|
21
24
|
def resolve( dependencies, opts = {} )
|
22
25
|
|
23
26
|
options = opts
|
@@ -25,25 +28,14 @@ module Buildr
|
|
25
28
|
if Buildr.repositories.remote.size > 0
|
26
29
|
naether.clear_remote_repositories
|
27
30
|
Buildr.repositories.remote.each do |repo|
|
28
|
-
naether.add_remote_repository( repo )
|
29
|
-
end
|
30
|
-
|
31
|
-
unless options[:repos].nil?
|
32
|
-
repos = options[:repos]
|
33
|
-
unless repos.is_a? Array
|
34
|
-
repos = [repos]
|
35
|
-
end
|
36
|
-
|
37
|
-
repos.each do |repo|
|
38
|
-
naether.add_remote_repository( repo[:url], repo[:username], repo[:password] )
|
39
|
-
end
|
40
|
-
end
|
31
|
+
naether.add_remote_repository( repo[:url].to_s, repo[:username], repo[:password] )
|
32
|
+
end
|
41
33
|
end
|
42
34
|
|
43
35
|
naether.local_repo_path = Repositories.instance.local
|
44
36
|
|
45
37
|
naether.dependencies = dependencies
|
46
|
-
naether.resolve_dependencies(
|
38
|
+
naether.resolve_dependencies( opts[:download] == true )
|
47
39
|
|
48
40
|
unless options[:excludes].nil?
|
49
41
|
|
@@ -71,6 +63,10 @@ module Buildr
|
|
71
63
|
naether.deploy_artifact( notation, file_path, url, opts )
|
72
64
|
end
|
73
65
|
|
66
|
+
def install_artifact( notation, file_path, opts = {} )
|
67
|
+
naether.install_artifact( notation, file_path, opts )
|
68
|
+
end
|
69
|
+
|
74
70
|
def write_pom( notation, file_path )
|
75
71
|
naether.write_pom( notation, file_path )
|
76
72
|
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
2
|
+
# contributor license agreements. See the NOTICE file distributed with this
|
3
|
+
# work for additional information regarding copyright ownership. The ASF
|
4
|
+
# licenses this file to you under the Apache License, Version 2.0 (the
|
5
|
+
# "License"); you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
require 'buildr/packaging/repository_array'
|
16
|
+
|
17
|
+
describe Buildr::RepositoryArray do
|
18
|
+
it 'should create a new instance' do
|
19
|
+
repo_array = Buildr::RepositoryArray.new
|
20
|
+
repo_array.should_not be_nil
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should create a new instance from an array' do
|
24
|
+
repo_array = Buildr::RepositoryArray.new( ['url1', {:url => 'url2'}] )
|
25
|
+
repo_array[0].should eql( { :url => URI.parse('url1') } )
|
26
|
+
repo_array[1].should eql( { :url => URI.parse('url2') } )
|
27
|
+
end
|
28
|
+
|
29
|
+
context "instance" do
|
30
|
+
before(:each) do
|
31
|
+
@array = Buildr::RepositoryArray.new
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should << and convert to standardize Hash' do
|
35
|
+
@array << 'url1' << { 'url' => 'url2' }
|
36
|
+
@array[0].should eql( {:url => URI.parse('url1')} )
|
37
|
+
@array[1].should eql( {:url => URI.parse('url2')} )
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should + and convert to standardize Hash' do
|
41
|
+
@array + ['url1', { :url => 'url2'}]
|
42
|
+
@array[0].should eql( {:url => URI.parse('url1')} )
|
43
|
+
@array[1].should eql( {:url => URI.parse('url2')} )
|
44
|
+
|
45
|
+
@array + ['url3', { :url => 'url4'}]
|
46
|
+
@array[0].should eql( {:url => URI.parse('url1')} )
|
47
|
+
@array[1].should eql( {:url => URI.parse('url2')} )
|
48
|
+
@array[2].should eql( {:url => URI.parse('url3')} )
|
49
|
+
@array[3].should eql( {:url => URI.parse('url4')} )
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should concat and convert to standardize Hash' do
|
53
|
+
@array + ['url1', { :url => 'url2'}]
|
54
|
+
@array[0].should eql( {:url => URI.parse('url1')} )
|
55
|
+
@array[1].should eql( {:url => URI.parse('url2')} )
|
56
|
+
|
57
|
+
@array + ['url3', { :url => 'url4'}]
|
58
|
+
@array[0].should eql( {:url => URI.parse('url1')} )
|
59
|
+
@array[1].should eql( {:url => URI.parse('url2')} )
|
60
|
+
@array[2].should eql( {:url => URI.parse('url3')} )
|
61
|
+
@array[3].should eql( {:url => URI.parse('url4')} )
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should convert a String into a standardize Hash' do
|
65
|
+
@array.convert_remote_url( 'url' ).should eql( {:url => URI.parse('url') } )
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should convert a Hash into a standardize Hash' do
|
69
|
+
@array.convert_remote_url({ :username => 'username', :blah => 7, 'password' => 'password', 'foo' => 'bot', 'url' => 'url' }).should eql( {:url => URI.parse('url'), :username => 'username', :password => 'password' } )
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should convert a URI into a standardize Hash' do
|
73
|
+
@array.convert_remote_url( URI.parse('test')).should eql( {:url => URI.parse('test') } )
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'Unsupported :url, must be String, Hash, or URI: 7' do
|
77
|
+
lambda { @array.convert_remote_url( 7 ) }.should raise_error(ArgumentError, /Unsupported :url, must be String, Hash, or URI: 7/)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should insert as standardized Hash" do
|
81
|
+
@array << 'url1' << 'url3'
|
82
|
+
@array.insert( 1, 'url2', 'url2.5' )
|
83
|
+
|
84
|
+
@array[0].should eql( {:url => URI.parse('url1')} )
|
85
|
+
@array[1].should eql( {:url => URI.parse('url2')} )
|
86
|
+
@array[2].should eql( {:url => URI.parse('url2.5')} )
|
87
|
+
@array[3].should eql( {:url => URI.parse('url3')} )
|
88
|
+
|
89
|
+
@array.insert( -3, 'url2.2', 'url2.3' )
|
90
|
+
|
91
|
+
@array[0].should eql( {:url => URI.parse('url1')} )
|
92
|
+
@array[1].should eql( {:url => URI.parse('url2')} )
|
93
|
+
@array[2].should eql( {:url => URI.parse('url2.2')} )
|
94
|
+
@array[3].should eql( {:url => URI.parse('url2.3')} )
|
95
|
+
@array[4].should eql( {:url => URI.parse('url2.5')} )
|
96
|
+
@array[5].should eql( {:url => URI.parse('url3')} )
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should replace as standardized Hash" do
|
100
|
+
@array << 'test'
|
101
|
+
@array.replace( ['url1', 'url2'] )
|
102
|
+
|
103
|
+
@array[0].should eql( {:url => URI.parse('url1')} )
|
104
|
+
@array[1].should eql( {:url => URI.parse('url2')} )
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
data/spec/resolver_spec.rb
CHANGED
@@ -1,11 +1,31 @@
|
|
1
|
-
require 'lib/buildr/resolver'
|
2
1
|
require 'buildr'
|
2
|
+
require 'lib/buildr/resolver'
|
3
|
+
require 'uri'
|
3
4
|
require 'fileutils'
|
4
5
|
|
5
6
|
Buildr.application.instance_eval { @rakefile = File.expand_path('buildfile') }
|
6
7
|
|
7
8
|
describe Buildr::Resolver do
|
8
9
|
context "Module" do
|
10
|
+
|
11
|
+
before(:all) do
|
12
|
+
unless File.exists? 'tmp/test-repo'
|
13
|
+
FileUtils::mkdir_p 'tmp/test-repo'
|
14
|
+
end
|
15
|
+
|
16
|
+
Buildr.repositories.remote = 'http://repo1.maven.org/maven2/'
|
17
|
+
Buildr::Resolver.naether.local_repo_path = 'tmp/test-repo'
|
18
|
+
Buildr.repositories.local = 'tmp/test-repo'
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
context "overrides for Buildr" do
|
23
|
+
it "should support hash repositories" do
|
24
|
+
Buildr.repositories.remote << { :url => 'http://test.com' }
|
25
|
+
Buildr.repositories.remote.last.should eql( { :url => URI.parse('http://test.com') } )
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
9
29
|
it "should resolve dependencies" do
|
10
30
|
dependencies = Buildr::Resolver.resolve( ['ch.qos.logback:logback-classic:jar:0.9.24'] )
|
11
31
|
|
@@ -24,18 +44,11 @@ describe Buildr::Resolver do
|
|
24
44
|
end
|
25
45
|
|
26
46
|
it "should deploy artifact" do
|
27
|
-
unless File.exists? 'tmp/test-repo'
|
28
|
-
FileUtils::mkdir_p 'tmp/test-repo'
|
29
|
-
end
|
30
|
-
|
31
47
|
Buildr::Resolver.deploy_artifact( "test:test:jar:1.12", Naether::Bootstrap.naether_jar, 'file:tmp/test-repo' )
|
32
48
|
File.exists?('tmp/test-repo/test/test/1.12/test-1.12.jar').should be_true
|
33
49
|
end
|
34
50
|
|
35
51
|
it "should write a pom" do
|
36
|
-
unless File.exists? 'tmp'
|
37
|
-
FileUtils::mkdir 'tmp'
|
38
|
-
end
|
39
52
|
Buildr::Resolver.resolve( ['ch.qos.logback:logback-classic:jar:0.9.24'] )
|
40
53
|
Buildr::Resolver.write_pom( "buildr-resolver:buildr-resolver:jar:45.45", "tmp/pom.xml" )
|
41
54
|
File.exists?( 'tmp/pom.xml' ).should be_true
|
@@ -45,5 +58,17 @@ describe Buildr::Resolver do
|
|
45
58
|
xml.should match /.+org.slf4j<\/groupId>\s+<artifactId>slf4j-api<\/artifactId>\s+<version>1.6.0.+/
|
46
59
|
|
47
60
|
end
|
61
|
+
|
62
|
+
it "should install a pom" do
|
63
|
+
if File.exists?( "#{Buildr::Resolver.naether.local_repo_path}buildr-resolver/11.11/buildr-resolver-11.11.jar" )
|
64
|
+
File.delete("#{Buildr::Resolver.naether.local_repo_path}buildr-resolver/11.11/buildr-resolver-11.11.jar")
|
65
|
+
end
|
66
|
+
|
67
|
+
Buildr::Resolver.resolve( ['ch.qos.logback:logback-classic:jar:0.9.24'] )
|
68
|
+
Buildr::Resolver.write_pom( "buildr-resolver:buildr-resolver:jar:45.45", "tmp/pom.xml" )
|
69
|
+
Buildr::Resolver.install_artifact( "buildr-resolver:buildr-resolver:jar:11.11", Naether::Bootstrap.naether_jar, {:pom_path => "tmp/pom.xml"} )
|
70
|
+
File.exists?( "#{Buildr::Resolver.naether.local_repo_path}/buildr-resolver/11.11/buildr-resolver-11.11.jar" )
|
71
|
+
end
|
48
72
|
end
|
73
|
+
|
49
74
|
end
|
metadata
CHANGED
@@ -1,73 +1,87 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: buildr-resolver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
hash: 25
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 5
|
10
|
+
version: 0.3.5
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
|
-
|
13
|
+
- Michael Guymon
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-03-
|
18
|
+
date: 2011-03-30 00:00:00 -04:00
|
14
19
|
default_executable:
|
15
20
|
dependencies:
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
prerelease: false
|
23
|
+
name: naether
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - "="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 27
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 3
|
33
|
+
- 4
|
34
|
+
version: 0.3.4
|
35
|
+
requirement: *id001
|
36
|
+
type: :runtime
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
prerelease: false
|
39
|
+
name: buildr
|
40
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - "="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 13
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 4
|
49
|
+
- 5
|
50
|
+
version: 1.4.5
|
51
|
+
requirement: *id002
|
52
|
+
type: :runtime
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
prerelease: false
|
55
|
+
name: bundler
|
56
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 23
|
62
|
+
segments:
|
63
|
+
- 1
|
64
|
+
- 0
|
65
|
+
- 0
|
66
|
+
version: 1.0.0
|
67
|
+
requirement: *id003
|
68
|
+
type: :development
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
prerelease: false
|
71
|
+
name: jeweler
|
72
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 7
|
78
|
+
segments:
|
79
|
+
- 1
|
80
|
+
- 5
|
81
|
+
- 2
|
82
|
+
version: 1.5.2
|
83
|
+
requirement: *id004
|
84
|
+
type: :development
|
71
85
|
description: Java dependency resolver for Buildr using Maven's Aether
|
72
86
|
email: michael.guymon@gmail.com
|
73
87
|
executables: []
|
@@ -75,48 +89,56 @@ executables: []
|
|
75
89
|
extensions: []
|
76
90
|
|
77
91
|
extra_rdoc_files:
|
78
|
-
|
79
|
-
|
92
|
+
- LICENSE
|
93
|
+
- README.rdoc
|
80
94
|
files:
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
95
|
+
- Gemfile
|
96
|
+
- LICENSE
|
97
|
+
- README.rdoc
|
98
|
+
- Rakefile
|
99
|
+
- VERSION
|
100
|
+
- buildr-resolver.gemspec
|
101
|
+
- lib/buildr/override/core/transports.rb
|
102
|
+
- lib/buildr/override/packaging/artifact.rb
|
103
|
+
- lib/buildr/packaging/repository_array.rb
|
104
|
+
- lib/buildr/resolver.rb
|
105
|
+
- lib/buildr/resolver/java.rb
|
106
|
+
- spec/repository_array_spec.rb
|
107
|
+
- spec/resolver_spec.rb
|
90
108
|
has_rdoc: true
|
91
109
|
homepage: http://github.com/mguymon/buildr-resolver
|
92
110
|
licenses:
|
93
|
-
|
111
|
+
- Apache
|
94
112
|
post_install_message:
|
95
113
|
rdoc_options: []
|
96
114
|
|
97
115
|
require_paths:
|
98
|
-
|
116
|
+
- lib
|
99
117
|
required_ruby_version: !ruby/object:Gem::Requirement
|
100
118
|
none: false
|
101
119
|
requirements:
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
hash: 3
|
123
|
+
segments:
|
124
|
+
- 0
|
125
|
+
version: "0"
|
108
126
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
127
|
none: false
|
110
128
|
requirements:
|
111
|
-
|
112
|
-
|
113
|
-
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
hash: 3
|
132
|
+
segments:
|
133
|
+
- 0
|
134
|
+
version: "0"
|
114
135
|
requirements: []
|
115
136
|
|
116
137
|
rubyforge_project: buildr-resolver
|
117
|
-
rubygems_version: 1.
|
138
|
+
rubygems_version: 1.3.7
|
118
139
|
signing_key:
|
119
140
|
specification_version: 3
|
120
141
|
summary: Java dependency resolver for Buildr using Maven's Aether
|
121
142
|
test_files:
|
122
|
-
|
143
|
+
- spec/repository_array_spec.rb
|
144
|
+
- spec/resolver_spec.rb
|