diff options
Diffstat (limited to 'lib/bundler/process_lock.rb')
| -rw-r--r-- | lib/bundler/process_lock.rb | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/lib/bundler/process_lock.rb b/lib/bundler/process_lock.rb index 4bd6931577..784b17e363 100644 --- a/lib/bundler/process_lock.rb +++ b/lib/bundler/process_lock.rb @@ -2,23 +2,19 @@ module Bundler class ProcessLock - def self.lock(bundle_path = Bundler.bundle_path) + def self.lock(bundle_path = Bundler.bundle_path, &block) lock_file_path = File.join(bundle_path, "bundler.lock") - has_lock = false + base_lock_file_path = lock_file_path.delete_suffix(".lock") - File.open(lock_file_path, "w") do |f| - f.flock(File::LOCK_EX) - has_lock = true - yield - f.flock(File::LOCK_UN) + require "fileutils" if Bundler.rubygems.provides?("< 3.6.0") + + begin + SharedHelpers.filesystem_access(lock_file_path, :write) do + Gem.open_file_with_lock(base_lock_file_path, &block) + end + rescue PermissionError + block.call end - rescue Errno::EACCES, Errno::ENOLCK - # In the case the user does not have access to - # create the lock file or is using NFS where - # locks are not available we skip locking. - yield - ensure - FileUtils.rm_f(lock_file_path) if has_lock end end end |
