Add two specs for choosing platform specific gems by larskanis · Pull Request #6247 · rubygems/bundler

@larskanis

The first spec succeeds, but the second spec fails currently.

@segiddins

…gem to be the only option

kou added a commit to kou/bundler that referenced this pull request

Dec 29, 2019
It resolves rubygems#6247. This changes includes the patches that add (RSpec)
specs for this situation in rubygems#6247.

If there is a platform specific gem but it can't be resolved available
version, Bundler reports an error.

For example,

    @index = build_index do
      gem "bar", "1.0.0"
      gem "foo", "1.0.0"
      gem "foo", "1.0.0", "x64-mingw32" do
        dep "bar", "< 1"
      end
    end
    dep "foo"
    platforms "x64-mingw32"

raises an error because foo-1.0.0-x64-mingw32 requires bar<1 but there
isn't bar<1.

With this change, foo-1.0.0 (no x64-mingw32) is used as
fallback. Because foo-1.0.0 doesn't depend on bar<1.

kou added a commit to kou/bundler that referenced this pull request

Dec 29, 2019
It resolves rubygems#6247. This changes includes the patches that add (RSpec)
specs for this situation in rubygems#6247.

If there is a platform specific gem but it can't be resolved available
version, Bundler reports an error.

For example,

    @index = build_index do
      gem "bar", "1.0.0"
      gem "foo", "1.0.0"
      gem "foo", "1.0.0", "x64-mingw32" do
        dep "bar", "< 1"
      end
    end
    dep "foo"
    platforms "x64-mingw32"

raises an error because foo-1.0.0-x64-mingw32 requires bar<1 but there
isn't bar<1.

With this change, foo-1.0.0 (no x64-mingw32) is used as
fallback. Because foo-1.0.0 doesn't depend on bar<1.

kou added a commit to kou/bundler that referenced this pull request

Dec 29, 2019
It resolves rubygems#6247. This changes includes the patches that add (RSpec)
specs for this situation in rubygems#6247.

If there is a platform specific gem but it can't be resolved available
version, Bundler reports an error.

For example,

    @index = build_index do
      gem "bar", "1.0.0"
      gem "foo", "1.0.0"
      gem "foo", "1.0.0", "x64-mingw32" do
        dep "bar", "< 1"
      end
    end
    dep "foo"
    platforms "x64-mingw32"

raises an error because foo-1.0.0-x64-mingw32 requires bar<1 but there
isn't bar<1.

With this change, foo-1.0.0 (no x64-mingw32) is used as
fallback. Because foo-1.0.0 doesn't depend on bar<1.

@kou kou mentioned this pull request

Dec 29, 2019

kou added a commit to kou/bundler that referenced this pull request

Jan 3, 2020
It resolves rubygems#6247. This changes includes the patches that add (RSpec)
specs for this situation in rubygems#6247.

If there is a platform specific gem but it can't be resolved available
version, Bundler reports an error.

For example,

    @index = build_index do
      gem "bar", "1.0.0"
      gem "foo", "1.0.0"
      gem "foo", "1.0.0", "x64-mingw32" do
        dep "bar", "< 1"
      end
    end
    dep "foo"
    platforms "x64-mingw32"

raises an error because foo-1.0.0-x64-mingw32 requires bar<1 but there
isn't bar<1.

With this change, foo-1.0.0 (no x64-mingw32) is used as
fallback. Because foo-1.0.0 doesn't depend on bar<1.

kou added a commit to kou/bundler that referenced this pull request

Jan 5, 2020
It resolves rubygems#6247. This changes includes the patches that add (RSpec)
specs for this situation in rubygems#6247.

If there is a platform specific gem but it can't be resolved available
version, Bundler reports an error.

For example,

    @index = build_index do
      gem "bar", "1.0.0"
      gem "foo", "1.0.0"
      gem "foo", "1.0.0", "x64-mingw32" do
        dep "bar", "< 1"
      end
    end
    dep "foo"
    platforms "x64-mingw32"

