class RuboCop::Server::Cache

Caches the states of server process. @api private

Constants

GEMFILE_NAMES
LOCKFILE_NAMES

Attributes

cache_root_path[RW]

Public Class Methods

acquire_lock() { |flock_result != false| ... } click to toggle source
# File lib/rubocop/server/cache.rb, line 138
def acquire_lock
  lock_file = File.open(lock_path, File::CREAT)
  # flock returns 0 if successful, and false if not.
  flock_result = lock_file.flock(File::LOCK_EX | File::LOCK_NB)
  yield flock_result != false
ensure
  lock_file.flock(File::LOCK_UN)
  lock_file.close
end
cache_path() click to toggle source
# File lib/rubocop/server/cache.rb, line 65
def cache_path
  cache_root_dir = if cache_root_path
                     File.join(cache_root_path, 'rubocop_cache')
                   else
                     cache_root_dir_from_config
                   end

  File.expand_path(File.join(cache_root_dir, 'server'))
end
cache_root_dir_from_config() click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/rubocop/server/cache.rb, line 76
def cache_root_dir_from_config
  CacheConfig.root_dir do
    # `RuboCop::ConfigStore` has heavy dependencies, this is a lightweight implementation
    # so that only the necessary `CacheRootDirectory` can be obtained.
    config_path = ConfigFinder.find_config_path(Dir.pwd)
    file_contents = File.read(config_path)

    # Returns early if `CacheRootDirectory` is not used before requiring `erb` or `yaml`.
    next unless file_contents.include?('CacheRootDirectory')

    require 'erb'
    yaml_code = ERB.new(file_contents).result

    require 'yaml'
    config_yaml = YAML.safe_load(
      yaml_code, permitted_classes: [Regexp, Symbol], aliases: true
    )

    # For compatibility with Ruby 3.0 or lower.
    if Gem::Version.new(Psych::VERSION) < Gem::Version.new('4.0.0')
      config_yaml == false ? nil : config_yaml
    end

    config_yaml&.dig('AllCops', 'CacheRootDirectory')
  end
end
dir() click to toggle source

rubocop:enable Metrics/AbcSize

# File lib/rubocop/server/cache.rb, line 59
def dir
  Pathname.new(File.join(cache_path, project_dir_cache_key)).tap do |d|
    d.mkpath unless d.exist?
  end
end
lock_path() click to toggle source
# File lib/rubocop/server/cache.rb, line 116
def lock_path
  dir.join('lock')
end
pid_path() click to toggle source
# File lib/rubocop/server/cache.rb, line 112
def pid_path
  dir.join('pid')
end
pid_running?() click to toggle source
# File lib/rubocop/server/cache.rb, line 132
def pid_running?
  Process.kill(0, pid_path.read.to_i) == 1
rescue Errno::ESRCH, Errno::ENOENT, Errno::EACCES, Errno::EROFS, Errno::ENAMETOOLONG
  false
end
port_path() click to toggle source

rubocop:enable Metrics/MethodLength

# File lib/rubocop/server/cache.rb, line 104
def port_path
  dir.join('port')
end
project_dir() click to toggle source

Searches for Gemfile or gems.rb in the current dir or any parent dirs

# File lib/rubocop/server/cache.rb, line 29
def project_dir
  current_dir = Dir.pwd
  while current_dir != '/'
    return current_dir if GEMFILE_NAMES.any? do |gemfile|
      File.exist?(File.join(current_dir, gemfile))
    end

    current_dir = File.expand_path('..', current_dir)
  end
  # If we can't find a Gemfile, just use the current directory
  Dir.pwd
end
project_dir_cache_key() click to toggle source
# File lib/rubocop/server/cache.rb, line 42
def project_dir_cache_key
  @project_dir_cache_key ||= project_dir[1..].tr('/', '+')
end
restart_key() click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/rubocop/server/cache.rb, line 47
def restart_key
  lockfile_path = LOCKFILE_NAMES.map do |lockfile_name|
    Pathname(project_dir).join(lockfile_name)
  end.find(&:exist?)
  version_data = lockfile_path&.read || RuboCop::Version::STRING
  config_data = Pathname(ConfigFinder.find_config_path(Dir.pwd)).read
  todo_data = (rubocop_todo = Pathname('.rubocop_todo.yml')).exist? ? rubocop_todo.read : ''

  Digest::SHA1.hexdigest(version_data + config_data + todo_data)
end
status_path() click to toggle source
# File lib/rubocop/server/cache.rb, line 120
def status_path
  dir.join('status')
end
stderr_path() click to toggle source
# File lib/rubocop/server/cache.rb, line 128
def stderr_path
  dir.join('stderr')
end
token_path() click to toggle source
# File lib/rubocop/server/cache.rb, line 108
def token_path
  dir.join('token')
end
version_path() click to toggle source
# File lib/rubocop/server/cache.rb, line 124
def version_path
  dir.join('version')
end
write_pid_file() { || ... } click to toggle source
# File lib/rubocop/server/cache.rb, line 153
def write_pid_file
  pid_path.write(Process.pid)
  yield
ensure
  dir.rmtree
end
write_port_and_token_files(port:, token:) click to toggle source
# File lib/rubocop/server/cache.rb, line 148
def write_port_and_token_files(port:, token:)
  port_path.write(port)
  token_path.write(token)
end
write_status_file(status) click to toggle source
# File lib/rubocop/server/cache.rb, line 160
def write_status_file(status)
  status_path.write(status)
end
write_version_file(version) click to toggle source
# File lib/rubocop/server/cache.rb, line 164
def write_version_file(version)
  version_path.write(version)
end