class Inspec::RelativeFileProvider

def abs_path(file)

def abs_path(file)
  return nil if file.nil?
  prefix + file
end

def binread(file)

def binread(file)
  parent.binread(abs_path(file))
end

def get_files_prefix(fs)

def get_files_prefix(fs)
  return '' if fs.empty?
  file = fs[0]
  bn = File.basename(file)
  # no more prefixes
  return '' if bn == file
  i = file.rindex(bn)
  pre = file[0..i-1]
  rest = fs.find_all { |f| !f.start_with?(pre) }
  return pre if rest.empty?
  new_pre = get_prefix(rest)
  return new_pre if pre.start_with? new_pre
  # edge case: completely different prefixes; retry prefix detection
  a = File.dirname(pre + 'a')
  b = File.dirname(new_pre + 'b')
  get_prefix([a, b])
end

def get_folder_prefix(fs)

def get_folder_prefix(fs)
  return get_files_prefix(fs) if fs.length == 1
  first, *rest = fs
  pre = prefix_candidate_for(first)
  if rest.all? { |i| i.start_with? pre }
    return get_folder_prefix(rest)
  end
  get_files_prefix(fs)
end

def get_prefix(fs)

def get_prefix(fs)
  return '' if fs.empty?
  # filter backlisted files
  fs -= BLACKLIST_FILES
  sorted = fs.sort_by(&:length)
  get_folder_prefix(sorted)
end

def initialize(parent_provider)

def initialize(parent_provider)
  @parent = parent_provider
  @prefix = get_prefix(parent.files)
  if @prefix.nil?
    raise "Could not determine path prefix for #{parent}"
  end
  # select all files that begin with the prefix, and strip off the prefix from the file.
  #
  # strip off any leading top-level relative path (./) which is common in
  # PAX-formatted tar files. Do not do any translation of the path if the
  # path is an absolute path.
  @files = parent.files
                 .find_all { |x| x.start_with?(prefix) && x != prefix }
                 .map { |x| x[prefix.length..-1] }
                 .map do |x|
                   path = Pathname.new(x)
                   path.absolute? ? path.to_s : path.relative_path_from(Pathname.new('.')).to_s
                 end
end

def prefix_candidate_for(file)

def prefix_candidate_for(file)
  if file.end_with?(File::SEPARATOR)
    file
  else
    file + File::SEPARATOR
  end
end

def read(file)

def read(file)
  parent.read(abs_path(file))
end