raises an error because foo-1.0.0-x64-mingw32 requires bar<1 but there
isn't bar<1.

With this change, foo-1.0.0 (no x64-mingw32) is used as
fallback. Because foo-1.0.0 doesn't depend on bar<1.

kou added a commit to kou/bundler that referenced this pull request

Jan 7, 2020
It resolves rubygems#6247. This changes includes the patches that add (RSpec)
specs for this situation in rubygems#6247.

If there is a platform specific gem but it can't be resolved available
version, Bundler reports an error.

For example,

    @index = build_index do
      gem "bar", "1.0.0"
      gem "foo", "1.0.0"
      gem "foo", "1.0.0", "x64-mingw32" do
        dep "bar", "< 1"
      end
    end
    dep "foo"
    platforms "x64-mingw32"

raises an error because foo-1.0.0-x64-mingw32 requires bar<1 but there
isn't bar<1.

With this change, foo-1.0.0 (no x64-mingw32) is used as
fallback. Because foo-1.0.0 doesn't depend on bar<1.

kou added a commit to kou/bundler that referenced this pull request

Jan 14, 2020
It resolves rubygems#6247. This changes includes the patches that add (RSpec)
specs for this situation in rubygems#6247.

If there is a platform specific gem but it can't be resolved available
version, Bundler reports an error.

For example,

    @index = build_index do
      gem "bar", "1.0.0"
      gem "foo", "1.0.0"
      gem "foo", "1.0.0", "x64-mingw32" do
        dep "bar", "< 1"
      end
    end
    dep "foo"
    platforms "x64-mingw32"

raises an error because foo-1.0.0-x64-mingw32 requires bar<1 but there
isn't bar<1.

With this change, foo-1.0.0 (no x64-mingw32) is used as
fallback. Because foo-1.0.0 doesn't depend on bar<1.

ghost pushed a commit that referenced this pull request

Jan 16, 2020
7522: Improve platform specific gem resolution r=deivid-rodriguez a=kou

### What was the end-user problem that led to this PR?

Platform specific gems aren't resolved when platform specific gems are conflicted.

For example, in the following situation, foo-1.0.0-x64-mingw32 that requires bar<1 is conflicted because there is no bar<1. Without this change, Bundler raises a conflict error. But users can use foo-1.0.0 (no x64-mingw32) in this situation. With this change, Bundler resolves to foo-1.0.0 (no x64-mingw32).

```ruby
@index = build_index do
  gem "bar", "1.0.0"
  gem "foo", "1.0.0"
  gem "foo", "1.0.0", "x64-mingw32" do
    dep "bar", "< 1"
  end
end
dep "foo"
platforms "x64-mingw32"
````

See also #6247. This change includes the specs that were added in #6247.

### What was your diagnosis of the problem?

Not platform specific gem (foo-1.0.0 in the above case) isn't tried to be resolved when platform specific gem (foo-1.0.0-x64-mingw32 in the above case) is available.

### What is your fix for the problem, implemented in this PR?

In this PR, not platform specific gem (foo-1.0.0 in the above case) is also tried to be resolved even when platform specific gem (foo-1.0.0-x64-mingw32 in the above case) is available. Priority is "platform specific gem" -> "not platform specific gem". So platform specific gem is usable, platform specific gem is used. Not platform specific gem is used as fallback.

`search_for` represents this. Here is the `search_for` specification:
https://github.com/bundler/bundler/blob/master/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb#L11-L13

> Search for the specifications that match the given dependency. The specifications in the returned array will be considered in reverse order, so the latest version ought to be last.

## Why did you choose this fix out of the possible options?

I choose this fix because this is based on Molinillo's specification.

Co-authored-by: Lars Kanis <lars@greiz-reinsdorf.de>
Co-authored-by: Samuel Giddins <segiddins@segiddins.me>
Co-authored-by: Sutou Kouhei <kou@clear-code.com>