[rubygems/rubygems] Don't show bug report template when GEM_HOME has no writable bit

Instead, don't check that at all and proceed. If something fails to be
written inside GEM_HOME, we'll eventually fail with a proper permissions
error.

In addition to that, the writable bit in GEM_HOME is not even reliable,
because only the immediate parent is actually checked when writing. For
example,

```
$ mkdir -p foo/bar
$ chmod -w foo
$ touch foo/bar/baz # writes without issue
```

https://github.com/rubygems/rubygems/commit/4bced7ac73
This commit is contained in:
David Rodríguez 2023-10-26 18:44:20 +02:00 коммит произвёл Hiroshi SHIBATA
Родитель 2d719cd146
Коммит 7f7a7f13ed
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: F9CF13417264FAC2
2 изменённых файлов: 43 добавлений и 0 удалений

Просмотреть файл

@ -45,6 +45,14 @@ module Bundler
spec
end
def pre_install_checks
super
rescue Gem::FilePermissionError
# Ignore permission checks in RubyGems. Instead, go on, and try to write
# for real. We properly handle permission errors when they happen.
nil
end
def generate_plugins
return unless Gem::Installer.instance_methods(false).include?(:generate_plugins)

Просмотреть файл

@ -792,6 +792,41 @@ RSpec.describe "bundle install with gem sources" do
end
end
describe "when gem home does not have the writable bit set, yet it's still writable", :permissions do
let(:gem_home) { bundled_app("vendor/#{Bundler.ruby_scope}") }
before do
build_repo4 do
build_gem "foo", "1.0.0" do |s|
s.write "CHANGELOG.md", "foo"
end
end
gemfile <<-G
source "#{file_uri_for(gem_repo4)}"
gem 'foo'
G
end
it "should display a proper message to explain the problem" do
bundle "config set --local path vendor"
bundle :install
expect(out).to include("Bundle complete!")
expect(err).to be_empty
FileUtils.chmod("-w", gem_home)
begin
bundle "install --redownload"
ensure
FileUtils.chmod("+w", gem_home)
end
expect(out).to include("Bundle complete!")
expect(err).to be_empty
end
end
describe "when bundle cache path does not have write access", :permissions do
let(:cache_path) { bundled_app("vendor/#{Bundler.ruby_scope}/cache") }