buildrdeb 0.0.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +10 -7
- data/buildrdeb.gemspec +1 -1
- data/lib/buildrdeb/package.rb +22 -30
- data/rakelib/all-in-one.rake +113 -0
- data/rakelib/checks.rake +2 -2
- data/rakelib/doc.rake +20 -3
- data/rakelib/metrics.rake +39 -0
- data/rakelib/package.rake +1 -1
- data/rakelib/release.rake +9 -6
- data/rakelib/rspec.rake +28 -9
- data/rakelib/setup.rake +15 -3
- data/rakelib/stage.rake +23 -9
- data/spec/buildrdeb/package_spec.rb +37 -3
- metadata +6 -5
- data/rakelib/jekylltask.rb +0 -120
data/README.rdoc
CHANGED
@@ -6,16 +6,19 @@ See the official Buildr site: http://buildr.apache.org
|
|
6
6
|
|
7
7
|
== Install buildrdeb
|
8
8
|
|
9
|
-
*
|
10
|
-
* For the impatient:
|
11
|
-
* gem sources -a http://gems.github.com
|
12
|
-
* sudo gem install intalio-buildrdeb
|
9
|
+
* gem install buildrdeb
|
13
10
|
|
14
|
-
==
|
11
|
+
== Manual
|
15
12
|
|
16
|
-
|
13
|
+
define "foo" do
|
14
|
+
|
15
|
+
package(:deb).enhance do |deb|
|
16
|
+
deb.control = _("config/control")
|
17
|
+
deb.preinst = _("config/preinst")
|
18
|
+
deb.include(_("target/myfolder"))
|
19
|
+
end
|
17
20
|
|
18
|
-
|
21
|
+
end
|
19
22
|
|
20
23
|
== License
|
21
24
|
|
data/buildrdeb.gemspec
CHANGED
data/lib/buildrdeb/package.rb
CHANGED
@@ -26,43 +26,38 @@ module BuildrDeb
|
|
26
26
|
# With deb we recreate the structure asked by the user
|
27
27
|
# then we will call dpkg --build over it.
|
28
28
|
def create_from(file_map)
|
29
|
-
root = File.join("target", "
|
29
|
+
root = File.join("target", "#{File.basename(name)}-contents")
|
30
30
|
mkpath File.join(root, "DEBIAN")
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
31
|
+
for filename in ["control", "prerm", "postinst", "postrm", "preinst", "triggers"]
|
32
|
+
file = send(filename)
|
33
|
+
if file.nil?
|
34
|
+
raise "no control file was defined when packaging as a deb file" if filename == "control"
|
35
|
+
else
|
36
|
+
raise "Cannot find #{filename}: #{file} doesn't exist" if !File.exists? file
|
37
|
+
target = File.join(root, "DEBIAN", filename)
|
38
|
+
contents = File.read(file)
|
39
|
+
# Replace version if we are looking at control.
|
40
|
+
contents.gsub!(/^Version: .*$/, "Version: #{@version}") if (filename == "control" && !@version.nil?)
|
41
|
+
File.open(target, "w+") {|t|
|
42
|
+
t.write eval("\"#{contents}\"")
|
43
43
|
}
|
44
|
-
|
45
|
-
actualFile.close
|
46
|
-
File.chmod 0755, targetFile
|
47
|
-
#cp send(file.to_sym), File.join(root, "DEBIAN", file)
|
48
|
-
#File.chmod 0755, File.join(root, "DEBIAN", file)
|
44
|
+
File.chmod 0755, target
|
49
45
|
end
|
50
46
|
end
|
51
|
-
|
52
47
|
file_map.each do |path, content|
|
53
48
|
_path = File.join(root, path)
|
54
49
|
if content.respond_to?(:call)
|
55
50
|
raise "Not implemented"
|
56
|
-
content.call path
|
57
|
-
elsif content.nil?
|
58
|
-
|
51
|
+
#content.call path
|
52
|
+
elsif content.nil?
|
53
|
+
mkdir_p _path
|
54
|
+
elsif File.directory?(content.to_s)
|
55
|
+
|
59
56
|
else
|
60
|
-
|
57
|
+
mkdir_p File.dirname(_path) if !File.exists?(File.dirname(_path))
|
61
58
|
cp content.to_s, _path
|
62
59
|
end
|
63
60
|
end
|
64
|
-
|
65
|
-
|
66
61
|
out = %x[ dpkg --build \"#{root}\" \"#{name}\" 2>&1 ]
|
67
62
|
raise "dpkg failed with this error:\n#{out}" if $? != 0
|
68
63
|
end
|
@@ -74,13 +69,10 @@ module BuildrDeb
|
|
74
69
|
|
75
70
|
def package_as_deb(file_name)
|
76
71
|
deb = DebTask.define_task(file_name)
|
77
|
-
deb.tap do
|
78
|
-
package ||= project.id
|
79
|
-
version ||= project.version
|
80
|
-
end
|
81
72
|
deb.enhance do |task|
|
82
73
|
task.enhance do
|
83
|
-
|
74
|
+
package ||= project.id
|
75
|
+
version ||= project.version
|
84
76
|
end
|
85
77
|
end
|
86
78
|
return deb
|
@@ -0,0 +1,113 @@
|
|
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
|
+
desc "Create JRuby all-in-one distribution"
|
17
|
+
task "all-in-one" => 'all-in-one:all-in-one'
|
18
|
+
|
19
|
+
namespace :'all-in-one' do
|
20
|
+
|
21
|
+
version = "1.5.2"
|
22
|
+
jruby_distro = "jruby-bin-#{version}.tar.gz"
|
23
|
+
url = "http://jruby.org.s3.amazonaws.com/downloads/#{version}/#{jruby_distro}"
|
24
|
+
dir = "jruby-#{version}"
|
25
|
+
|
26
|
+
task "all-in-one" => [:gem,
|
27
|
+
# Prepare to run
|
28
|
+
:prepare,
|
29
|
+
# Download and extract JRuby
|
30
|
+
:download_and_extract,
|
31
|
+
# Cleanup JRuby distribution
|
32
|
+
:clean_dist,
|
33
|
+
# Install Buildr gem and dependencies
|
34
|
+
:install_dependencies,
|
35
|
+
# Add Buildr executables/scripts
|
36
|
+
:add_execs,
|
37
|
+
# Package distribution
|
38
|
+
:package
|
39
|
+
]
|
40
|
+
|
41
|
+
desc 'Prepare to run'
|
42
|
+
task :prepare do
|
43
|
+
mkpath '_all-in-one'
|
44
|
+
cd '_all-in-one'
|
45
|
+
end
|
46
|
+
|
47
|
+
desc 'Download and extract JRuby'
|
48
|
+
task :download_and_extract do
|
49
|
+
unless File.exist? jruby_distro
|
50
|
+
puts "Downloading JRuby from #{url} ..."
|
51
|
+
sh 'wget', url
|
52
|
+
puts "[X] Downloaded JRuby"
|
53
|
+
end
|
54
|
+
|
55
|
+
rm_rf dir if File.exist? dir
|
56
|
+
|
57
|
+
puts "Extracting JRuby to #{dir} ..."
|
58
|
+
sh 'tar', 'xzf', jruby_distro
|
59
|
+
puts "[X] Extracted JRuby"
|
60
|
+
cd dir
|
61
|
+
end
|
62
|
+
|
63
|
+
desc 'Cleanup JRuby distribution'
|
64
|
+
task :clean_dist do
|
65
|
+
puts 'Cleaning...'
|
66
|
+
rm_rf 'docs'
|
67
|
+
mkpath 'jruby-docs'
|
68
|
+
mv Dir["COPYING*"], 'jruby-docs'
|
69
|
+
mv Dir["LICENSE*"], 'jruby-docs'
|
70
|
+
mv 'README', 'jruby-docs'
|
71
|
+
rm_rf 'lib/ruby/1.9'
|
72
|
+
rm_rf 'lib/ruby/gems/1.8/doc'
|
73
|
+
rm_rf 'samples'
|
74
|
+
rm_rf 'share'
|
75
|
+
end
|
76
|
+
|
77
|
+
desc 'Install Buildr gem and dependencies'
|
78
|
+
task :install_dependencies do
|
79
|
+
puts "Install Buildr gem ..."
|
80
|
+
sh "bin/jruby", '-S', 'gem', 'install', FileList['../../pkg/*-java.gem'].first,
|
81
|
+
'--no-rdoc', '--no-ri'
|
82
|
+
puts "[X] Install Buildr gem"
|
83
|
+
end
|
84
|
+
|
85
|
+
desc 'Add Buildr executables/scripts'
|
86
|
+
task :add_execs do
|
87
|
+
cp 'bin/jruby.exe', 'bin/_buildr.exe'
|
88
|
+
cp Dir["../../all-in-one/*"], 'bin'
|
89
|
+
end
|
90
|
+
|
91
|
+
desc 'Package distribution'
|
92
|
+
task :package do
|
93
|
+
puts "Zipping distribution ..."
|
94
|
+
cd '..'
|
95
|
+
new_dir = "#{spec.name}-#{spec.version}"
|
96
|
+
mv dir, new_dir
|
97
|
+
zip = "#{new_dir}.zip"
|
98
|
+
rm zip if File.exist? zip
|
99
|
+
sh 'zip', '-q', '-r', zip, new_dir
|
100
|
+
puts "[X] Zipped distribution"
|
101
|
+
|
102
|
+
puts "Tarring distribution ..."
|
103
|
+
tar = "#{new_dir}.tar.gz"
|
104
|
+
rm tar if File.exist? tar
|
105
|
+
sh 'tar', 'czf', tar, new_dir
|
106
|
+
puts "[X] Tarred distribution"
|
107
|
+
|
108
|
+
rm_rf new_dir
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
task(:clobber) { rm_rf '_all-in-one' }
|
data/rakelib/checks.rake
CHANGED
@@ -18,7 +18,7 @@ desc "Check that source files contain the Apache license"
|
|
18
18
|
task :license=>FileList["**/*.{rb,rake,java,gemspec,buildfile}", 'Rakefile'] do |task|
|
19
19
|
puts "Checking that files contain the Apache license ... "
|
20
20
|
required = task.prerequisites.select { |fn| File.file?(fn) }
|
21
|
-
missing = required.reject { |fn|
|
21
|
+
missing = required.reject { |fn|
|
22
22
|
comments = File.read(fn).scan(/(\/\*(.*?)\*\/)|^#\s+(.*?)$|^-#\s+(.*?)$|<!--(.*?)-->/m).
|
23
23
|
map { |match| match.compact }.flatten.join("\n")
|
24
24
|
comments =~ /Licensed to the Apache Software Foundation/ && comments =~ /http:\/\/www.apache.org\/licenses\/LICENSE-2.0/
|
@@ -45,7 +45,7 @@ task :dependency do
|
|
45
45
|
dep_spec.runtime_dependencies.map { |trans| transitive[trans].push(trans) }.flatten.uniq }
|
46
46
|
# For each dependency, make sure *all* its transitive dependencies are listed
|
47
47
|
# as a Buildr dependency, and order is preserved.
|
48
|
-
spec.dependencies.each_with_index do |dep, index|
|
48
|
+
spec.dependencies.select {|dep| dep.type == :runtime }.each_with_index do |dep, index|
|
49
49
|
puts "checking #{dep.name}"
|
50
50
|
transitive[dep].each do |trans|
|
51
51
|
matching = spec.dependencies.find { |existing| trans =~ existing }
|
data/rakelib/doc.rake
CHANGED
@@ -36,7 +36,17 @@ end
|
|
36
36
|
|
37
37
|
|
38
38
|
begin
|
39
|
-
require '
|
39
|
+
require 'jekylltask'
|
40
|
+
module TocFilter
|
41
|
+
def toc(input)
|
42
|
+
input.scan(/<(h2)(?:>|\s+(.*?)>)([^<]*)<\/\1\s*>/mi).inject(%{<ol class="toc">}) { |toc, entry|
|
43
|
+
id = entry[1][/^id=(['"])(.*)\1$/, 2]
|
44
|
+
title = entry[2].gsub(/<(\w*).*?>(.*?)<\/\1\s*>/m, '\2').strip
|
45
|
+
toc << %{<li><a href="##{id}">#{title}</a></li>}
|
46
|
+
} << "</ol>"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
Liquid::Template.register_filter(TocFilter)
|
40
50
|
|
41
51
|
desc "Generate Buildr documentation in _site/"
|
42
52
|
JekyllTask.new :jekyll do |task|
|
@@ -45,9 +55,9 @@ begin
|
|
45
55
|
end
|
46
56
|
|
47
57
|
rescue LoadError
|
48
|
-
puts "Buildr uses the
|
58
|
+
puts "Buildr uses the jekyll gem to generate the Web site. You can install it by running rake doc:setup"
|
49
59
|
task 'doc:setup' do
|
50
|
-
install_gem '
|
60
|
+
install_gem 'jekyll', :version=>'0.6.2'
|
51
61
|
if `pygmentize -V`.empty?
|
52
62
|
args = %w{easy_install Pygments}
|
53
63
|
args.unshift 'sudo' unless Config::CONFIG['host_os'] =~ /windows/
|
@@ -71,6 +81,13 @@ task :site=>['_site', :rdoc, '_reports/specs.html', '_reports/coverage', 'buildr
|
|
71
81
|
cp_r '_reports/coverage', '_site'
|
72
82
|
fail 'No coverage report in site directory' unless File.exist?('_site/coverage/index.html')
|
73
83
|
cp 'CHANGELOG', '_site'
|
84
|
+
open("_site/.htaccess", "w") do |htaccess|
|
85
|
+
htaccess << %Q{
|
86
|
+
<FilesMatch "CHANGELOG">
|
87
|
+
ForceType 'text/plain; charset=UTF-8'
|
88
|
+
</FilesMatch>
|
89
|
+
}
|
90
|
+
end
|
74
91
|
cp 'buildr.pdf', '_site'
|
75
92
|
fail 'No PDF in site directory' unless File.exist?('_site/buildr.pdf')
|
76
93
|
puts 'OK'
|
@@ -0,0 +1,39 @@
|
|
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
|
+
namespace :metrics do
|
17
|
+
desc 'run Saikuro reports'
|
18
|
+
task :saikuro do
|
19
|
+
gem 'atoulme-Saikuro'
|
20
|
+
require 'saikuro'
|
21
|
+
output_dir = File.expand_path(File.join(File.dirname(__FILE__), "..", "_reports", "saikuro"))
|
22
|
+
base_dir = Pathname.new(File.expand_path(File.join(File.dirname(__FILE__), "..")))
|
23
|
+
rb_files = ["lib", "addon"].collect { |folder|
|
24
|
+
FileList[File.expand_path(File.join(File.dirname(__FILE__), "..", folder, "**", "*.rb"))]
|
25
|
+
}.flatten.collect {|path|
|
26
|
+
Pathname.new(path).relative_path_from(base_dir).to_s
|
27
|
+
}
|
28
|
+
SaikuroRunner.new.run(rb_files, output_dir)
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'generate ccn treemap'
|
32
|
+
task :ccn_treemap do
|
33
|
+
require 'saikuro_treemap'
|
34
|
+
SaikuroTreemap.generate_treemap :code_dirs => ['lib', 'addon'], :output_file => "_reports/saikuro_treemap.html"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc 'Run all metrics tools'
|
39
|
+
task :metrics => ["metrics:saikuro", "metrics:ccn_treemap"]
|
data/rakelib/package.rake
CHANGED
@@ -67,7 +67,7 @@ task :snapshot=>[:package] do
|
|
67
67
|
cp FileList['pkg/{*.gem,*.tgz,*.zip}'], '_snapshot/gems'
|
68
68
|
puts "Generating gem index ..."
|
69
69
|
sh 'gem', 'generate_index', '--directory', '_snapshot'
|
70
|
-
puts "Copying gem and index back to Apache"
|
70
|
+
puts "Copying gem and index back to Apache"
|
71
71
|
sh 'rsync', '--progress', '--recursive', '_snapshot/', 'people.apache.org:public_html/buildr/snapshot/'
|
72
72
|
end
|
73
73
|
task(:clobber) { rm_rf '_snapshot' }
|
data/rakelib/release.rake
CHANGED
@@ -45,6 +45,9 @@ task :release do
|
|
45
45
|
|
46
46
|
# Upload binary and source packages to RubyForge.
|
47
47
|
lambda do
|
48
|
+
sh 'rubyforge', 'login'
|
49
|
+
# update rubyforge projects, processors, etc. in local config
|
50
|
+
sh 'rubyforge', 'config'
|
48
51
|
files = FileList["_release/#{spec.version}/dist/*.{gem,tgz,zip}"]
|
49
52
|
puts "Uploading #{spec.version} to RubyForge ... "
|
50
53
|
rubyforge = RubyForge.new.configure
|
@@ -63,7 +66,7 @@ task :release do
|
|
63
66
|
# Create an SVN tag for this release.
|
64
67
|
lambda do
|
65
68
|
info = `svn info` + `git svn info` # Using either svn or git-svn
|
66
|
-
if url = info[/^URL:/] && info.scan(/^URL: (.*)/)[0][0]
|
69
|
+
if url = info[/^URL:/] && info.scan(/^URL: (.*)/)[0][0]
|
67
70
|
new_url = url.sub(/(trunk$)|(branches\/\w*)$/, "tags/#{spec.version}")
|
68
71
|
unless url == new_url
|
69
72
|
sh 'svn', 'copy', url, new_url, '-m', "Release #{spec.version}" do |ok, res|
|
@@ -80,7 +83,7 @@ task :release do
|
|
80
83
|
|
81
84
|
|
82
85
|
# Update CHANGELOG to next release number.
|
83
|
-
lambda do
|
86
|
+
lambda do
|
84
87
|
next_version = spec.version.to_s.split('.').map { |v| v.to_i }.
|
85
88
|
zip([0, 0, 1]).map { |a| a.inject(0) { |t,i| t + i } }.join('.')
|
86
89
|
modified = "#{next_version} (Pending)\n\n" + File.read('CHANGELOG')
|
@@ -89,7 +92,7 @@ task :release do
|
|
89
92
|
end
|
90
93
|
puts "[X] Updated CHANGELOG and added entry for next release"
|
91
94
|
end.call
|
92
|
-
|
95
|
+
|
93
96
|
|
94
97
|
# Update source files to next release number.
|
95
98
|
lambda do
|
@@ -98,7 +101,7 @@ task :release do
|
|
98
101
|
|
99
102
|
ver_file = "lib/#{spec.name}.rb"
|
100
103
|
if File.exist?(ver_file)
|
101
|
-
modified = File.read(ver_file).sub(/(VERSION\s*=\s*)(['"])(.*)\2/) { |line| "#{$1}#{$2}#{next_version}#{$2}" }
|
104
|
+
modified = File.read(ver_file).sub(/(VERSION\s*=\s*)(['"])(.*)\2/) { |line| "#{$1}#{$2}#{next_version}#{$2}" }
|
102
105
|
File.open ver_file, 'w' do |file|
|
103
106
|
file.write modified
|
104
107
|
end
|
@@ -107,7 +110,7 @@ task :release do
|
|
107
110
|
|
108
111
|
spec_file = "#{spec.name}.gemspec"
|
109
112
|
if File.exist?(spec_file)
|
110
|
-
modified = File.read(spec_file).sub(/(s(?:pec)?\.version\s*=\s*)(['"])(.*)\2/) { |line| "#{$1}#{$2}#{next_version}#{$2}" }
|
113
|
+
modified = File.read(spec_file).sub(/(s(?:pec)?\.version\s*=\s*)(['"])(.*)\2/) { |line| "#{$1}#{$2}#{next_version}#{$2}" }
|
111
114
|
File.open spec_file, 'w' do |file|
|
112
115
|
file.write modified
|
113
116
|
end
|
@@ -115,7 +118,7 @@ task :release do
|
|
115
118
|
end
|
116
119
|
end.call
|
117
120
|
|
118
|
-
|
121
|
+
|
119
122
|
# Prepare release announcement email.
|
120
123
|
lambda do
|
121
124
|
changes = File.read("_release/#{spec.version}/CHANGES")[/.*?\n(.*)/m, 1]
|
data/rakelib/rspec.rake
CHANGED
@@ -18,34 +18,53 @@ begin
|
|
18
18
|
require 'spec/rake/spectask'
|
19
19
|
directory '_reports'
|
20
20
|
|
21
|
+
def default_spec_opts
|
22
|
+
default = %w{--format failing_examples:failed --format html:_reports/specs.html --backtrace}
|
23
|
+
default << '--colour' if $stdout.isatty
|
24
|
+
default
|
25
|
+
end
|
26
|
+
|
21
27
|
desc "Run all specs"
|
22
|
-
Spec::Rake::SpecTask.new :spec=>'_reports' do |task|
|
28
|
+
Spec::Rake::SpecTask.new :spec=>['_reports', :compile] do |task|
|
29
|
+
ENV['USE_FSC'] = 'no'
|
23
30
|
task.spec_files = FileList['spec/**/*_spec.rb']
|
24
31
|
task.spec_files.exclude('spec/groovy/*') if RUBY_PLATFORM[/java/]
|
25
|
-
task.spec_opts =
|
26
|
-
task.spec_opts << '--
|
32
|
+
task.spec_opts = default_spec_opts
|
33
|
+
task.spec_opts << '--format specdoc'
|
27
34
|
end
|
28
35
|
file('_reports/specs.html') { task(:spec).invoke }
|
29
36
|
|
30
37
|
desc 'Run all failed examples from previous run'
|
31
38
|
Spec::Rake::SpecTask.new :failed do |task|
|
39
|
+
ENV['USE_FSC'] = 'no'
|
32
40
|
task.spec_files = FileList['spec/**/*_spec.rb']
|
33
|
-
task.spec_opts =
|
34
|
-
task.spec_opts << '--
|
41
|
+
task.spec_opts = default_spec_opts
|
42
|
+
task.spec_opts << '--format specdoc' << '--example failed'
|
35
43
|
end
|
36
44
|
|
37
45
|
desc 'Run RSpec and generate Spec and coverage reports (slow)'
|
38
|
-
Spec::Rake::SpecTask.new :coverage=>'_reports' do |task|
|
46
|
+
Spec::Rake::SpecTask.new :coverage=>['_reports', :compile] do |task|
|
47
|
+
ENV['USE_FSC'] = 'no'
|
39
48
|
task.spec_files = FileList['spec/**/*_spec.rb']
|
40
|
-
task.spec_opts =
|
41
|
-
task.spec_opts << '--
|
49
|
+
task.spec_opts = default_spec_opts
|
50
|
+
task.spec_opts << '--format progress'
|
42
51
|
task.rcov = true
|
43
52
|
task.rcov_dir = '_reports/coverage'
|
44
53
|
task.rcov_opts = %w{--exclude / --include-file ^lib --text-summary}
|
45
54
|
end
|
46
55
|
file('_reports/coverage') { task(:coverage).invoke }
|
47
56
|
|
48
|
-
|
57
|
+
task :load_ci_reporter do
|
58
|
+
gem 'ci_reporter'
|
59
|
+
ENV['CI_REPORTS'] = '_reports/ci'
|
60
|
+
# CI_Reporter does not quote the path to rspec_loader which causes problems when ruby is installed in C:/Program Files
|
61
|
+
ci_rep_path = Gem.loaded_specs['ci_reporter'].full_gem_path
|
62
|
+
ENV["SPEC_OPTS"] = [ENV["SPEC_OPTS"], default_spec_opts, "--require", "\"#{ci_rep_path}/lib/ci/reporter/rake/rspec_loader.rb\"", "--format", "CI::Reporter::RSpec"].join(" ")
|
63
|
+
end
|
64
|
+
|
65
|
+
desc 'Run all specs with CI reporter'
|
66
|
+
task :ci=>[:load_ci_reporter, :spec]
|
67
|
+
|
49
68
|
# Useful for testing with JRuby when using Ruby and vice versa.
|
50
69
|
namespace :spec do
|
51
70
|
desc "Run all specs specifically with Ruby"
|
data/rakelib/setup.rake
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
require 'jruby' if RUBY_PLATFORM[/java/]
|
18
18
|
require 'rubygems/source_info_cache'
|
19
19
|
|
20
|
-
RAKE_SUDO = case (ENV['RAKE_SUDO'] or '
|
20
|
+
RAKE_SUDO = case (ENV['RAKE_SUDO'] or 'false').strip.downcase
|
21
21
|
when 'yes', 'true'
|
22
22
|
true
|
23
23
|
else
|
@@ -35,7 +35,14 @@ def install_gem(name, options = {})
|
|
35
35
|
args = []
|
36
36
|
args << 'sudo' << 'env' << "JAVA_HOME=#{ENV['JAVA_HOME']}" if sudo_needed? and RAKE_SUDO
|
37
37
|
args << rb_bin << '-S' << 'gem' << 'install' << name
|
38
|
-
|
38
|
+
|
39
|
+
if (spec.respond_to? :requirement)
|
40
|
+
args << '--version' << dep.requirement.to_s
|
41
|
+
else
|
42
|
+
# Dependency.version_requirements deprecated in rubygems 1.3.6
|
43
|
+
args << '--version' << dep.version_requirements.to_s
|
44
|
+
end
|
45
|
+
|
39
46
|
args << '--source' << options[:source] if options[:source]
|
40
47
|
args << '--source' << 'http://gems.rubyforge.org'
|
41
48
|
args << '--install-dir' << ENV['GEM_HOME'] if ENV['GEM_HOME']
|
@@ -49,6 +56,11 @@ desc "If you're building from sources, run this task first to setup the necessar
|
|
49
56
|
task :setup do
|
50
57
|
missing = spec.dependencies.select { |dep| Gem::SourceIndex.from_installed_gems.search(dep).empty? }
|
51
58
|
missing.each do |dep|
|
52
|
-
|
59
|
+
if (spec.respond_to? :requirement)
|
60
|
+
install_gem dep.name, :version=>dep.requirement
|
61
|
+
else
|
62
|
+
# Dependency.version_requirements deprecated in rubygems 1.3.6
|
63
|
+
install_gem dep.name, :version=>dep.version_requirements
|
64
|
+
end
|
53
65
|
end
|
54
66
|
end
|
data/rakelib/stage.rake
CHANGED
@@ -23,6 +23,7 @@ rescue LoadError
|
|
23
23
|
task(:setup) { install_gem 'rubyforge' }
|
24
24
|
end
|
25
25
|
|
26
|
+
gpg_cmd = 'gpg2'
|
26
27
|
|
27
28
|
task :prepare do |task, args|
|
28
29
|
# Make sure we're doing a release from checked code.
|
@@ -47,7 +48,12 @@ task :prepare do |task, args|
|
|
47
48
|
# Need GPG to sign the packages.
|
48
49
|
lambda do
|
49
50
|
args.gpg or fail "Please run with gpg=<argument for gpg --local-user>"
|
50
|
-
|
51
|
+
gpg_ok = `gpg2 --list-keys #{args.gpg}`
|
52
|
+
if !$?.success?
|
53
|
+
gpg_ok = `gpg --list-keys #{args.gpg}`
|
54
|
+
gpg_cmd = 'gpg'
|
55
|
+
end
|
56
|
+
fail "No GPG user #{args.gpg}" if gpg_ok.empty?
|
51
57
|
end.call
|
52
58
|
|
53
59
|
task(:license).invoke
|
@@ -62,11 +68,18 @@ task :prepare do |task, args|
|
|
62
68
|
puts "[X] We have JRuby, Scala and Groovy"
|
63
69
|
end.call
|
64
70
|
|
71
|
+
# Need Prince to generate PDF
|
72
|
+
lambda do
|
73
|
+
puts "Checking that we have prince available ... "
|
74
|
+
sh 'prince --version'
|
75
|
+
puts "[X] We have prince available"
|
76
|
+
end.call
|
77
|
+
|
65
78
|
# Need RubyForge to upload new release files.
|
66
79
|
lambda do
|
67
80
|
puts "[!] Make sure you have admin privileges to make a release on RubyForge"
|
68
81
|
rubyforge = RubyForge.new.configure
|
69
|
-
rubyforge.login
|
82
|
+
rubyforge.login
|
70
83
|
rubyforge.scrape_project(spec.name)
|
71
84
|
end.call
|
72
85
|
|
@@ -99,14 +112,14 @@ task :stage=>['setup', 'doc:setup', :clobber, :prepare] do |task, args|
|
|
99
112
|
task(:package).invoke
|
100
113
|
mkpath '_staged/dist'
|
101
114
|
FileList['pkg/*.{gem,zip,tgz}'].each do |source|
|
102
|
-
pkg = source.pathmap('_staged/dist/%n%x')
|
115
|
+
pkg = source.pathmap('_staged/dist/%n%x')
|
103
116
|
cp source, pkg
|
104
117
|
bytes = File.open(pkg, 'rb') { |file| file.read }
|
105
118
|
File.open(pkg + '.md5', 'w') { |file| file.write Digest::MD5.hexdigest(bytes) << ' ' << File.basename(pkg) }
|
106
119
|
File.open(pkg + '.sha1', 'w') { |file| file.write Digest::SHA1.hexdigest(bytes) << ' ' << File.basename(pkg) }
|
107
|
-
sh
|
120
|
+
sh gpg_cmd, '--local-user', args.gpg, '--armor', '--output', pkg + '.asc', '--detach-sig', pkg, :verbose=>true
|
108
121
|
end
|
109
|
-
cp 'etc/KEYS', '_staged'
|
122
|
+
cp 'etc/KEYS', '_staged/dist'
|
110
123
|
puts "[X] Created and signed release packages in _staged/dist"
|
111
124
|
end.call
|
112
125
|
|
@@ -114,10 +127,11 @@ task :stage=>['setup', 'doc:setup', :clobber, :prepare] do |task, args|
|
|
114
127
|
# want to do that before generating the site/documentation.
|
115
128
|
lambda do
|
116
129
|
puts "Updating download page with links to release packages ... "
|
117
|
-
|
130
|
+
mirror = "http://www.apache.org/dyn/closer.cgi/#{spec.name}/#{spec.version}"
|
131
|
+
official = "http://www.apache.org/dist/#{spec.name}/#{spec.version}"
|
118
132
|
rows = FileList['_staged/dist/*.{gem,tgz,zip}'].map { |pkg|
|
119
133
|
name, md5 = File.basename(pkg), Digest::MD5.file(pkg).to_s
|
120
|
-
%{| "#{name}":#{
|
134
|
+
%{| "#{name}":#{mirror}/#{name} | "#{md5}":#{official}/#{name}.md5 | "Sig":#{official}/#{name}.asc |}
|
121
135
|
}
|
122
136
|
textile = <<-TEXTILE
|
123
137
|
h3. #{spec.name} #{spec.version} (#{Time.now.strftime('%Y-%m-%d')})
|
@@ -125,7 +139,7 @@ h3. #{spec.name} #{spec.version} (#{Time.now.strftime('%Y-%m-%d')})
|
|
125
139
|
|_. Package |_. MD5 Checksum |_. PGP |
|
126
140
|
#{rows.join("\n")}
|
127
141
|
|
128
|
-
p>. ("Release signing keys":#{
|
142
|
+
p>. ("Release signing keys":#{official}/KEYS)
|
129
143
|
TEXTILE
|
130
144
|
file_name = 'doc/download.textile'
|
131
145
|
print "Adding download links to #{file_name} ... "
|
@@ -154,7 +168,7 @@ p>. ("Release signing keys":#{url}/KEYS)
|
|
154
168
|
sh 'rsync', '--progress', '--recursive', '_staged/', url
|
155
169
|
puts "[X] Uploaded _staged directory to #{url}"
|
156
170
|
end.call
|
157
|
-
|
171
|
+
|
158
172
|
|
159
173
|
# Prepare a release vote email. In the distant future this will also send the
|
160
174
|
# email for you and vote on it.
|
@@ -42,6 +42,9 @@ CONTROL
|
|
42
42
|
Buildr::write "control2", ""
|
43
43
|
Buildr::write "postinst", ""
|
44
44
|
Buildr::write "prerm", ""
|
45
|
+
Buildr::write "postinst2", <<-POSTINST2
|
46
|
+
bash generate_code(#\{MY_CUSTOM_VALUE\})
|
47
|
+
POSTINST2
|
45
48
|
end
|
46
49
|
|
47
50
|
it "should throw an error if no control file is given" do
|
@@ -51,7 +54,7 @@ CONTROL
|
|
51
54
|
project.package(:deb).postinst = _("postinst")
|
52
55
|
project.package(:deb).prerm = _("prerm")
|
53
56
|
end
|
54
|
-
lambda { project("foo").package(:deb).invoke }.should raise_error(/no control file was defined when packaging
|
57
|
+
lambda { project("foo").package(:deb).invoke }.should raise_error(/no control file was defined when packaging as a deb file/)
|
55
58
|
end
|
56
59
|
|
57
60
|
it "should raise an exception if the control is incorrectly formatted" do
|
@@ -62,7 +65,6 @@ CONTROL
|
|
62
65
|
project.package(:deb).prerm = _("prerm")
|
63
66
|
end
|
64
67
|
lambda { project("foo").package(:deb).invoke }.should raise_error(/dpkg failed with this error:/)
|
65
|
-
File.exists?("target/foo-1.0.deb").should be_false
|
66
68
|
end
|
67
69
|
|
68
70
|
it "should give a project the ability to package as deb" do
|
@@ -86,8 +88,9 @@ CONTROL
|
|
86
88
|
project.package(:deb).postinst = _("postinst")
|
87
89
|
project.package(:deb).prerm = _("prerm")
|
88
90
|
project.package(:deb).include("blah.class", :path => "lib")
|
89
|
-
project.package(:deb).include("folder", :as => "otherlib")
|
91
|
+
project.package(:deb).include("folder", :as => "otherlib/")
|
90
92
|
end
|
93
|
+
project("foo").package(:deb).invoke
|
91
94
|
lambda { project("foo").package(:deb).invoke }.should_not raise_error
|
92
95
|
File.exists?("target/foo-1.0.deb").should be_true
|
93
96
|
#check the contents of the deb file:
|
@@ -111,4 +114,35 @@ CONTROL
|
|
111
114
|
project("foo").package(:deb, :file => "bar-1.0.deb").invoke
|
112
115
|
File.exists?("bar-1.0.deb").should be_true
|
113
116
|
end
|
117
|
+
|
118
|
+
it 'should change the version in the control file' do
|
119
|
+
write_files
|
120
|
+
define("foo", :version => "2.0") do
|
121
|
+
project.package(:deb).tap do |deb|
|
122
|
+
deb.control = _("control")
|
123
|
+
deb.postinst = _("postinst")
|
124
|
+
deb.prerm = _("prerm")
|
125
|
+
end
|
126
|
+
end
|
127
|
+
project("foo").package(:deb).invoke
|
128
|
+
File.exists?( project("foo").package(:deb).to_s).should be_true
|
129
|
+
File.exists?("target/foo-2.0.deb-contents/DEBIAN/control").should be_true
|
130
|
+
File.read("target/foo-2.0.deb-contents/DEBIAN/control").should match /^Version: 2.0$/
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should evaluate the contents of the file" do
|
134
|
+
write_files
|
135
|
+
define("foo", :version => "2.0") do
|
136
|
+
project.package(:deb).tap do |deb|
|
137
|
+
deb.control = _("control")
|
138
|
+
deb.postinst = _("postinst2")
|
139
|
+
deb.prerm = _("prerm")
|
140
|
+
end
|
141
|
+
end
|
142
|
+
MY_CUSTOM_VALUE = "custom"
|
143
|
+
project("foo").package(:deb).invoke
|
144
|
+
File.exists?( project("foo").package(:deb).to_s).should be_true
|
145
|
+
File.exists?("target/foo-2.0.deb-contents/DEBIAN/postinst").should be_true
|
146
|
+
File.read("target/foo-2.0.deb-contents/DEBIAN/postinst").should match MY_CUSTOM_VALUE
|
147
|
+
end
|
114
148
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: buildrdeb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
|
+
- 1
|
7
8
|
- 0
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.3
|
10
|
+
version: 1.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Antoine Toulme
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-09-
|
18
|
+
date: 2010-09-25 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -34,9 +34,10 @@ extra_rdoc_files:
|
|
34
34
|
files:
|
35
35
|
- lib/buildrdeb/package.rb
|
36
36
|
- lib/buildrdeb.rb
|
37
|
+
- rakelib/all-in-one.rake
|
37
38
|
- rakelib/checks.rake
|
38
39
|
- rakelib/doc.rake
|
39
|
-
- rakelib/
|
40
|
+
- rakelib/metrics.rake
|
40
41
|
- rakelib/package.rake
|
41
42
|
- rakelib/release.rake
|
42
43
|
- rakelib/rspec.rake
|
data/rakelib/jekylltask.rb
DELETED
@@ -1,120 +0,0 @@
|
|
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
|
-
|
17
|
-
gem 'mojombo-jekyll', '~> 0.5.2' # skip past some buggy versions
|
18
|
-
require 'rake/tasklib'
|
19
|
-
require 'jekyll'
|
20
|
-
|
21
|
-
|
22
|
-
class JekyllTask < Rake::TaskLib
|
23
|
-
def initialize(name=:jekyll) # :yield: self
|
24
|
-
@name = name
|
25
|
-
@source = name
|
26
|
-
@target = name
|
27
|
-
yield self if block_given?
|
28
|
-
task name, :auto, :needs=>[@source] do |task, args|
|
29
|
-
generate args.auto
|
30
|
-
end
|
31
|
-
if @source != @target
|
32
|
-
file @target=>FileList["#{@source}/**/*"] do
|
33
|
-
generate
|
34
|
-
end
|
35
|
-
task 'clobber' do
|
36
|
-
rm_rf @target
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
attr_accessor :source
|
42
|
-
attr_accessor :target
|
43
|
-
|
44
|
-
def generate(auto = false)
|
45
|
-
options = { 'source'=>source, 'destination'=>target }
|
46
|
-
options = Jekyll.configuration(options)
|
47
|
-
site = Jekyll::Site.new(options)
|
48
|
-
|
49
|
-
if auto
|
50
|
-
require 'directory_watcher'
|
51
|
-
puts "Auto generating: just edit a page and save, watch the console to see when we're done regenerating pages"
|
52
|
-
dw = DirectoryWatcher.new(source)
|
53
|
-
dw.interval = 1
|
54
|
-
dw.glob = Dir.chdir(source) do
|
55
|
-
dirs = Dir['*'].select { |x| File.directory?(x) }
|
56
|
-
dirs -= [target]
|
57
|
-
dirs = dirs.map { |x| "#{x}/**/*" }
|
58
|
-
dirs += ['*']
|
59
|
-
end
|
60
|
-
dw.start
|
61
|
-
dw.add_observer do |*args|
|
62
|
-
t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
|
63
|
-
puts "[#{t}] regeneration: #{args.size} files changed"
|
64
|
-
site.process
|
65
|
-
puts "Done"
|
66
|
-
end
|
67
|
-
loop { sleep 1 }
|
68
|
-
else
|
69
|
-
puts "Generating documentation in #{target}"
|
70
|
-
site.process
|
71
|
-
touch target
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
|
-
module TocFilter
|
78
|
-
def toc(input)
|
79
|
-
input.scan(/<(h2)(?:>|\s+(.*?)>)([^<]*)<\/\1\s*>/mi).inject(%{<ol class="toc">}) { |toc, entry|
|
80
|
-
id = entry[1][/^id=(['"])(.*)\1$/, 2]
|
81
|
-
title = entry[2].gsub(/<(\w*).*?>(.*?)<\/\1\s*>/m, '\2').strip
|
82
|
-
toc << %{<li><a href="##{id}">#{title}</a></li>}
|
83
|
-
} << "</ol>"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
Liquid::Template.register_filter(TocFilter)
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
# Under Ruby 1.9 [a,b,c].to_s doesn't join the array first. (Jekyll 0.5.2 requires this)
|
91
|
-
module Jekyll
|
92
|
-
class HighlightBlock < Liquid::Block
|
93
|
-
def render(context)
|
94
|
-
if context.registers[:site].pygments
|
95
|
-
render_pygments(context, super.join)
|
96
|
-
else
|
97
|
-
render_codehighlighter(context, super.join)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
# Ruby 1.9 has sane closure scoping which manages to mess Liquid filters. (Liquid 2.0.0 requires this)
|
104
|
-
module Liquid
|
105
|
-
class Variable
|
106
|
-
def render(context)
|
107
|
-
return '' if @name.nil?
|
108
|
-
@filters.inject(context[@name]) do |output, filter|
|
109
|
-
filterargs = filter[1].to_a.collect do |a|
|
110
|
-
context[a]
|
111
|
-
end
|
112
|
-
begin
|
113
|
-
context.invoke(filter[0], output, *filterargs)
|
114
|
-
rescue FilterNotFound
|
115
|
-
raise FilterNotFound, "Error - filter '#{filter[0]}' in '#{@markup.strip}' could not be found."
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|