packaging 0.99.0

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.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +17 -0
  3. data/README-Solaris.md +117 -0
  4. data/README.md +1031 -0
  5. data/lib/packaging.rb +32 -0
  6. data/lib/packaging/artifactory.rb +278 -0
  7. data/lib/packaging/config.rb +392 -0
  8. data/lib/packaging/config/params.rb +366 -0
  9. data/lib/packaging/deb.rb +28 -0
  10. data/lib/packaging/deb/repo.rb +263 -0
  11. data/lib/packaging/gem.rb +112 -0
  12. data/lib/packaging/ips.rb +57 -0
  13. data/lib/packaging/msi.rb +89 -0
  14. data/lib/packaging/nuget.rb +39 -0
  15. data/lib/packaging/osx.rb +36 -0
  16. data/lib/packaging/paths.rb +238 -0
  17. data/lib/packaging/platforms.rb +480 -0
  18. data/lib/packaging/repo.rb +55 -0
  19. data/lib/packaging/retrieve.rb +46 -0
  20. data/lib/packaging/rpm.rb +5 -0
  21. data/lib/packaging/rpm/repo.rb +257 -0
  22. data/lib/packaging/tar.rb +154 -0
  23. data/lib/packaging/util.rb +146 -0
  24. data/lib/packaging/util/date.rb +15 -0
  25. data/lib/packaging/util/execution.rb +85 -0
  26. data/lib/packaging/util/file.rb +125 -0
  27. data/lib/packaging/util/git.rb +174 -0
  28. data/lib/packaging/util/git_tags.rb +73 -0
  29. data/lib/packaging/util/gpg.rb +62 -0
  30. data/lib/packaging/util/jenkins.rb +95 -0
  31. data/lib/packaging/util/misc.rb +69 -0
  32. data/lib/packaging/util/net.rb +368 -0
  33. data/lib/packaging/util/os.rb +17 -0
  34. data/lib/packaging/util/platform.rb +40 -0
  35. data/lib/packaging/util/rake_utils.rb +111 -0
  36. data/lib/packaging/util/serialization.rb +19 -0
  37. data/lib/packaging/util/ship.rb +171 -0
  38. data/lib/packaging/util/tool.rb +41 -0
  39. data/lib/packaging/util/version.rb +326 -0
  40. data/spec/fixtures/config/ext/build_defaults.yaml +2 -0
  41. data/spec/fixtures/config/ext/project_data.yaml +2 -0
  42. data/spec/fixtures/config/params.yaml +2 -0
  43. data/spec/fixtures/configs/components/test_file.json +1 -0
  44. data/spec/fixtures/configs/components/test_file_2.json +0 -0
  45. data/spec/fixtures/configs/components/test_file_not_tagged.json +1 -0
  46. data/spec/fixtures/configs/components/test_file_wrong_ext.txt +0 -0
  47. data/spec/fixtures/configs/components/test_file_wrong_ext.wrong +0 -0
  48. data/spec/fixtures/util/pre_tasks.yaml +4 -0
  49. data/spec/lib/packaging/artifactory_spec.rb +171 -0
  50. data/spec/lib/packaging/config_spec.rb +556 -0
  51. data/spec/lib/packaging/deb/repo_spec.rb +148 -0
  52. data/spec/lib/packaging/deb_spec.rb +52 -0
  53. data/spec/lib/packaging/paths_spec.rb +153 -0
  54. data/spec/lib/packaging/platforms_spec.rb +153 -0
  55. data/spec/lib/packaging/repo_spec.rb +97 -0
  56. data/spec/lib/packaging/retrieve_spec.rb +61 -0
  57. data/spec/lib/packaging/rpm/repo_spec.rb +133 -0
  58. data/spec/lib/packaging/tar_spec.rb +122 -0
  59. data/spec/lib/packaging/util/execution_spec.rb +56 -0
  60. data/spec/lib/packaging/util/file_spec.rb +139 -0
  61. data/spec/lib/packaging/util/git_spec.rb +160 -0
  62. data/spec/lib/packaging/util/git_tag_spec.rb +36 -0
  63. data/spec/lib/packaging/util/gpg_spec.rb +64 -0
  64. data/spec/lib/packaging/util/jenkins_spec.rb +112 -0
  65. data/spec/lib/packaging/util/misc_spec.rb +31 -0
  66. data/spec/lib/packaging/util/net_spec.rb +239 -0
  67. data/spec/lib/packaging/util/os_spec.rb +31 -0
  68. data/spec/lib/packaging/util/rake_utils_spec.rb +70 -0
  69. data/spec/lib/packaging/util/ship_spec.rb +117 -0
  70. data/spec/lib/packaging/util/version_spec.rb +123 -0
  71. data/spec/lib/packaging_spec.rb +19 -0
  72. data/spec/spec_helper.rb +36 -0
  73. data/static_artifacts/PackageInfo.plist +3 -0
  74. data/tasks/00_utils.rake +216 -0
  75. data/tasks/30_metrics.rake +33 -0
  76. data/tasks/apple.rake +266 -0
  77. data/tasks/build.rake +12 -0
  78. data/tasks/clean.rake +5 -0
  79. data/tasks/config.rake +30 -0
  80. data/tasks/deb.rake +129 -0
  81. data/tasks/deb_repos.rake +28 -0
  82. data/tasks/deprecated.rake +130 -0
  83. data/tasks/doc.rake +20 -0
  84. data/tasks/education.rake +57 -0
  85. data/tasks/fetch.rake +57 -0
  86. data/tasks/gem.rake +146 -0
  87. data/tasks/jenkins.rake +494 -0
  88. data/tasks/jenkins_dynamic.rake +202 -0
  89. data/tasks/load_extras.rake +21 -0
  90. data/tasks/mock.rake +348 -0
  91. data/tasks/nightly_repos.rake +335 -0
  92. data/tasks/pe_deb.rake +12 -0
  93. data/tasks/pe_rpm.rake +13 -0
  94. data/tasks/pe_ship.rake +221 -0
  95. data/tasks/pe_sign.rake +13 -0
  96. data/tasks/pe_tar.rake +5 -0
  97. data/tasks/retrieve.rake +45 -0
  98. data/tasks/rpm.rake +66 -0
  99. data/tasks/rpm_repos.rake +29 -0
  100. data/tasks/ship.rake +752 -0
  101. data/tasks/sign.rake +226 -0
  102. data/tasks/tag.rake +8 -0
  103. data/tasks/tar.rake +34 -0
  104. data/tasks/update.rake +16 -0
  105. data/tasks/vanagon.rake +35 -0
  106. data/tasks/vendor_gems.rake +117 -0
  107. data/tasks/version.rake +33 -0
  108. data/tasks/z_data_dump.rake +65 -0
  109. data/templates/README +1 -0
  110. data/templates/downstream.xml.erb +47 -0
  111. data/templates/msi.xml.erb +197 -0
  112. data/templates/packaging.xml.erb +344 -0
  113. data/templates/repo.xml.erb +114 -0
  114. metadata +234 -0
