prebundler 0.12.0 → 0.13.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b42e430112189e660d94c9d8c1b95217b88b96da88a546c4786061b446c892d8
4
- data.tar.gz: e06e950923a142dd513d8331d732a65b7f09a004381289895a5541ea6315faeb
3
+ metadata.gz: f1b4617c0c426fe9ac76ca98f6d9a80e849a6f8fb848817f7bfa6a9c5393b238
4
+ data.tar.gz: be95fbc3f0f4f39682c2ee929d9a3c8ea27fd8db087f4a0d3d9c2c39f87c4b98
5
5
  SHA512:
6
- metadata.gz: 3dae5bd84ab46ddbe6263997c1c453ff9c0534141c5e250d5d2af89e3213584e875821d0430c35886e407af45f727c0a105110a790e78fac165a0a12a1fcb90a
7
- data.tar.gz: db940690b64c743540cb952651f9c8f729965392a9d93dc1b4607a39dc7b765f1600d1d51bbd2ea62ed52e4f40c45448b62c3670c7e503eb0c9f8320e577d7f5
6
+ metadata.gz: 244764066b66efdc4feb132dc3f94ed455cf141fdeb14b758d935e6dd1d8b960f3bdef4d2c783709a41fff7e30e6405e4871514d4220f757181af4e0951e72fe
7
+ data.tar.gz: 67d0a49d079f337e6522ed6765652f12e3fcd93546744f3ed0efae8e554e9f6604f8957118293c4d826985445048b7b65618cfbeb01a9af7b0a56b64a2cfa118
data/CHANGELOG.md CHANGED
@@ -1,113 +1,97 @@
1
- 0.12.0
2
- ===
3
- - Switch out ohai for ohey.
4
-
5
- 0.11.8
6
- ===
7
- - Don't store gems in the backend if they failed to install.
8
- - Use an absolute bundle path.
9
- - Only consider a gem from the lockfile if it matches the current platform.
10
- - Fix `#install` methods so they all return true/false.
11
-
12
- 0.11.7
13
- ===
14
- - Fix bug causing platform-specific gems to be installed from source even if they were already present in the backend.
15
-
16
- 0.11.6
17
- ===
18
- - Fix bug causing native extension compile errors.
19
- - Fix bug causing executables to not be included in tarballs.
20
- - Fix bug (maybe introduced by bundler 2?) causing incorrect directory to be tarred. Directory can now include platform apparently.
21
-
22
- 0.11.5
23
- ===
24
- - Add `--retry` flag to CLI (currently does nothing).
25
-
26
- 0.11.4
27
- ===
28
- - Ensure .bundle/config directory exists before writing to it.
29
-
30
- 0.11.3
31
- ===
32
- - Support (well, add stubs for) `ruby` and `git_source` methods in Gemfiles.
33
- - Don't attempt to install gems we can't get a spec for.
34
-
35
- 0.11.2
36
- ===
37
- - Always run `bundle install` just in case.
38
- - Make sure `bundle check` is the _last_ thing that runs.
39
-
40
- 0.11.1
41
- ===
42
- - Exit with nonzero status code if fallback `bundle install` fails.
43
-
44
- 0.11.0
45
- ===
46
- - Allow the caller to pass in a s3 client for non-standard setups
47
-
48
- 0.10.0
49
- ===
50
- - Update aws-sdk client creation to be able to support non-aws s3 api endpoints (e.g. minio)
51
-
52
- 0.9.1
53
- ===
54
- - Woops, also use platform version when determining the gems that have already been built.
55
- - Fix the subsetter so it outputs gems inside correct source blocks.
56
-
57
- 0.9.0
58
- ===
59
- - Include platform version when uploading gem tarballs to the storage backend (this will cause bundles installed by previous versions of prebundler to be rebuilt).
60
-
61
- 0.8.1
62
- ===
63
- - Fix bug causing config to not be loaded.
64
-
65
- 0.8.0
66
- ===
67
- - Add the subset command for generating subsets of gemfiles.
68
-
69
- 0.7.2
70
- ===
71
- - Fix use of continuation token when listing remote files in S3 backend.
72
-
73
- 0.7.1
74
- ===
75
- - Support git-based gems with non-standard repo names.
76
- - Fix `bundle install` fallback (group args were wrong).
77
-
78
- 0.7.0
79
- ===
80
- - Add prefix option to install command.
81
-
82
- 0.6.2
83
- ===
84
- - Provide CLI option to generate binstubs.
85
-
86
- 0.5.2
87
- ===
88
- - Set `BUNDLE_GEMFILE` during prepare step so bundler doesn't complain when we try to call `Bundler.app_config_path`.
89
-
90
- 0.5.1
91
- ===
92
- - Remove pry-byebug require.
93
-
94
- 0.5.0
95
- ===
96
- - Works for a repository with a significant number of dependencies (~ 400).
97
- - Testing on staging server indicates bundle is installed correctly.
98
-
99
- 0.0.4
100
- ===
101
- - Pass bundle path to `gem install`.
102
-
103
- 0.0.3
104
- ===
105
- - Add --with and --without flags to install command.
106
-
107
- 0.0.2
108
- ===
109
- - Better CLI interface.
110
-
111
- 0.0.1
112
- ===
113
- - Birthday!
1
+ ## 0.13.0
2
+ * Support the `eval_gemfile` function in gemfiles.
3
+ * Avoid shelling out to the `tar` command.
4
+ - The GNU and BSD versions annoyingly don't accept the same flags, meaning Prebundler can succeed or fail depending on the system it's run on.
5
+ - All tar files are now read and written using pure Ruby.
6
+ * Upgrade S3 client to non-EOL version.
7
+ * Stop ignoring gems that don't match the current platform.
8
+ - Prebundler shells out to `gem install` when installing individual gems. Older versions of rubygems would fetch gems for the "ruby" platform when the `--ignore-dependencies` option was given, ignoring any platform-specific gems. This resulted in either a) unnecessarily building a bunch of native extensions, or b) installing a gem for the wrong platform (i.e. when no gem existed for the "ruby" platform, eg. helm-rb). I addressed the problem by instructing Prebundler to ignore gems with native extensions, relying on `bundle install` to fix them up. However, the bug has been fixed in modern versions of rubygems, so we can stop ignoring gems.
9
+ * Run `bundle lock` before storing or installing gems to make sure the lockfile matches the Gemfile.
10
+
11
+ ## 0.12.0
12
+ * Switch out ohai for ohey, which has many fewer dependencies.
13
+
14
+ ## 0.11.8
15
+ * Don't store gems in the backend if they failed to install.
16
+ * Use an absolute bundle path.
17
+ * Only consider a gem from the lockfile if it matches the current platform.
18
+ * Fix `#install` methods so they all return true/false.
19
+
20
+ ## 0.11.7
21
+ * Fix bug causing platform-specific gems to be installed from source even if they were already present in the backend.
22
+
23
+ ## 0.11.6
24
+ * Fix bug causing native extension compile errors.
25
+ * Fix bug causing executables to not be included in tarballs.
26
+ * Fix bug (maybe introduced by bundler 2?) causing incorrect directory to be tarred. Directory can now include platform apparently.
27
+
28
+ ## 0.11.5
29
+ * Add `--retry` flag to CLI (currently does nothing).
30
+
31
+ ## 0.11.4
32
+ * Ensure .bundle/config directory exists before writing to it.
33
+
34
+ ## 0.11.3
35
+ * Support (well, add stubs for) `ruby` and `git_source` methods in Gemfiles.
36
+ * Don't attempt to install gems we can't get a spec for.
37
+
38
+ ## 0.11.2
39
+ * Always run `bundle install` just in case.
40
+ * Make sure `bundle check` is the _last_ thing that runs.
41
+
42
+ ## 0.11.1
43
+ * Exit with nonzero status code if fallback `bundle install` fails.
44
+
45
+ ## 0.11.0
46
+ * Allow the caller to pass in a s3 client for non-standard setups
47
+
48
+ ## 0.10.0
49
+ * Update aws-sdk client creation to be able to support non-aws s3 api endpoints (e.g. minio)
50
+
51
+ ## 0.9.1
52
+ * Woops, also use platform version when determining the gems that have already been built.
53
+ * Fix the subsetter so it outputs gems inside correct source blocks.
54
+
55
+ ## 0.9.0
56
+ * Include platform version when uploading gem tarballs to the storage backend (this will cause bundles installed by previous versions of prebundler to be rebuilt).
57
+
58
+ ## 0.8.1
59
+ * Fix bug causing config to not be loaded.
60
+
61
+ ## 0.8.0
62
+ * Add the subset command for generating subsets of gemfiles.
63
+
64
+ ## 0.7.2
65
+ * Fix use of continuation token when listing remote files in S3 backend.
66
+
67
+ ## 0.7.1
68
+ * Support git-based gems with non-standard repo names.
69
+ * Fix `bundle install` fallback (group args were wrong).
70
+
71
+ ## 0.7.0
72
+ * Add prefix option to install command.
73
+
74
+ ## 0.6.2
75
+ * Provide CLI option to generate binstubs.
76
+
77
+ ## 0.5.2
78
+ * Set `BUNDLE_GEMFILE` during prepare step so bundler doesn't complain when we try to call `Bundler.app_config_path`.
79
+
80
+ ## 0.5.1
81
+ * Remove pry-byebug require.
82
+
83
+ ## 0.5.0
84
+ * Works for a repository with a significant number of dependencies (~ 400).
85
+ * Testing on staging server indicates bundle is installed correctly.
86
+
87
+ ## 0.0.4
88
+ * Pass bundle path to `gem install`.
89
+
90
+ ## 0.0.3
91
+ * Add --with and --without flags to install command.
92
+
93
+ ## 0.0.2
94
+ * Better CLI interface.
95
+
96
+ ## 0.0.1
97
+ * Birthday!
@@ -17,6 +17,7 @@ module Prebundler
17
17
 
