summaryrefslogtreecommitdiff
path: root/lib/bundler/process_lock.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/bundler/process_lock.rb')
-rw-r--r--lib/bundler/process_lock.rb24
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