@@ -0,0 +1,226 @@
1
+ def sign_rpm(rpm, sign_flags = nil)
2
+
3
+ # To enable support for wrappers around rpm and thus support for gpg-agent
4
+ # rpm signing, we have to be able to tell the packaging repo what binary to
5
+ # use as the rpm signing tool.
6
+ #
7
+ rpm_cmd = ENV['RPM'] || Pkg::Util::Tool.find_tool('rpm')
8
+
9
+ # If we're using the gpg agent for rpm signing, we don't want to specify the
10
+ # input for the passphrase, which is what '--passphrase-fd 3' does. However,
11
+ # if we're not using the gpg agent, this is required, and is part of the
12
+ # defaults on modern rpm. The fun part of gpg-agent signing of rpms is
13
+ # specifying that the gpg check command always return true
14
+ #
15
+ if Pkg::Util.boolean_value(ENV['RPM_GPG_AGENT'])
16
+ gpg_check_cmd = "--define '%__gpg_check_password_cmd /bin/true'"
17
+ else
18
+ input_flag = "--passphrase-fd 3"
19
+ end
20
+
21
+ # Try this up to 5 times, to allow for incorrect passwords
22
+ Pkg::Util::Execution.retry_on_fail(:times => 5) do
23
+ # This definition of %__gpg_sign_cmd is the default on modern rpm. We
24
+ # accept extra flags to override certain signing behavior for older
25
+ # versions of rpm, e.g. specifying V3 signatures instead of V4.
26
+ #
27
+ sh "#{rpm_cmd} #{gpg_check_cmd} --define '%_gpg_name #{Pkg::Util::Gpg.key}' --define '%__gpg_sign_cmd %{__gpg} gpg #{sign_flags} #{input_flag} --batch --no-verbose --no-armor --no-secmem-warning -u %{_gpg_name} -sbo %{__signature_filename} %{__plaintext_filename}' --addsign #{rpm}"
28
+ end
29
+
30
+ end
31
+
32
+ def sign_legacy_rpm(rpm)
33
+ sign_rpm(rpm, "--force-v3-sigs --digest-algo=sha1")
34
+ end
35
+
36
+ def rpm_has_sig(rpm)
37
+ %x(rpm -Kv #{rpm} | grep "#{Pkg::Util::Gpg.key.downcase}" &> /dev/null)
38
+ $?.success?
39
+ end
40
+
41
+ def sign_deb_changes(file)
42
+ # Lazy lazy lazy lazy lazy
43
+ sign_program = "-p'gpg --use-agent --no-tty'" if ENV['RPM_GPG_AGENT']
44
+ sh "debsign #{sign_program} --re-sign -k#{Pkg::Config.gpg_key} #{file}"
45
+ end
46
+
47
+ namespace :pl do
48
+ desc "Sign the tarball, defaults to PL key, pass GPG_KEY to override or edit build_defaults"
49
+ task :sign_tar do
50
+ unless Pkg::Config.vanagon_project
51
+ File.exist?("pkg/#{Pkg::Config.project}-#{Pkg::Config.version}.tar.gz") or fail "No tarball exists. Try rake package:tar?"
52
+ Pkg::Util::Gpg.load_keychain if Pkg::Util::Tool.find_tool('keychain')
53
+ Pkg::Util::Gpg.sign_file "pkg/#{Pkg::Config.project}-#{Pkg::Config.version}.tar.gz"
54
+ end
55
+ end
56
+
57
+ desc "Sign the Arista EOS swix packages, defaults to PL key, pass GPG_KEY to override or edit build_defaults"
58
+ task :sign_swix do
59
+ packages = Dir["pkg/**/*.swix"]
60
+ unless packages.empty?
61
+ Pkg::Util::Gpg.load_keychain if Pkg::Util::Tool.find_tool('keychain')
62
+ packages.each do |swix_package|
63
+ Pkg::Util::Gpg.sign_file swix_package
64
+ end
65
+ end
66
+ end
67
+
68
+ desc "Detach sign any solaris svr4 packages"
69
+ task :sign_svr4 do
70
+ unless Dir["pkg/**/*.pkg.gz"].empty?
71
+ Pkg::Util::Gpg.load_keychain if Pkg::Util::Tool.find_tool('keychain')
72
+ Dir["pkg/**/*.pkg.gz"].each do |pkg|
73
+ Pkg::Util::Gpg.sign_file pkg
74
+ end
75
+ end
76
+ end
77
+
78
+ desc "Sign mocked rpms, Defaults to PL Key, pass GPG_KEY to override"
79
+ task :sign_rpms, :root_dir do |t, args|
80
+ rpm_dir = args.root_dir || "pkg"
81
+
82
+ all_rpms = Dir["#{rpm_dir}/**/*.rpm"]
83
+
84
+ v3_rpms = []
85
+ v4_rpms = []
86
+ all_rpms.each do |rpm|
87
+ platform_tag = Pkg::Paths.tag_from_artifact_path(rpm)
88
+ platform, version, _ = Pkg::Platforms.parse_platform_tag(platform_tag)
89
+
90
+ # We don't sign AIX rpms
91
+ next if platform_tag.include?('aix')
92
+
93
+ sig_type = Pkg::Platforms.signature_format_for_platform_version(platform, version)
94
+ case sig_type
95
+ when 'v3'
96
+ v3_rpms << rpm
97
+ when 'v4'
98
+ v4_rpms << rpm
99
+ else
100
+ fail "Cannot find signature type for package '#{rpm}'"
101
+ end
102
+ end
103
+
104
+ unless v3_rpms.empty?
105
+ puts "Signing old rpms..."
106
+ sign_legacy_rpm(v3_rpms.join(' '))
107
+ end
108
+
109
+ unless v4_rpms.empty?
110
+ puts "Signing modern rpms..."
111
+ sign_rpm(v4_rpms.join(' '))
112
+ end
113
+
114
+ # Now we hardlink them back in
115
+ Dir["#{rpm_dir}/**/*.noarch.rpm"].each do |rpm|
116
+ platform_tag = Pkg::Paths.tag_from_artifact_path(rpm)
117
+ platform, version, _ = Pkg::Platforms.parse_platform_tag(platform_tag)
118
+ supported_arches = Pkg::Platforms.arches_for_platform_version(platform, version)
119
+ cd File.dirname(rpm) do
120
+ noarch_rpm = File.basename(rpm)
121
+ supported_arches.each do |arch|
122
+ arch_dir = File.join('..', arch)
123
+ FileUtils.mkdir_p(arch_dir)
124
+ unless File.exist?(File.join(arch_dir, noarch_rpm))
125
+ FileUtils.ln(noarch_rpm, arch_dir, :force => true, :verbose => true)
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
131
+
132
+ desc "Sign ips package, uses PL certificates by default, update privatekey_pem, certificate_pem, and ips_inter_cert in build_defaults.yaml to override."
133
+ task :sign_ips do
134
+ Pkg::IPS.sign unless Dir['pkg/**/*.p5p'].empty?
135
+ end
136
+
137
+ if Pkg::Config.build_gem
138
+ desc "Sign built gems, defaults to PL key, pass GPG_KEY to override or edit build_defaults"
139
+ task :sign_gem do
140
+ FileList["pkg/#{Pkg::Config.gem_name}-#{Pkg::Config.gemversion}*.gem"].each do |gem|
141
+ puts "signing gem #{gem}"
142
+ Pkg::Util::Gpg.sign_file(gem)
143
+ end
144
+ end
145
+ end
146
+
147
+ desc "Check if all rpms are signed"
148
+ task :check_rpm_sigs do
149
+ signed = TRUE
150
+ rpms = Dir["pkg/**/*.rpm"]
151
+ print 'Checking rpm signatures'
152
+ rpms.each do |rpm|
153
+ if rpm_has_sig rpm
154
+ print '.'
155
+ else
156
+ puts "#{rpm} is unsigned."
157
+ signed = FALSE
158
+ end
159
+ end
160
+ fail unless signed
161
+ puts "All rpms signed"
162
+ end
163
+
164
+ desc "Sign generated debian changes files. Defaults to PL Key, pass GPG_KEY to override"
165
+ task :sign_deb_changes do
166
+ begin
167
+ change_files = Dir["pkg/**/*.changes"]
168
+ unless change_files.empty?
169
+ Pkg::Util::Gpg.load_keychain if Pkg::Util::Tool.find_tool('keychain')
170
+ sign_deb_changes("pkg/**/*.changes")
171
+ end
172
+ ensure
173
+ Pkg::Util::Gpg.kill_keychain
174
+ end
175
+ end
176
+
177
+ desc "Sign OSX packages"
178
+ task :sign_osx => "pl:fetch" do
179
+ Pkg::OSX.sign unless Dir['pkg/**/*.dmg'].empty?
180
+ end
181
+
182
+ desc "Sign MSI packages"
183
+ task :sign_msi => "pl:fetch" do
184
+ Pkg::MSI.sign unless Dir['pkg/**/*.msi'].empty?
185
+ end
186
+
187
+ ##
188
+ # This crazy piece of work establishes a remote repo on the distribution
189
+ # server, ships our packages out to it, signs them, and brings them back.
190
+ #
191
+ namespace :jenkins do
192
+ desc "Sign all locally staged packages on #{Pkg::Config.signing_server}"
193
+ task :sign_all => "pl:fetch" do
194
+ Dir["pkg/*"].empty? and fail "There were files found in pkg/. Maybe you wanted to build/retrieve something first?"
195
+
196
+ # Because rpms and debs are laid out differently in PE under pkg/ they
197
+ # have a different sign task to address this. Rather than create a whole
198
+ # extra :jenkins task for signing PE, we determine which sign task to use
199
+ # based on if we're building PE.
200
+ # We also listen in on the environment variable SIGNING_BUNDLE. This is
201
+ # _NOT_ intended for public use, but rather with the internal promotion
202
+ # workflow for Puppet Enterprise. SIGNING_BUNDLE is the path to a tarball
203
+ # containing a git bundle to be used as the environment for the packaging
204
+ # repo in a signing operation.
205
+ signing_bundle = ENV['SIGNING_BUNDLE']
206
+ rpm_sign_task = Pkg::Config.build_pe ? "pe:sign_rpms" : "pl:sign_rpms"
207
+ deb_sign_task = Pkg::Config.build_pe ? "pe:sign_deb_changes" : "pl:sign_deb_changes"
208
+ sign_tasks = [rpm_sign_task, deb_sign_task]
209
+ sign_tasks << "pl:sign_tar" if Pkg::Config.build_tar
210
+ sign_tasks << "pl:sign_gem" if Pkg::Config.build_gem
211
+ sign_tasks << "pl:sign_osx" if Pkg::Config.build_dmg || Pkg::Config.vanagon_project
212
+ sign_tasks << "pl:sign_swix" if Pkg::Config.vanagon_project
213
+ sign_tasks << "pl:sign_svr4" if Pkg::Config.vanagon_project
214
+ sign_tasks << "pl:sign_ips" if Pkg::Config.vanagon_project
215
+ sign_tasks << "pl:sign_msi" if Pkg::Config.build_msi || Pkg::Config.vanagon_project
216
+ remote_repo = Pkg::Util::Net.remote_bootstrap(Pkg::Config.signing_server, 'HEAD', nil, signing_bundle)
217
+ build_params = Pkg::Util::Net.remote_buildparams(Pkg::Config.signing_server, Pkg::Config)
218
+ Pkg::Util::Net.rsync_to('pkg', Pkg::Config.signing_server, remote_repo)
219
+ Pkg::Util::Net.remote_ssh_cmd(Pkg::Config.signing_server, "cd #{remote_repo} ; rake #{sign_tasks.join(' ')} PARAMS_FILE=#{build_params}")
220
+ Pkg::Util::Net.rsync_from("#{remote_repo}/pkg/", Pkg::Config.signing_server, "pkg/")
221
+ Pkg::Util::Net.remote_ssh_cmd(Pkg::Config.signing_server, "rm -rf #{remote_repo}")
222
+ Pkg::Util::Net.remote_ssh_cmd(Pkg::Config.signing_server, "rm #{build_params}")
223
+ puts "Signed packages staged in 'pkg/ directory"
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,8 @@
1
+ namespace 'pl' do
2
+ desc "Tag this repository, requires a TAG, e.g. TAG=1.1.1"
3
+ task "tag" do
4
+ Pkg::Util.check_var('TAG', ENV['TAG'])
5
+ Pkg::Util::Git.tag(ENV['TAG'])
6
+ end
7
+ end
8
+
@@ -0,0 +1,34 @@
1
+ namespace :package do
2
+ desc "Create a source tar archive"
3
+ task :tar => [:clean] do
4
+
5
+ if Pkg::Config.pre_tar_task
6
+ Pkg::Util::RakeUtils.invoke_task(Pkg::Config.pre_tar_task)
7
+ end
8
+
9
+ Rake::Task["package:doc"].invoke if Pkg::Config.build_doc
10
+
11
+ tar = Pkg::Tar.new
12
+
13
+ # If the user has specified templates via config file, they will be ack'd
14
+ # by the tar class. Otherwise, we load what we consider to be the "default"
15
+ # set, which is default for historical purposes.
16
+ #
17
+ tar.templates ||= Dir[File.join(Pkg::Config.project_root, "ext", "**", "*.erb")].select { |i| i !~ /ext\/packaging|ext\/osx/ }
18
+
19
+
20
+ # If the user has specified things to exclude via config file, they will be
21
+ # honored by the tar class, but we also always exclude the packaging repo.
22
+ #
23
+ tar.excludes << "ext/packaging"
24
+
25
+ tar.pkg!
26
+
27
+ puts "Wrote #{`pwd`.strip}/pkg/#{Pkg::Config.project}-#{Pkg::Config.version}.tar.gz"
28
+ end
29
+ end
30
+
31
+ namespace :pl do
32
+ task :tar => ["package:tar"]
33
+ end
34
+
@@ -0,0 +1,16 @@
1
+ namespace :package do
2
+ desc "Update your clone of the packaging repo with `git pull`"
3
+ task :update do
4
+ cd 'ext/packaging' do
5
+ remote = Pkg::Config.packaging_url.split(' ')[0]
6
+ branch = Pkg::Config.packaging_url.split(' ')[1].split('=')[1]
7
+ if branch.nil? or remote.nil?
8
+ $stderr.puts "Couldn't parse the packaging repo URL from 'ext/build_defaults.yaml'."
9
+ $stderr.puts "Normally this is a string in the format git@github.com:<User>/<packaging_repo> --branch=<branch>"
10
+ else
11
+ Pkg::Util::Git.pull(remote, branch)
12
+ end
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,35 @@
1
+ namespace :vanagon do
2
+ # vanagon:check_tags is used to report the tagged status of vanagon components
3
+ # with "ref" fields indicated in their json files. This function does not create
4
+ # any barriers or stop execution, it's only a report
5
+ desc "Check for tagged components in vanagon projects"
6
+ task :check_tags do
7
+ # only available to vanagon projects
8
+ unless Pkg::Config.vanagon_project
9
+ puts "This is not a vanagon project"
10
+ return
11
+ end
12
+ puts "*" * (ENV["COLUMNS"] || 70).to_i
13
+ Pkg::Util.in_project_root do
14
+ Pkg::Util::File.files_with_ext("configs/components", ".json").each do |json_file|
15
+ json_data = Pkg::Util::Misc.load_from_json(json_file)
16
+ # Don't report on anything without a ref
17
+ if json_data["ref"].is_a?(String)
18
+ Pkg::Util::Version.report_json_tags(json_data)
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ # This is just a wrapper for uber_build that runs the check_tags report and
25
+ # pauses for input, mainly so we can manually check for tagged components
26
+ # before spending time on a build
27
+ desc "Run component tag reports, if the report is okay, run an uber_build"
28
+ task :build_all, [:poll_interval] do |t, args|
29
+ args.with_defaults(:poll_interval => 0)
30
+ Rake::Task["vanagon:check_tags"].invoke
31
+ puts "Does this look correct?"
32
+ return unless Pkg::Util.ask_yes_or_no
33
+ Rake::Task["pl:jenkins:uber_build"].invoke(args.poll_interval)
34
+ end
35
+ end
@@ -0,0 +1,117 @@
1
+ # This is an optional pre-tar-task, so we only want to present it if we're
2
+ # using it
3
+ if Pkg::Config.pre_tar_task
4
+ namespace :package do
5
+ desc "vendor gems required by project"
6
+ task :vendor_gems do
7
+ Pkg::Util::Tool.check_tool("bundle")
8
+ require 'bundler'
9
+
10
+ class UI
11
+ LEVELS = %w(silent error warn confirm info debug)
12
+
13
+ def warn(message, newline = nil)
14
+ puts message
15
+ end
16
+
17
+ def debug(message, newline = nil)
18
+ puts message
19
+ end
20
+
21
+ def trace(message, newline = nil)
22
+ puts message
23
+ end
24
+
25
+ def error(message, newline = nil)
26
+ puts message
27
+ end
28
+
29
+ def info(message, newline = nil)
30
+ puts message
31
+ end
32
+
33
+ def confirm(message, newline = nil)
34
+ end
35
+
36
+ def debug?
37
+ true
38
+ end
39
+
40
+ def ask(message)
41
+ end
42
+
43
+ def quiet?
44
+ false
45
+ end
46
+
47
+ def level=(level)
48
+ raise ArgumentError unless LEVELS.include?(level.to_s)
49
+ @level = level
50
+ end
51
+
52
+ def level(name = nil)
53
+ name ? LEVELS.index(name) <= LEVELS.index(@level) : @level
54
+ end
55
+
56
+ def silence
57
+ old_level, @level = @level, "silent"
58
+ yield
59
+ ensure
60
+ @level = old_level
61
+ end
62
+
63
+ end
64
+
65
+ class RGProxy < ::Gem::SilentUI
66
+ def initialize(ui)
67
+ @ui = ui
68
+ super()
69
+ end
70
+
71
+ def say(message)
72
+ if message =~ /native extensions/
73
+ @ui.info "with native extensions "
74
+ else
75
+ @ui.debug(message)
76
+ end
77
+ end
78
+ end
79
+
80
+
81
+ # Cache all the gems locally without using the shared GEM_PATH
82
+ Bundler.settings[:cache_all] = true
83
+ Bundler.settings[:local] = true
84
+ Bundler.settings[:disable_shared_gems] = true
85
+ # Make sure we cache all the gems, despite what the local config file says...
86
+ Bundler.settings.without = []
87
+
88
+ # Stupid bundler requires this because it's not abstracted out into a library that doesn't need IO
89
+ Bundler.ui = UI.new
90
+ Bundler.rubygems.ui = ::RGProxy.new(Bundler.ui)
91
+ Bundler.ui.level = "debug"
92
+
93
+ # Load the the Gemfile and resolve gems using RubyGems.org
94
+ definition = Bundler.definition
95
+ definition.validate_ruby!
96
+ definition.resolve_remotely!
97
+
98
+ mkdir_p Bundler.app_cache
99
+
100
+ # Cache the gems
101
+ definition.specs.each do |spec|
102
+ # Fetch Rubygem specs
103
+ if spec.source.respond_to?(:fetch_gem, true)
104
+ spec.source.send(:fetch_gem, spec) if spec.source.is_a?(Bundler::Source::Rubygems)
105
+ elsif Bundler::Fetcher.respond_to?(:fetch, true)
106
+ # Retain this call in case we are dealing with an older version of bundler.
107
+ Bundler::Fetcher.fetch(spec) if spec.source.is_a?(Bundler::Source::Rubygems)
108
+ else
109
+ # shrug
110
+ fail "Cannot find a way to download the gem for caching! Did the `fetch_gem` method move?"
111
+ end
112
+ # Cache everything but bundler itself...
113
+ spec.source.cache(spec) unless spec.name == "bundler"
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,33 @@
1
+ # This is something of a work in progress. Unfortunately,
2
+ # many of the projects that use the packaging repo carry
3
+ # version files with hard-coded versions, and many of these
4
+ # are in completely disparate formats.
5
+ #
6
+ # This task attempts to automate the updating of this file
7
+ # with the version to be packaged, but given the many version
8
+ # file formats in use, doing so cleanly is difficult. With
9
+ # any luck, going forward some of these projects will move
10
+ # away from maintaining hard-coded versions in source.
11
+ # However, if this effort loses momentum, we may end up
12
+ # revisiting this task and improving it substantially,
13
+ # and/or standardizing the expected version file format.
14
+ namespace :package do
15
+ desc "Set and commit the version in #{Pkg::Config.version_file}, requires VERSION."
16
+ task :versionset do
17
+ Pkg::Util.check_var('VERSION', ENV['VERSION'])
18
+ Pkg::Util::Version.versionbump
19
+ Pkg::Util::Git.commit_file(Pkg::Config.version_file, "update to #{ENV['VERSION']}")
20
+ end
21
+
22
+ task :versionbump, :workdir do |t, args|
23
+ Pkg::Util::Version.versionbump(args.workdir)
24
+ end
25
+
26
+ # A set of tasks for printing the version
27
+ [:version, :rpmversion, :rpmrelease, :debversion, :release].each do |task|
28
+ task "#{task}" do
29
+ $stdout.puts Pkg::Config.instance_variable_get("@#{task}")
30
+ end
31
+ end
32
+ end
33
+