omnibus 3.2.2 → 4.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (302) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +140 -10
  3. data/CHANGELOG.md +181 -8
  4. data/README.md +63 -35
  5. data/Rakefile +1 -1
  6. data/docs/omnibus-build-cache.md b/data/docs/Build → Cache.md +0 -0
  7. data/docs/Building on Debian.md +59 -0
  8. data/docs/Building on OSX.md +61 -35
  9. data/docs/Building on RHEL.md +74 -0
  10. data/docs/Building on Windows.md +40 -81
  11. data/features/commands/build.feature +1 -2
  12. data/features/commands/clean.feature +1 -1
  13. data/lib/omnibus.rb +111 -204
  14. data/lib/omnibus/build_version.rb +3 -20
  15. data/lib/omnibus/build_version_dsl.rb +2 -3
  16. data/lib/omnibus/builder.rb +103 -211
  17. data/lib/omnibus/cleaner.rb +5 -7
  18. data/lib/omnibus/cli.rb +1 -4
  19. data/lib/omnibus/cli/base.rb +9 -16
  20. data/lib/omnibus/compressor.rb +60 -0
  21. data/{spec/data/complicated/config/software/version-manifest.rb → lib/omnibus/compressors/base.rb} +17 -12
  22. data/lib/omnibus/compressors/dmg.rb +312 -0
  23. data/lib/omnibus/{null_builder.rb → compressors/null.rb} +10 -4
  24. data/lib/omnibus/compressors/tgz.rb +141 -0
  25. data/lib/omnibus/config.rb +89 -83
  26. data/lib/omnibus/core_extensions.rb +1 -0
  27. data/lib/omnibus/core_extensions/open_uri.rb +58 -0
  28. data/lib/omnibus/digestable.rb +9 -3
  29. data/lib/omnibus/exceptions.rb +116 -175
  30. data/lib/omnibus/fetcher.rb +97 -138
  31. data/lib/omnibus/fetchers/git_fetcher.rb +130 -165
  32. data/lib/omnibus/fetchers/net_fetcher.rb +205 -164
  33. data/lib/omnibus/fetchers/{s3_cache_fetcher.rb → null_fetcher.rb} +27 -17
  34. data/lib/omnibus/fetchers/path_fetcher.rb +74 -32
  35. data/lib/omnibus/file_syncer.rb +149 -0
  36. data/lib/omnibus/generator.rb +103 -32
  37. data/lib/omnibus/generator_files/.kitchen.yml.erb +5 -1
  38. data/lib/omnibus/generator_files/Gemfile.erb +13 -7
  39. data/lib/omnibus/generator_files/config/projects/project.rb.erb +28 -0
  40. data/lib/omnibus/generator_files/config/software/zlib.rb.erb +55 -0
  41. data/lib/omnibus/generator_files/omnibus.rb.erb +5 -7
  42. data/lib/omnibus/git_cache.rb +11 -13
  43. data/lib/omnibus/logger.rb +76 -22
  44. data/lib/omnibus/logging.rb +1 -1
  45. data/lib/omnibus/metadata.rb +264 -0
  46. data/lib/omnibus/ohai.rb +0 -51
  47. data/lib/omnibus/package.rb +4 -228
  48. data/lib/omnibus/packager.rb +71 -0
  49. data/lib/omnibus/packagers/base.rb +118 -176
  50. data/lib/omnibus/packagers/bff.rb +136 -0
  51. data/lib/omnibus/packagers/deb.rb +389 -0
  52. data/lib/omnibus/packagers/makeself.rb +114 -0
  53. data/lib/omnibus/packagers/msi.rb +346 -0
  54. data/lib/omnibus/packagers/pkg.rb +278 -0
  55. data/lib/omnibus/packagers/rpm.rb +438 -0
  56. data/lib/omnibus/packagers/solaris.rb +110 -0
  57. data/lib/omnibus/project.rb +263 -666
  58. data/lib/omnibus/publisher.rb +3 -3
  59. data/lib/omnibus/s3_cache.rb +21 -30
  60. data/lib/omnibus/software.rb +132 -271
  61. data/lib/omnibus/templating.rb +66 -0
  62. data/lib/omnibus/thread_pool.rb +109 -0
  63. data/lib/omnibus/util.rb +137 -15
  64. data/lib/omnibus/version.rb +1 -1
  65. data/omnibus.gemspec +2 -2
  66. data/resources/bff/gen.template.erb +22 -0
  67. data/resources/bff/postinstall.sh +0 -0
  68. data/resources/bff/unpostinstall.sh +0 -0
  69. data/resources/deb/conffiles.erb +3 -0
  70. data/resources/deb/control.erb +25 -0
  71. data/resources/deb/md5sums.erb +3 -0
  72. data/{lib/omnibus/generator_files/mac_dmg → resources/dmg}/background.png +0 -0
  73. data/resources/dmg/create_dmg.osascript.erb +17 -0
  74. data/{lib/omnibus/generator_files/mac_dmg → resources/dmg}/icon.png +0 -0
  75. data/{bin → resources/makeself}/makeself-header.sh +0 -0
  76. data/{bin → resources/makeself}/makeself.sh +0 -0
  77. data/{lib/omnibus/generator_files/package_scripts/makeselfinst.erb → resources/makeself/post_extract.sh.erb} +4 -4
  78. data/{lib/omnibus/generator_files/windows_msi → resources/msi}/assets/LICENSE.rtf +0 -0
  79. data/{lib/omnibus/generator_files/windows_msi → resources/msi}/assets/banner_background.bmp +0 -0
  80. data/{lib/omnibus/generator_files/windows_msi → resources/msi}/assets/dialog_background.bmp +0 -0
  81. data/{lib/omnibus/generator_files/windows_msi → resources/msi}/assets/project.ico +0 -0
  82. data/{lib/omnibus/generator_files/windows_msi → resources/msi}/assets/project_16x16.ico +0 -0
  83. data/{lib/omnibus/generator_files/windows_msi → resources/msi}/assets/project_32x32.ico +0 -0
  84. data/{spec/fixtures/sample/files/windows_msi/Resources/localization-en-us.wxl → resources/msi/localization-en-us.wxl.erb} +3 -4
  85. data/resources/msi/parameters.wxi.erb +9 -0
  86. data/{lib/omnibus/generator_files/windows_msi → resources/msi}/source.wxs.erb +14 -15
  87. data/{lib/omnibus/generator_files/mac_pkg → resources/pkg}/background.png +0 -0
  88. data/resources/pkg/distribution.xml.erb +21 -0
  89. data/resources/pkg/license.html.erb +3 -0
  90. data/resources/pkg/welcome.html.erb +7 -0
  91. data/resources/rpm/rpmmacros.erb +3 -0
  92. data/resources/rpm/signing.erb +40 -0
  93. data/resources/rpm/spec.erb +70 -0
  94. data/spec/functional/builder_spec.rb +90 -111
  95. data/spec/functional/fetchers/git_fetcher_spec.rb +130 -0
  96. data/spec/functional/fetchers/net_fetcher_spec.rb +110 -0
  97. data/spec/functional/fetchers/path_fetcher_spec.rb +97 -0
  98. data/spec/functional/file_syncer_spec.rb +206 -0
  99. data/spec/functional/templating_spec.rb +73 -0
  100. data/spec/spec_helper.rb +31 -94
  101. data/spec/support/env_helpers.rb +20 -0
  102. data/spec/support/examples.rb +56 -0
  103. data/spec/support/file_helpers.rb +46 -0
  104. data/spec/support/git_helpers.rb +107 -0
  105. data/spec/support/logging_helpers.rb +33 -0
  106. data/spec/support/matchers.rb +36 -0
  107. data/spec/support/ohai_helpers.rb +22 -0
  108. data/spec/support/path_helpers.rb +19 -0
  109. data/spec/support/shell_helpers.rb +14 -0
  110. data/spec/unit/build_version_dsl_spec.rb +0 -17
  111. data/spec/unit/build_version_spec.rb +1 -19
  112. data/spec/unit/builder_spec.rb +158 -46
  113. data/spec/unit/compressor_spec.rb +45 -0
  114. data/spec/unit/compressors/base_spec.rb +26 -0
  115. data/spec/unit/compressors/dmg_spec.rb +291 -0
  116. data/spec/unit/compressors/null_spec.rb +23 -0
  117. data/spec/unit/compressors/tgz_spec.rb +67 -0
  118. data/spec/unit/config_spec.rb +27 -34
  119. data/spec/unit/digestable_spec.rb +4 -4
  120. data/spec/unit/fetchers/git_fetcher_spec.rb +110 -39
  121. data/spec/unit/fetchers/net_fetcher_spec.rb +182 -72
  122. data/spec/unit/fetchers/path_fetcher_spec.rb +111 -0
  123. data/spec/unit/generator_spec.rb +137 -0
  124. data/spec/unit/git_cache_spec.rb +24 -34
  125. data/spec/unit/library_spec.rb +21 -82
  126. data/spec/unit/metadata_spec.rb +207 -0
  127. data/spec/unit/ohai_spec.rb +0 -7
  128. data/spec/unit/omnibus_spec.rb +41 -36
  129. data/spec/unit/package_spec.rb +1 -216
  130. data/spec/unit/packagers/base_spec.rb +76 -190
  131. data/spec/unit/packagers/bff_spec.rb +160 -0
  132. data/spec/unit/packagers/deb_spec.rb +324 -0
  133. data/spec/unit/packagers/makeself_spec.rb +80 -0
  134. data/spec/unit/packagers/msi_spec.rb +267 -0
  135. data/spec/unit/packagers/pkg_spec.rb +219 -0
  136. data/spec/unit/packagers/rpm_spec.rb +328 -0
  137. data/spec/unit/project_spec.rb +217 -80
  138. data/spec/unit/publisher_spec.rb +6 -2
  139. data/spec/unit/publishers/artifactory_publisher_spec.rb +1 -1
  140. data/spec/unit/publishers/s3_publisher_spec.rb +1 -1
  141. data/spec/unit/s3_cacher_spec.rb +22 -5
  142. data/spec/unit/software_spec.rb +89 -232
  143. data/spec/unit/util_spec.rb +188 -0
  144. metadata +159 -402
  145. data/features/commands/_deprecated.feature +0 -84
  146. data/lib/omnibus/cleanroom.rb +0 -141
  147. data/lib/omnibus/cli/deprecated.rb +0 -132
  148. data/lib/omnibus/generator_files/mac_pkg/license.html.erb +0 -1
  149. data/lib/omnibus/generator_files/mac_pkg/welcome.html.erb +0 -9
  150. data/lib/omnibus/generator_files/project.rb.erb +0 -20
  151. data/lib/omnibus/generator_files/software/c-example.rb.erb +0 -42
  152. data/lib/omnibus/generator_files/software/erlang-example.rb.erb +0 -38
  153. data/lib/omnibus/generator_files/software/ruby-example.rb.erb +0 -24
  154. data/lib/omnibus/generator_files/windows_msi/localization-en-us.wxl.erb +0 -20
  155. data/lib/omnibus/generator_files/windows_msi/parameters.wxi.erb +0 -9
  156. data/lib/omnibus/packagers/mac_dmg.rb +0 -235
  157. data/lib/omnibus/packagers/mac_pkg.rb +0 -176
  158. data/lib/omnibus/packagers/windows_msi.rb +0 -109
  159. data/spec/data/complicated/config/patches/bzip2/makefile_take_env_vars.patch +0 -15
  160. data/spec/data/complicated/config/patches/couchdb/patch_for_couchjs_stack.patch +0 -19
  161. data/spec/data/complicated/config/patches/gd/gd-2.0.33-configure-libpng.patch +0 -100
  162. data/spec/data/complicated/config/patches/keepalived/keepalived-1.2.9_opscode_centos_5.patch +0 -15
  163. data/spec/data/complicated/config/patches/libedit/freebsd-vi-fix.patch +0 -24
  164. data/spec/data/complicated/config/patches/libiconv/libiconv-1.14_srclib_stdio.in.h-remove-gets-declarations.patch +0 -29
  165. data/spec/data/complicated/config/patches/libwrap/tcp_wrappers-7.6-makefile-dest-fix.patch +0 -35
  166. data/spec/data/complicated/config/patches/libwrap/tcp_wrappers-7.6-malloc-fix.patch +0 -13
  167. data/spec/data/complicated/config/patches/libwrap/tcp_wrappers-7.6-shared_lib_plus_plus-1.patch +0 -1035
  168. data/spec/data/complicated/config/patches/logrotate/logrotate_basedir_override.patch +0 -12
  169. data/spec/data/complicated/config/patches/ncurses/ncurses-5.9-solaris-xopen_source_extended-detection.patch +0 -11
  170. data/spec/data/complicated/config/patches/ncurses/ncurses-clang.patch +0 -42
  171. data/spec/data/complicated/config/patches/ncurses/patch-aa +0 -23
  172. data/spec/data/complicated/config/patches/ncurses/patch-ab +0 -44
  173. data/spec/data/complicated/config/patches/ncurses/patch-ac +0 -40
  174. data/spec/data/complicated/config/patches/ncurses/patch-ad +0 -12
  175. data/spec/data/complicated/config/patches/ncurses/patch-aix-configure +0 -23
  176. data/spec/data/complicated/config/patches/ncurses/patch-cxx_cursesf.h +0 -22
  177. data/spec/data/complicated/config/patches/ncurses/patch-cxx_cursesm.h +0 -22
  178. data/spec/data/complicated/config/patches/nrpe/fix_for_runit.patch +0 -64
  179. data/spec/data/complicated/config/patches/openssl/openssl-1.0.1f-do-not-build-docs.patch +0 -101
  180. data/spec/data/complicated/config/patches/postgresql/postgresql-9.1.2-configure-ncurses-fix.patch +0 -12
  181. data/spec/data/complicated/config/patches/ruby/patch-configure +0 -103
  182. data/spec/data/complicated/config/patches/ruby/ruby-aix-configure.patch +0 -10
  183. data/spec/data/complicated/config/patches/ruby/ruby-openssl-1.0.1c.patch +0 -42
  184. data/spec/data/complicated/config/patches/ruby/ruby_aix_1_9_3_448_ssl_EAGAIN.patch +0 -57
  185. data/spec/data/complicated/config/patches/ruby/rvm-cflags.patch +0 -27
  186. data/spec/data/complicated/config/projects/angrychef.rb +0 -32
  187. data/spec/data/complicated/config/projects/chef-windows.rb +0 -32
  188. data/spec/data/complicated/config/projects/chef.rb +0 -32
  189. data/spec/data/complicated/config/projects/chefdk-windows.rb +0 -41
  190. data/spec/data/complicated/config/projects/chefdk.rb +0 -44
  191. data/spec/data/complicated/config/software/appbundler.rb +0 -25
  192. data/spec/data/complicated/config/software/autoconf.rb +0 -35
  193. data/spec/data/complicated/config/software/automake.rb +0 -39
  194. data/spec/data/complicated/config/software/berkshelf.rb +0 -44
  195. data/spec/data/complicated/config/software/bundler.rb +0 -25
  196. data/spec/data/complicated/config/software/bzip2.rb +0 -46
  197. data/spec/data/complicated/config/software/cacerts.rb +0 -44
  198. data/spec/data/complicated/config/software/chef-client-msi.rb +0 -87
  199. data/spec/data/complicated/config/software/chef-gem.rb +0 -26
  200. data/spec/data/complicated/config/software/chef-vault.rb +0 -43
  201. data/spec/data/complicated/config/software/chef-windows.rb +0 -158
  202. data/spec/data/complicated/config/software/chef.rb +0 -170
  203. data/spec/data/complicated/config/software/chefdk.rb +0 -103
  204. data/spec/data/complicated/config/software/couchdb.rb +0 -53
  205. data/spec/data/complicated/config/software/curl.rb +0 -48
  206. data/spec/data/complicated/config/software/erlang.rb +0 -65
  207. data/spec/data/complicated/config/software/expat.rb +0 -21
  208. data/spec/data/complicated/config/software/fcgi.rb +0 -56
  209. data/spec/data/complicated/config/software/fcgiwrap.rb +0 -41
  210. data/spec/data/complicated/config/software/gd.rb +0 -56
  211. data/spec/data/complicated/config/software/gdbm.rb +0 -40
  212. data/spec/data/complicated/config/software/gecode.rb +0 -48
  213. data/spec/data/complicated/config/software/git.rb +0 -40
  214. data/spec/data/complicated/config/software/help2man.rb +0 -30
  215. data/spec/data/complicated/config/software/icu.rb +0 -40
  216. data/spec/data/complicated/config/software/jre.rb +0 -48
  217. data/spec/data/complicated/config/software/keepalived.rb +0 -43
  218. data/spec/data/complicated/config/software/libarchive.rb +0 -50
  219. data/spec/data/complicated/config/software/libedit.rb +0 -69
  220. data/spec/data/complicated/config/software/libffi.rb +0 -71
  221. data/spec/data/complicated/config/software/libgcc.rb +0 -39
  222. data/spec/data/complicated/config/software/libiconv.rb +0 -55
  223. data/spec/data/complicated/config/software/libjpeg.rb +0 -39
  224. data/spec/data/complicated/config/software/libpng.rb +0 -38
  225. data/spec/data/complicated/config/software/libtool.rb +0 -52
  226. data/spec/data/complicated/config/software/libwrap.rb +0 -50
  227. data/spec/data/complicated/config/software/libxml2.rb +0 -51
  228. data/spec/data/complicated/config/software/libxslt.rb +0 -52
  229. data/spec/data/complicated/config/software/libyaml-windows.rb +0 -43
  230. data/spec/data/complicated/config/software/libyaml.rb +0 -62
  231. data/spec/data/complicated/config/software/logrotate.rb +0 -41
  232. data/spec/data/complicated/config/software/makedepend.rb +0 -73
  233. data/spec/data/complicated/config/software/mysql2.rb +0 -42
  234. data/spec/data/complicated/config/software/nagios-plugins.rb +0 -53
  235. data/spec/data/complicated/config/software/nagios.rb +0 -66
  236. data/spec/data/complicated/config/software/ncurses.rb +0 -149
  237. data/spec/data/complicated/config/software/nginx.rb +0 -40
  238. data/spec/data/complicated/config/software/nodejs.rb +0 -44
  239. data/spec/data/complicated/config/software/nokogiri.rb +0 -55
  240. data/spec/data/complicated/config/software/nrpe.rb +0 -61
  241. data/spec/data/complicated/config/software/ohai.rb +0 -64
  242. data/spec/data/complicated/config/software/omnibus-ctl.rb +0 -34
  243. data/spec/data/complicated/config/software/openresty.rb +0 -67
  244. data/spec/data/complicated/config/software/openssl.rb +0 -158
  245. data/spec/data/complicated/config/software/pcre.rb +0 -42
  246. data/spec/data/complicated/config/software/perl-extutils-embed.rb +0 -15
  247. data/spec/data/complicated/config/software/perl-extutils-makemaker.rb +0 -15
  248. data/spec/data/complicated/config/software/perl.rb +0 -48
  249. data/spec/data/complicated/config/software/perl_pg_driver.rb +0 -12
  250. data/spec/data/complicated/config/software/php.rb +0 -41
  251. data/spec/data/complicated/config/software/pip.rb +0 -30
  252. data/spec/data/complicated/config/software/pkg-config.rb +0 -66
  253. data/spec/data/complicated/config/software/popt.rb +0 -47
  254. data/spec/data/complicated/config/software/postgresql.rb +0 -51
  255. data/spec/data/complicated/config/software/preparation.rb +0 -30
  256. data/spec/data/complicated/config/software/pygments.rb +0 -25
  257. data/spec/data/complicated/config/software/python.rb +0 -49
  258. data/spec/data/complicated/config/software/rabbitmq.rb +0 -36
  259. data/spec/data/complicated/config/software/rebar.rb +0 -36
  260. data/spec/data/complicated/config/software/redis.rb +0 -33
  261. data/spec/data/complicated/config/software/rsync.rb +0 -48
  262. data/spec/data/complicated/config/software/ruby-windows-devkit.rb +0 -30
  263. data/spec/data/complicated/config/software/ruby-windows.rb +0 -30
  264. data/spec/data/complicated/config/software/ruby.rb +0 -162
  265. data/spec/data/complicated/config/software/rubygems-customization.rb +0 -57
  266. data/spec/data/complicated/config/software/rubygems.rb +0 -37
  267. data/spec/data/complicated/config/software/runit.rb +0 -118
  268. data/spec/data/complicated/config/software/server-jre.rb +0 -46
  269. data/spec/data/complicated/config/software/setuptools.rb +0 -30
  270. data/spec/data/complicated/config/software/spawn-fcgi.rb +0 -40
  271. data/spec/data/complicated/config/software/sphinx.rb +0 -26
  272. data/spec/data/complicated/config/software/spidermonkey.rb +0 -60
  273. data/spec/data/complicated/config/software/sqitch.rb +0 -24
  274. data/spec/data/complicated/config/software/test-kitchen.rb +0 -39
  275. data/spec/data/complicated/config/software/unicorn.rb +0 -27
  276. data/spec/data/complicated/config/software/util-macros.rb +0 -46
  277. data/spec/data/complicated/config/software/xproto.rb +0 -46
  278. data/spec/data/complicated/config/software/yajl.rb +0 -30
  279. data/spec/data/complicated/config/software/zlib.rb +0 -67
  280. data/spec/data/overrides/bad_line.overrides +0 -3
  281. data/spec/data/overrides/good.overrides +0 -5
  282. data/spec/data/overrides/with_dupes.overrides +0 -4
  283. data/spec/data/projects/chefdk.rb +0 -41
  284. data/spec/data/projects/sample.rb +0 -13
  285. data/spec/data/software/erchef.rb +0 -42
  286. data/spec/data/software/zlib.rb +0 -67
  287. data/spec/fixtures/sample/files/mac_dmg/Resources/background.png +0 -0
  288. data/spec/fixtures/sample/files/mac_dmg/Resources/icon.png +0 -0
  289. data/spec/fixtures/sample/files/mac_pkg/Resources/background.png +0 -0
  290. data/spec/fixtures/sample/files/mac_pkg/Resources/license.html +0 -1
  291. data/spec/fixtures/sample/files/mac_pkg/Resources/welcome.html +0 -9
  292. data/spec/fixtures/sample/files/windows_msi/Resources/assets/LICENSE.rtf +0 -8
  293. data/spec/fixtures/sample/files/windows_msi/Resources/assets/banner_background.bmp +0 -0
  294. data/spec/fixtures/sample/files/windows_msi/Resources/assets/dialog_background.bmp +0 -0
  295. data/spec/fixtures/sample/files/windows_msi/Resources/assets/project.ico +0 -0
  296. data/spec/fixtures/sample/files/windows_msi/Resources/assets/project_16x16.ico +0 -0
  297. data/spec/fixtures/sample/files/windows_msi/Resources/assets/project_32x32.ico +0 -0
  298. data/spec/fixtures/sample/files/windows_msi/Resources/parameters.wxi.erb +0 -9
  299. data/spec/fixtures/sample/files/windows_msi/Resources/source.wxs +0 -74
  300. data/spec/integration/packagers/mac_spec.rb +0 -58
  301. data/spec/integration/packagers/windows_spec.rb +0 -70
  302. data/spec/unit/packagers/mac_pkg_spec.rb +0 -151