18
18
  class Install < Base
19
19
  def run
20
+ lock
20
21
  prepare
21
22
  install
22
23
  update_bundle_config
@@ -30,6 +31,10 @@ module Prebundler
30
31
 
31
32
  private
32
33
 
34
+ def lock
35
+ system "bundle lock --gemfile #{gemfile_path}"
36
+ end
37
+
33
38
  def prepare
34
39
  FileUtils.mkdir_p(bundle_path)
35
40
  ENV['BUNDLE_GEMFILE'] = gemfile_path
@@ -1,3 +1,4 @@
1
+ require 'rubygems/package'
1
2
  require 'fileutils'
2
3
  require 'set'
3
4
 
@@ -48,8 +49,9 @@ module Prebundler
48
49
  end
49
50
 
50
51
  def install
51
- # NOTE: the --platform argument doesn't work when --ignore-dependencies
52
- # is specified, no idea why
52
+ # NOTE: the --platform argument used to not work when --ignore-dependencies
53
+ # was specified, but has been fixed in modern versions of rubygems. See:
54
+ # https://github.com/rubygems/rubygems/pull/2446 for a very long rabbit hole.
53
55
  Bundler.with_unbundled_env do
54
56
  system(
55
57
  { "GEM_HOME" => bundle_path },
@@ -64,26 +66,44 @@ module Prebundler
64
66
  end
65
67
 
66
68
  def install_from_tar(tar_file)
67
- system "tar -C #{bundle_path} -xf #{tar_file}"
68
- $?.exitstatus == 0
69
- end
70
-
71
- def add_to_tar(tar_file)
72
- tar_flags = File.exist?(tar_file) ? '-rf' : '-cf'
73
-
74
- system "tar -C #{bundle_path} #{tar_flags} #{tar_file} #{relative_gem_dir}"
75
-
76
- relative_gemspec_files.each do |relative_gemspec_file|
77
- system "tar -C #{bundle_path} -rf #{tar_file} #{relative_gemspec_file}"
69
+ File.open(tar_file) do |f|
70
+ Gem::Package::TarReader.new(f) do |tar|
71
+ tar.each do |entry|
72
+ path = File.join(bundle_path, entry.full_name)
73
+
74
+ if entry.directory?
75
+ FileUtils.mkdir_p(path)
76
+ else
77
+ FileUtils.mkdir_p(File.dirname(path))
78
+ File.open(path, 'wb') do |new_file|
79
+ new_file.write(entry.read)
80
+ end
81
+ end
82
+ end
83
+ end
78
84
  end
79
85
 
80
- if File.directory?(extension_dir)
81
- system "tar -C #{bundle_path} -rf #{tar_file} #{relative_extension_dir}"
82
- end
86
+ true
87
+ rescue => e
88
+ return false
89
+ end
83
90
 
84
- gemspecs.each do |gemspec|
85
- gemspec.executables.each do |executable|
86
- system "tar -C #{bundle_path} -rf #{tar_file} #{File.join(relative_gem_dir, gemspec.bindir, executable)}"
91
+ def add_to_tar(tar_file)
92
+ File.open(tar_file, 'wb') do |f|
93
+ Gem::Package::TarWriter.new(f) do |tar_io|
94
+ Dir.chdir(bundle_path) do
95
+ add_files_to_tar(
96
+ tar_io, Dir.glob(File.join(relative_gem_dir, '**', '*'))
97
+ )
98
+
99
+ add_files_to_tar(tar_io, relative_gemspec_files)
100
+
101
+ if File.directory?(extension_dir)
102
+ add_files_to_tar(
103
+ tar_io, Dir.glob(File.join(relative_extension_dir, '**', '*'))
104
+ )
105
+ end
106
+ end
87
107
  end
88
108
  end
89
109
  end
@@ -155,6 +175,17 @@ module Prebundler
155
175
 
156
176
  private
157
177
 
178
+ def add_files_to_tar(tar_io, files)
179
+ files.each do |file|
180
+ next if File.directory?(file)
181
+
182
+ mode = File.stat(file).mode
183
+ tar_io.add_file(file, mode) do |new_file|
184
+ new_file.write(File.binread(file))
185
+ end
186
+ end
187
+ end
188
+
158
189
  def find_platform_dir(base)
159
190
  platform = Bundler.local_platform.to_a
160
191
 
@@ -17,11 +17,8 @@ module Prebundler
17
17
  instance_eval(File.read(gemfile_path))
18
18
 
19
19
  lockfile = Bundler::LockfileParser.new(File.read("#{gemfile_path}.lock"))
20
- local_platform = Bundler.local_platform.to_s
21
20
 
22
21
  lockfile.specs.each do |spec|
23
- next if spec.platform != 'ruby' && spec.platform.to_s != local_platform
24
-
25
22
  gems[spec.name] ||= GemRef.create(spec.name, bundle_path, options)
26
23
  gems[spec.name].spec = spec
27
24
  gems[spec.name].dependencies = spec.dependencies.map(&:name)
@@ -76,5 +73,9 @@ module Prebundler
76
73
  def gemspec
77
74
  # do nothing
78
75
  end
76
+
77
+ def eval_gemfile(path)
78
+ instance_eval(File.read(path))
79
+ end
79
80
  end
80
81
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'aws-sdk'
3
+ require 'aws-sdk-s3'
4
4
 
5
5
  module Prebundler
6
6
  class S3Backend
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Prebundler
4
- VERSION = '0.12.0'
4
+ VERSION = '0.13.0'
5
5
  end
data/prebundler.gemspec CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.add_dependency 'ohey', '~> 1.0'
18
18
 
19
19
  # @TODO: move s3 support into separate gem
20
- s.add_dependency 'aws-sdk', '~> 2.0'
20
+ s.add_dependency 'aws-sdk-s3', '~> 1.0'
21
21
 
22
22
  s.executables << 'prebundle'
23
23
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prebundler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cameron Dutro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-09 00:00:00.000000000 Z
11
+ date: 2022-01-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -67,19 +67,19 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: aws-sdk
70
+ name: aws-sdk-s3
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '2.0'
75
+ version: '1.0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '2.0'
82
+ version: '1.0'
83
83
  description: Gem dependency prebuilder
84
84
  email:
85
85
  - camertron@gmail.com
@@ -129,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
129
  - !ruby/object:Gem::Version
130
130
  version: '0'
131
131
  requirements: []
132
- rubygems_version: 3.1.4
132
+ rubygems_version: 3.3.3
133
133
  signing_key:
134
134
  specification_version: 4
135
135
  summary: Gem dependency prebuilder