module Zypper::Upgraderepo::Traversable

Public Instance Methods

traverse_url(uri, version) click to toggle source
# File lib/zypper/upgraderepo/traversable.rb, line 6
def traverse_url(uri, version)
  ping(uri)

  if forbidden?
    res =  { url: url, message: 'Can\'t navigate through the repository!' }
  elsif available? && uri.to_s =~ /#{version}/
    res = traverse_url_forward(uri, version)
  else
    res = traverse_url_backward(uri, version)
  end

  res || { url: '', message: 'Can\'t find a valid alternative, try manually!' }
end

Private Instance Methods

drop_back_level(uri) click to toggle source
# File lib/zypper/upgraderepo/traversable.rb, line 81
def drop_back_level(uri)
  URI(url).path.split('/').index { |x| x =~ /\d\d.\d/ } - uri.path.split('/').count
end
repodata_uri(uri = nil) click to toggle source
# File lib/zypper/upgraderepo/traversable.rb, line 69
def repodata_uri(uri = nil)
  if uri
    uri = URI(uri.to_s)
  else
    uri = URI(url)
  end

  uri.path = uri.path.gsub(/\/$/, '') + '/repodata/repomd.xml'

  uri
end
traverse_url_backward(uri, version) click to toggle source
# File lib/zypper/upgraderepo/traversable.rb, line 23
def traverse_url_backward(uri, version)
  uri.path = File.dirname(uri.path)

  return nil if uri.path == '/' || uri.path == '.' || (versioned? && (drop_back_level(uri) > max_drop_back))

  uri.path += '/' if uri.path[-1] != '/'
  ping(uri, false)

  if not_found?
    return traverse_url_backward(uri, version)
  elsif available?
    if res = traverse_url_forward(uri, version)
      return res
    else
      return traverse_url_backward(uri, version)
    end
  elsif forbidden?
    return { url: uri.to_s, message: 'Try to replace with this one' } if has_repodata?(uri)

    return traverse_url_backward(uri, version)
  end

  nil
end
traverse_url_forward(uri, version) click to toggle source
# File lib/zypper/upgraderepo/traversable.rb, line 48
def traverse_url_forward(uri, version)
  uri.path += '/' if uri.path[-1] != '/'
  ping(uri, false)

  subfolders.each do |dir|
    u = URI(uri.to_s)
    u.path += dir

    if has_repodata?(u)
      if (versioned?) && (u.to_s =~ /#{version}/)
        return { url: u.to_s, message: 'Override with this one' }
      end
    else
      res = traverse_url_forward(u, version)
      return res if res.class == Hash
    end
  end

  nil
end