@@ -16,27 +16,6 @@
16
16
 
17
17
  require 'ohai'
18
18
 
19
- class Mash
20
- #
21
- # @todo Remove in the next major release
22
- #
23
- # Ohai 7 removed the ability to access Ohai attributes via dot notation. This
24
- # temporary monkey patch provides the ability for users to still use the old
25
- # dot notation, while printing out a deprecation error.
26
- #
27
- def method_missing(m, *args, &block)
28
- if key?(m)
29
- Omnibus.logger.deprecated('Ohai') do
30
- "Ohai.#{m}. Please use Ohai['#{m}'] instead."
31
- end
32
-
33
- fetch(m)
34
- else
35
- super
36
- end
37
- end
38
- end
39
-
40
19
  module Omnibus
41
20
  class Ohai
42
21
  PLUGINS = [
@@ -59,33 +38,3 @@ module Omnibus
59
38
  end
60
39
  end
61
40
  end
62
-
63
- module Omnibus
64
- class OhaiWithWarning < Ohai
65
- include Logging
66
-
67
- class << self
68
- def method_missing(m, *args, &block)
69
- bad_boy = caller[2]
70
-
71
- unless warned[bad_boy]
72
- log.deprecated('OHAI') do
73
- "OHAI constant. Please use Ohai instead: #{bad_boy}"
74
- end
75
- warned[bad_boy] = true
76
- end
77
-
78
- Ohai.send(m, *args, &block)
79
- end
80
-
81
- def warned
82
- @warned ||= {}
83
- end
84
- end
85
- end
86
- end
87
-
88
- #
89
- # @todo remove in the next major release
90
- #
91
- OHAI = Omnibus::OhaiWithWarning
@@ -18,235 +18,11 @@ require 'json'
18
18
 
19
19
  module Omnibus
20
20
  class Package
21
- class Metadata
22
- class << self
23
- #
24
- # Generate a +metadata.json+ from the given package and data hash.
25
- #
26
- # @param [Package] package
27
- # the package for this metadata
28
- # @param [Hash] data
29
- # the hash of attributes to set in the metadata
30
- #
31
- # @return [String]
32
- # the path where the metadata was saved on disk
33
- #
34
- def generate(package, data = {})
35
- data = {
36
- basename: package.name,
37
- md5: package.md5,
38
- sha1: package.sha1,
39
- sha256: package.sha256,
40
- sha512: package.sha512,
41
- platform: platform_shortname,
42
- platform_version: platform_version,
43
- arch: arch,
44
- }.merge(data)
45
-
46
- instance = new(package, data)
47
- instance.save
48
- instance.path
49
- end
50
-
51
- #
52
- # Load the metadata from disk.
53
- #
54
- # @param [Package] package
55
- # the package for this metadata
56
- #
57
- # @return [Metadata]
58
- #
59
- def for_package(package)
60
- data = File.read(path_for(package))
61
- hash = JSON.parse(data, symbolize_names: true)
62
-
63
- # Ensure Platform version has been truncated
64
- if hash[:platform_version] && hash[:platform]
65
- hash[:platform_version] = truncate_platform_version(hash[:platform_version], hash[:platform])
66
- end
67
-
68
- # Ensure an interation exists
69
- hash[:iteration] ||= 1
70
-
71
- new(package, hash)
72
- rescue Errno::ENOENT
73
- raise NoPackageMetadataFile.new(package.path)
74
- end
75
-
76
- #
77
- # The metadata path that corresponds to the package.
78
- #
79
- # @param [Package] package
80
- # the package for this metadata
81
- #
82
- # @return [String]
83
- #
84
- def path_for(package)
85
- "#{package.path}.metadata.json"
86
- end
87
-
88
- #
89
- # The architecture for this machine, as reported from Ohai.
90
- #
91
- # @return [String]
92
- #
93
- def arch
94
- Ohai['kernel']['machine']
95
- end
96
-
97
- #
98
- # Platform version to be used in package metadata.
99
- #
100
- # @return [String]
101
- # the platform version
102
- #
103
- def platform_version
104
- truncate_platform_version(Ohai['platform_version'], platform_shortname)
105
- end
106
-
107
- #
108
- # Platform name to be used when creating metadata for the artifact.
109
- # rhel/centos become "el", all others are just platform
110
- #
111
- # @return [String]
112
- # the platform family short name
113
- #
114
- def platform_shortname
115
- if Ohai['platform_family'] == 'rhel'
116
- 'el'
117
- else
118
- Ohai['platform']
119
- end
120
- end
121
-
122
- private
123
-
124
- #
125
- # On certain platforms we don't care about the full MAJOR.MINOR.PATCH platform
126
- # version. This method will properly truncate the version down to a more human
127
- # friendly version. This version can also be thought of as a 'marketing'
128
- # version.
129
- #
130
- # @param [String] platform_version
131
- # the platform version to truncate
132
- # @param [String] platform_shortname
133
- # the platform shortname. this might be an Ohai-returned platform or
134
- # platform family but it also might be a shortname like `el`
135
- #
136
- def truncate_platform_version(platform_version, platform)
137
- case platform
138
- when 'centos', 'debian', 'el', 'fedora', 'freebsd', 'rhel', 'sles'
139
- # Only want MAJOR (e.g. Debian 7)
140
- platform_version.split('.').first
141
- when 'aix', 'arch', 'gentoo', 'mac_os_x', 'openbsd', 'slackware', 'solaris2', 'suse', 'ubuntu'
142
- # Only want MAJOR.MINOR (e.g. Mac OS X 10.9, Ubuntu 12.04)
143
- platform_version.split('.')[0..1].join('.')
144
- when 'omnios', 'smartos'
145
- # Only want MAJOR (e.g OmniOS r151006, SmartOS 20120809T221258Z)
146
- platform_version.split('.').first
147
- when 'windows'
148
- # Windows has this really awesome "feature", where their version numbers
149
- # internally do not match the "marketing" name.
150
- #
151
- # Definitively computing the Windows marketing name actually takes more
152
- # than the platform version. Take a look at the following file for the
153
- # details:
154
- #
155
- # https://github.com/opscode/chef/blob/master/lib/chef/win32/version.rb
156
- #
157
- # As we don't need to be exact here the simple mapping below is based on:
158
- #
159
- # http://www.jrsoftware.org/ishelp/index.php?topic=winvernotes
160
- #
161
- case platform_version
162
- when '5.0.2195', '2000' then '2000'
163
- when '5.1.2600', 'xp' then 'xp'
164
- when '5.2.3790', '2003r2' then '2003r2'
165
- when '6.0.6001', '2008' then '2008'
166
- when '6.1.7600', '7' then '7'
167
- when '6.1.7601', '2008r2' then '2008r2'
168
- when '6.2.9200', '8' then '8'
169
- # The following `when` will never match since Windows 2012's platform
170
- # version is the same as Windows 8. It's only here for completeness and
171
- # documentation.
172
- when '6.2.9200', '2012' then '2012'
173
- when /6\.3\.\d+/, '8.1' then '8.1'
174
- # The following `when` will never match since Windows 2012R2's platform
175
- # version is the same as Windows 8.1. It's only here for completeness
176
- # and documentation.
177
- when /6\.3\.\d+/, '2012r2' then '2012r2'
178
- else
179
- raise UnknownPlatformVersion.new(platform, platform_version)
180
- end
181
- else
182
- raise UnknownPlatform.new(platform)
183
- end
184
- end
185
- end
186
-
187
- #
188
- # Create a new metadata object for the given package and hash data.
189
- #
190
- # @param [Package] package
191
- # the package for this metadata
192
- # @param [Hash] data
193
- # the hash of attributes to set in the metadata
194
- #
195
- def initialize(package, data = {})
196
- @package = package
197
- @data = data.dup.freeze
198
- end
199
-
200
- #
201
- # Helper for accessing the information inside the metadata hash.
202
- #
203
- # @return [Object]
204
- #
205
- def [](key)
206
- @data[key]
207
- end
208
-
209
- #
210
- # The name of this metadata file.
211
- #
212
- # @return [String]
213
- #
214
- def name
215
- @name ||= File.basename(path)
216
- end
217
-
218
- #
219
- # @see (Metadata.path_for)
220
- #
221
- def path
222
- @path ||= self.class.path_for(@package)
223
- end
224
-
225
- #
226
- # Save the file to disk.
227
- #
228
- # @return [true]
229
- #
230
- def save
231
- File.open(path, 'w+') do |f|
232
- f.write(to_json)
233
- end
234
-
235
- true
236
- end
237
-
238
- #
239
- # The JSON representation of this metadata.
240
- #
241
- # @return [String]
242
- #
243
- def to_json
244
- JSON.pretty_generate(@data)
245
- end
246
- end
247
-
248
21
  include Digestable
249
22
 
23
+ #
24
+ # @return [String]
25
+ #
250
26
  attr_reader :path
251
27
 
252
28
  #
@@ -318,7 +94,7 @@ module Omnibus
318
94
  #
319
95
  # The parsed contents of the metadata.
320
96
  #
321
- # @raise [NoPackageMetadataFile] if the {metadata} does not exist
97
+ # @raise [NoPackageMetadataFile] if the {#metadata} does not exist
322
98
  # @raise [JSON::ParserError] if the JSON is not valid
323
99
  #
324
100
  # @return [Hash<Symbol, String>]
@@ -0,0 +1,71 @@
1
+ #
2
+ # Copyright 2014 Chef Software, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # 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,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ module Omnibus
18
+ module Packager
19
+ include Logging
20
+
21
+ autoload :Base, 'omnibus/packagers/base'
22
+ autoload :BFF, 'omnibus/packagers/bff'
23
+ autoload :DEB, 'omnibus/packagers/deb'
24
+ autoload :Makeself, 'omnibus/packagers/makeself'
25
+ autoload :MSI, 'omnibus/packagers/msi'
26
+ autoload :PKG, 'omnibus/packagers/pkg'
27
+ autoload :Solaris, 'omnibus/packagers/solaris'
28
+ autoload :RPM, 'omnibus/packagers/rpm'
29
+
30
+ #
31
+ # The list of Ohai platform families mapped to the respective packager
32
+ # class.
33
+ #
34
+ # @return [Hash<String, Class>]
35
+ #
36
+ PLATFORM_PACKAGER_MAP = {
37
+ 'debian' => DEB,
38
+ 'fedora' => RPM,
39
+ 'rhel' => RPM,
40
+ 'aix' => BFF,
41
+ 'solaris2' => Solaris,
42
+ 'windows' => MSI,
43
+ 'mac_os_x' => PKG,
44
+ }.freeze
45
+
46
+ #
47
+ # Determine the packager for the current system. This method returns the
48
+ # class, not an instance of the class.
49
+ #
50
+ # @example
51
+ # Packager.for_current_system #=> Packager::RPM
52
+ #
53
+ # @return [~Packager::Base]
54
+ #
55
+ def for_current_system
56
+ family = Ohai['platform_family']
57
+
58
+ if klass = PLATFORM_PACKAGER_MAP[family]
59
+ klass
60
+ else
61
+ log.warn(log_key) do
62
+ "Could not determine packager for `#{family}', defaulting " \
63
+ "to `makeself'!"
64
+ end
65
+
66
+ Makeself
67
+ end
68
+ end
69
+ module_function :for_current_system
70
+ end
71
+ end
@@ -15,247 +15,189 @@
15
15
  #
16
16
 
17
17
  require 'fileutils'
18
- require 'forwardable'
19
- require 'erb'
20
18
 
21
19
  module Omnibus
22
20
  class Packager::Base
21
+ include Cleanroom
22
+ include Digestable
23
23
  include Logging
24
+ include NullArgumentable
25
+ include Templating
24
26
  include Util
25
27
 
26
- extend Forwardable
27
-
28
- # The Omnibus::Project instance that we're packaging.
28
+ # The {Project} instance that we are packaging
29
29
  attr_reader :project
30
30
 
31
- # The commands/steps to setup the file system.
32
- def self.setup(&block)
33
- if block_given?
34
- @setup = block
35
- else
36
- @setup
31
+ class << self
32
+ #
33
+ # Set the unique of this packager.
34
+ #
35
+ # @see {#id}
36
+ #
37
+ # @param [Symbol] name
38
+ # the id
39
+ #
40
+ def id(name)
41
+ class_eval <<-EOH, __FILE__, __LINE__
42
+ def id
43
+ :#{name}
44
+ end
45
+ EOH
37
46
  end
38
- end
39
47
 
40
- # The commands/steps to validate any arguments.
41
- def self.validate(&block)
42
- if block_given?
43
- @validate = block
44
- else
45
- @validate
48
+ # The commands/steps use to setup the filesystem.
49
+ def setup(&block)
50
+ block ? @setup = block : @setup
46
51
  end
47
- end
48
52
 
49
- # The commands/steps to build the package.
50
- def self.build(&block)
51
- if block_given?
52
- @build = block
53
- else
54
- @build || raise(AbstractMethod.new("#{self.class.name}.build"))
55
- end
56
- end
57
-
58
- # The commands/steps to cleanup any temporary files/directories.
59
- def self.clean(&block)
60
- if block_given?
61
- @clean = block
62
- else
63
- @clean
53
+ # The commands/steps to build the package.
54
+ def build(&block)
55
+ block ? @build = block : @build
64
56
  end
65
57
  end
66
58
 
59
+ #
67
60
  # Create a new packager object.
68
61
  #
69
62
  # @param [Project] project
63
+ #
70
64
  def initialize(project)
71
65
  @project = project
72
66
  end
73
67
 
74
- # Hacky way to get around the fact that older versions of Omnibus used to
75
- # delegate magical methods to this DSL.
76
- #
77
- # @deprecated Use +project+ methods instead
78
- def method_missing(m, *args, &block)
79
- if project.respond_to?(m)
80
- log.deprecated("#{log_key}##{m}") { "#{m}. Please use project.#{m} instead." }
81
- project.send(m, *args, &block)
82
- else
83
- super
84
- end
85
- end
86
-
87
- # @deprecated
88
- def version
89
- log.deprecated("#{log_key}#version") { 'version. Please use project.build_version instead.' }
90
- project.build_version
91
- end
92
-
93
68
  #
94
- # Generation methods
95
- # ------------------------------
96
-
97
- # Create a directory at the given +path+.
69
+ # The unique identifier for this class - this is used in file paths and
70
+ # packager searching, so please do not change unless you know what you are
71
+ # doing!
98
72
  #
99
- # @param [String] path
100
- def create_directory(path)
101
- FileUtils.mkdir_p(path)
102
- path
103
- end
104
-
105
- # Remove the directory at the given +path+.
73
+ # @abstract Subclasses should define the +id+ attribute.
106
74
  #
107
- # @param [String] path
108
- def remove_directory(path)
109
- FileUtils.rm_rf(path)
110
- end
111
-
112
- # Purge the directory of all contents.
75
+ # @return [Symbol]
113
76
  #
114
- # @param [String] path
115
- def purge_directory(path)
116
- remove_directory(path)
117
- create_directory(path)
77
+ def id
78
+ raise NotImplementedError
118
79
  end
119
80
 
120
- # Copy the +source+ file to the +destination+.
121
81
  #
122
- # @param [String] source
123
- # @param [String] destination
124
- def copy_file(source, destination)
125
- FileUtils.cp(source, destination)
126
- destination
127
- end
128
-
129
- # Remove the file at the given path.
82
+ # The ending name of this package on disk. This method is used to generate
83
+ # metadata about the package after it is built.
130
84
  #
131
- # @param [String] pah
132
- def remove_file(path)
133
- FileUtils.rm_f(path)
134
- end
135
-
136
- # Copy the +source+ directory to the +destination+.
85
+ # @abstract
137
86
  #
138
- # @param [String] source
139
- # @param [String] destination
140
- def copy_directory(source, destination)
141
- FileUtils.cp_r(Dir["#{source}/*"], destination)
142
- end
143
-
144
- # Execute the command using shellout!
87
+ # @return [String]
145
88
  #
146
- # @param [String] command
147
- def execute(command, options = {})
148
- options.merge! timeout: 3600, cwd: staging_dir
149
- shellout!(command, options)
150
- end
151
-
152
- # Render an erb template at +source_path+ to +destination_path+ if
153
- # given. Otherwise template is rendered next to +source_path+
154
- # by removing the 'erb' extension of the template
155
- #
156
- # @param [String] source_path
157
- # @param [String] destination_path
158
- def render_template(source_path, destination_path = nil)
159
- return unless source_path.end_with?('.erb')
160
-
161
- destination_path = source_path.chomp('.erb') if destination_path.nil?
162
-
163
- File.open(source_path) do |file|
164
- erb = ERB.new(file.read)
165
- File.open(destination_path, 'w') do |out|
166
- out.write(erb.result(binding))
167
- end
168
-
169
- remove_file(source_path)
170
- end
89
+ def package_name
90
+ raise NotImplementedError
171
91
  end
172
92
 
173
93
  #
174
- # Validations
175
- # ------------------------------
176
-
177
- # Validate the presence of a file.
94
+ # The list of files to exclude when syncing files. This comes from the list
95
+ # of project exclusions and includes "common" SCM directories (like +.git+).
96
+ #
97
+ # @return [Array<String>]
178
98
  #
179
- # @param [String] path
180
- def assert_presence!(path)
181
- raise MissingAsset.new(path) unless File.exist?(path)
99
+ def exclusions
100
+ project.exclusions + %w(
101
+ **/.git
102
+ **/.hg
103
+ **/.svn
104
+ **/.gitkeep
105
+ )
182
106
  end
183
107
 
108
+ #
184
109
  # Execute this packager by running the following phases in order:
185
110
  #
186
111
  # - setup
187
- # - validate
188
112
  # - build
189
- # - clean
190
113
  #
191
114
  def run!
192
- instance_eval(&self.class.setup) if self.class.setup
193
- instance_eval(&self.class.validate) if self.class.validate
194
- instance_eval(&self.class.build) if self.class.build
195
- instance_eval(&self.class.clean) if self.class.clean
115
+ # Ensure the package directory exists
116
+ create_directory(Config.package_dir)
117
+
118
+ # Run the setup and build sequences
119
+ instance_eval(&self.class.setup) if self.class.setup
120
+ instance_eval(&self.class.build) if self.class.build
121
+
122
+ # Render the metadata
123
+ Metadata.generate(package_path, project)
124
+
125
+ # Ensure the temporary directory is removed at the end of a successful
126
+ # run. Without removal, successful builds will "leak" in /tmp and cause
127
+ # increased disk usage.
128
+ #
129
+ # Instead of having this as an +ensure+ block, failed builds will persist
130
+ # this directory so developers can go poke around and figure out why the
131
+ # build failed.
132
+ remove_directory(staging_dir)
196
133
  end
197
134
 
198
- # The ending name of this package on disk. +Omnibus::Project+ uses this to
199
- # generate metadata about the package after it is built.
135
+ #
136
+ # The path to the rendered package on disk. This is calculated by
137
+ # combining the {Config#package_dir} with the name of the package, as
138
+ # calculated by one of the subclasses.
200
139
  #
201
140
  # @return [String]
202
- def package_name
203
- raise AbstractMethod.new("#{self.class.name}#package_name")
141
+ #
142
+ def package_path
143
+ File.join(Config.package_dir, package_name)
204
144
  end
205
145
 
206
- private
207
-
208
- # The path to the directory where we can throw staged files.
146
+ #
147
+ # The path to the staging dir on disk.
209
148
  #
210
149
  # @return [String]
150
+ #
211
151
  def staging_dir
212
- File.expand_path("#{Config.package_tmp}/#{underscore_name}")
152
+ @staging_dir ||= Dir.mktmpdir(project.name)
213
153
  end
214
154
 
215
- # The path to the directory where the packager resources are
216
- # copied into from source.
217
155
  #
218
- # @return [String]
219
- def staging_resources_path
220
- File.expand_path("#{staging_dir}/Resources")
221
- end
156
+ # @!group Resource methods
157
+ # --------------------------------------------------
222
158
 
223
- # The path to a resource in staging directory.
224
159
  #
225
- # @param [String]
226
- # the name or path of the resource
227
- # @return [String]
228
- def resource(path)
229
- File.expand_path(File.join(staging_resources_path, path))
160
+ # The preferred path to a resource on disk with the given +name+. This
161
+ # method will perform an "intelligent" search for a resource by first
162
+ # looking in the local project expected {#resources_path}, and then falling
163
+ # back to Omnibus' files.
164
+ #
165
+ # @example When the resource exists locally
166
+ # resource_path("spec.erb") #=> "/path/to/project/resources/rpm/spec.erb"
167
+ #
168
+ # @example When the resource does not exist locally
169
+ # resource_path("spec.erb") #=> "/omnibus-x.y.z/resources/rpm/spec.erb"
170
+ #
171
+ # @param [String] name
172
+ # the name of the resource on disk to find
173
+ #
174
+ def resource_path(name)
175
+ local = File.join(resources_path, name)
176
+
177
+ if File.exist?(local)
178
+ log.info(log_key) { "Using local resource `#{name}' from `#{local}'" }
179
+ local
180
+ else
181
+ log.debug(log_key) { "Using vendored resource `#{name}'" }
182
+ Omnibus.source_root.join("resources/#{id}/#{name}").to_s
183
+ end
230
184
  end
231
185
 
232
- # The path to all the resources on the packager source.
233
- # Uses `resources_path` if specified in the project otherwise
234
- # uses the project root set in global config.
186
+ #
187
+ # The path where this packager's resources reside on disk. This is the
188
+ # given {Project#resources_path} combined with the packager's {#id}.
189
+ #
190
+ # @example RPM packager
191
+ # resources_path #=> "/path/to/project/resources/rpm"
235
192
  #
236
193
  # @return [String]
194
+ #
237
195
  def resources_path
238
- base_path = if project.resources_path
239
- project.resources_path
240
- else
241
- project.files_path
242
- end
243
-
244
- File.expand_path(File.join(base_path, underscore_name, 'Resources'))
196
+ File.expand_path("#{project.resources_path}/#{id}")
245
197
  end
246
198
 
247
- # The underscored equivalent of this class. This is mostly used by file
248
- # paths.
249
199
  #
250
- # @return [String]
251
- def underscore_name
252
- @underscore_name ||= self.class.name
253
- .split('::')
254
- .last
255
- .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
256
- .gsub(/([a-z\d])([A-Z])/, '\1_\2')
257
- .tr('-', '_')
258
- .downcase
259
- end
200
+ # @!endgroup
201
+ # --------------------------------------------------
260
202
  end
261
203
  end