Skip to content

Commit

Permalink
save the known repositories
Browse files Browse the repository at this point in the history
  • Loading branch information
lslezak committed Feb 12, 2019
1 parent 802db30 commit 2e0b21d
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 49 deletions.
41 changes: 23 additions & 18 deletions src/clients/sw_single.rb
Expand Up @@ -7,6 +7,9 @@
#
require "shellwords"

require "y2packager/known_repositories"
require "y2packager/system_packages"

module Yast
# Purpose: contains dialog loop for workflows:
# "Install/Remove software"
Expand Down Expand Up @@ -451,24 +454,7 @@ def GetPackagerOptions

# use default parameters for missing or invalid values
if mode.nil?
original_solver_flags = Pkg.GetSolverFlags

# solver flags for selecting minimal recommended packages (e.g. drivers)
Pkg.SetSolverFlags(
"ignoreAlreadyRecommended" => false,
"onlyRequires" => true
)
# select the packages
Pkg.PkgSolve(true)

# re-select the packages by YaST otherwise they would be unselected by the next solver run
pkgs = Pkg.ResolvableProperties("", :package, "")
pkgs = pkgs.select { |p| p["status"] == :selected }.map { |p| p["name"] }
log.info "Preselected system packages: #{pkgs.inspect}"
pkgs.each { |p| Pkg.PkgInstall(p) }

# set back the original solver flags
Pkg.SetSolverFlags(original_solver_flags)
preselect_system_packages

# use summary mode if there is something to install
# (probably a suggested or recommended package) (bnc#465194)
Expand All @@ -487,6 +473,22 @@ def GetPackagerOptions
deep_copy(ret)
end

# select the system packages (drivers) from the new repositories
def preselect_system_packages
known_repos = Y2Packager::KnownRepositories.new
system_packages = Y2Packager::SystemPackages.new(known_repos.new_repositories)
system_packages.select
end

def save_known_repositories
known_repos = Y2Packager::KnownRepositories.new
# nothing new, no need to update the file
return if known_repos.new_repositories.empty?

known_repos.update
known_repos.write
end

# =============================================================
def StartSWSingle
Wizard.CreateDialog
Expand Down Expand Up @@ -787,6 +789,9 @@ def StartSWSingle
Builtins.size(@packagelist).zero?
force_restart = true
end

# remember the current repositories for the next time
save_known_repositories
end
end
end while force_restart
Expand Down
29 changes: 23 additions & 6 deletions src/lib/y2packager/known_repositories.rb
Expand Up @@ -18,25 +18,36 @@ module Y2Packager
class KnownRepositories
include Yast::Logger

STATUS_FILE = "/var/lib/YaST2/known_repositories.yaml".freeze
STATUS_FILE = "/var/lib/YaST2/system_packages_repos.yaml".freeze

# @return [String] Products on the medium
attr_reader :repositories

# Constructor
def initialize
Yast.import "Pkg"
@repositories = []
end

def repositories
@repositories ||= read_repositories
end

def write
current = current_repositories
log.info("Writing known repositories #{current.inspect} to #{status_file}")
File.write(status_file, current.to_yaml)
log.info("Writing known repositories #{repositories.inspect} to #{status_file}")

# accessible only for the root user, the repository URLs should not contain
# any passwords but rather be safe than sorry
File.open(status_file, "w", 0o600) do |f|
f.write(repositories.to_yaml)
end
end

def update
# add the current repositories
repositories.concat(current_repositories)
# remove duplicates and sort them
@repositories.uniq!
@repositories.sort!
end

#
Expand All @@ -45,7 +56,12 @@ def write
# @return [Array<String>] List of new repositories (URLs)
#
def new_repositories
current_repositories - repositories
log.info "current repositories: #{current_repositories.inspect}"
log.info "known repositories: #{repositories.inspect}"

new_repos = current_repositories - repositories
log.info "New repositories: #{new_repos.inspect}"
new_repos
end

private
Expand Down Expand Up @@ -75,6 +91,7 @@ def current_repositories
end

def status_file
# add the current target prefix
File.join(Yast::WFM.scr_root, STATUS_FILE)
end
end
Expand Down
77 changes: 52 additions & 25 deletions src/lib/y2packager/system_packages.rb
Expand Up @@ -15,49 +15,76 @@
module Y2Packager
# Preselect the system packages
class SystemPackages
def find(repository_urls)
return [] if repository_urls.empty?
include Yast::Logger

original_solver_flags = Pkg.GetSolverFlags
# @return [Array<String>] Repositories from which the driver packages should be selected
attr_reader :repositories

# solver flags for selecting minimal recommended packages (e.g. drivers)
Pkg.SetSolverFlags(
"ignoreAlreadyRecommended" => false,
"onlyRequires" => true
)
# select the packages
Pkg.PkgSolve(true)

ids = repo_ids(repository_urls)

# re-select the packages by YaST otherwise they would be unselected by the next solver run
pkgs = Pkg.ResolvableProperties("", :package, "")
pkgs = pkgs.select { |p| p["status"] == :selected && ids.include?(p["source"]) }

# set back the original solver flags
Pkg.SetSolverFlags(original_solver_flags)
#
# Constructor
#
# @param repository_urls [Array<String>] Repositories from which the driver packages should be selected
#
def initialize(repository_urls)
log.info "System packages repositories: #{repository_urls.inspect}"
@repositories = repository_urls
end

pkgs.map { |p| p["name"] }
def packages
@packages ||= find_packages
end

def select(repository_urls)
pkgs = find(repository_urls)
log.info "Preselected system packages: #{pkgs.inspect}"
pkgs.each { |p| Pkg.PkgInstall(p) }
def select
return if packages.empty?
log.info "Preselecting system packages: #{packages.inspect}"
packages.each { |p| Yast::Pkg.PkgInstall(p) }
end

private

#
# Create repository ID to URL mapping
#
# @return [Array<Integer>] List of reposit
# @return [Array<Integer>] List of repository IDs
#
def repo_ids(urls)
repo_ids = Yast::Pkg.SourceGetCurrent(true)
repo_ids.each_with_object([]) do |i, list|
list << i if urls.include?(Yast::Pkg.SourceGeneralData(i)["url"])
end
end

def find_packages
if repositories.empty?
log.info "No new repository found, not searching system packages"
return []
end

original_solver_flags = Yast::Pkg.GetSolverFlags

# solver flags for selecting minimal recommended packages (e.g. drivers)
Yast::Pkg.SetSolverFlags(
"ignoreAlreadyRecommended" => false,
"onlyRequires" => true
)
# select the packages
Yast::Pkg.PkgSolve(true)

ids = repo_ids(repositories)

pkgs = Yast::Pkg.ResolvableProperties("", :package, "")
pkgs = pkgs.select do |p|
# the packages from the specified repositories selected by the solver
p["status"] == :selected && ids.include?(p["source"]) && p["transact_by"] == :solver
end

# set back the original solver flags
Yast::Pkg.SetSolverFlags(original_solver_flags)

pkgs.map! { |p| p["name"] }
log.info "Found system packages: #{pkgs}"

pkgs
end
end
end

0 comments on commit 2e0b21d

Please sign in to comment.