Hello community, here is the log from the commit of package yast2-packager for openSUSE:Factory checked in at 2019-02-19 11:57:00 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/yast2-packager (Old) and /work/SRC/openSUSE:Factory/.yast2-packager.new.28833 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "yast2-packager" Tue Feb 19 11:57:00 2019 rev:365 rq:676543 version:4.1.27 Changes: -------- --- /work/SRC/openSUSE:Factory/yast2-packager/yast2-packager.changes 2019-02-15 09:53:57.563787323 +0100 +++ /work/SRC/openSUSE:Factory/.yast2-packager.new.28833/yast2-packager.changes 2019-02-19 11:57:02.873245891 +0100 @@ -1,0 +2,7 @@ +Thu Feb 14 07:46:00 UTC 2019 - [email protected] + +- Automatically preselect the driver packages from new repositories + (bsc#953522) +- 4.1.27 + +------------------------------------------------------------------- Old: ---- yast2-packager-4.1.26.tar.bz2 New: ---- yast2-packager-4.1.27.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ yast2-packager.spec ++++++ --- /var/tmp/diff_new_pack.j0TPvo/_old 2019-02-19 11:57:04.393245065 +0100 +++ /var/tmp/diff_new_pack.j0TPvo/_new 2019-02-19 11:57:04.393245065 +0100 @@ -17,7 +17,7 @@ Name: yast2-packager -Version: 4.1.26 +Version: 4.1.27 Release: 0 BuildRoot: %{_tmppath}/%{name}-%{version}-build ++++++ yast2-packager-4.1.26.tar.bz2 -> yast2-packager-4.1.27.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-packager-4.1.26/package/yast2-packager.changes new/yast2-packager-4.1.27/package/yast2-packager.changes --- old/yast2-packager-4.1.26/package/yast2-packager.changes 2019-02-13 13:50:54.000000000 +0100 +++ new/yast2-packager-4.1.27/package/yast2-packager.changes 2019-02-15 14:27:07.000000000 +0100 @@ -1,4 +1,11 @@ ------------------------------------------------------------------- +Thu Feb 14 07:46:00 UTC 2019 - [email protected] + +- Automatically preselect the driver packages from new repositories + (bsc#953522) +- 4.1.27 + +------------------------------------------------------------------- Fri Feb 8 17:21:41 UTC 2019 - [email protected] - Replaced SuSEFirewall2 by firewalld when checking if the firewall diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-packager-4.1.26/package/yast2-packager.spec new/yast2-packager-4.1.27/package/yast2-packager.spec --- old/yast2-packager-4.1.26/package/yast2-packager.spec 2019-02-13 13:50:54.000000000 +0100 +++ new/yast2-packager-4.1.27/package/yast2-packager.spec 2019-02-15 14:27:07.000000000 +0100 @@ -17,7 +17,7 @@ Name: yast2-packager -Version: 4.1.26 +Version: 4.1.27 Release: 0 BuildRoot: %{_tmppath}/%{name}-%{version}-build diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-packager-4.1.26/src/clients/sw_single.rb new/yast2-packager-4.1.27/src/clients/sw_single.rb --- old/yast2-packager-4.1.26/src/clients/sw_single.rb 2019-02-13 13:50:54.000000000 +0100 +++ new/yast2-packager-4.1.27/src/clients/sw_single.rb 2019-02-15 14:27:07.000000000 +0100 @@ -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" @@ -449,9 +452,10 @@ # use default parameters for missing or invalid values if mode.nil? + preselect_system_packages + # use summary mode if there is something to install # (probably a suggested or recommended package) (bnc#465194) - Pkg.PkgSolve(true) # select the packages mode = if Pkg.IsAnyResolvable(:any, :to_install) || Pkg.IsAnyResolvable(:any, :to_remove) :summaryMode else @@ -467,6 +471,22 @@ 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 @@ -570,7 +590,10 @@ result = :next # start the repository manager elsif result == :repo_mgr + save_known_repositories WFM.CallFunction("repositories", [:sw_single_mode]) + # preselect the driver packages from new repositories + preselect_system_packages force_restart = true elsif result == :online_update_configuration required_package = "yast2-online-update-configuration" @@ -767,6 +790,9 @@ 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-packager-4.1.26/src/lib/y2packager/known_repositories.rb new/yast2-packager-4.1.27/src/lib/y2packager/known_repositories.rb --- old/yast2-packager-4.1.26/src/lib/y2packager/known_repositories.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-packager-4.1.27/src/lib/y2packager/known_repositories.rb 2019-02-15 14:27:07.000000000 +0100 @@ -0,0 +1,96 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) 2019 SUSE LLC, All Rights Reserved. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of version 2 of the GNU General Public License as published by the +# Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# ------------------------------------------------------------------------------ + +require "yaml" +require "yast" + +module Y2Packager + # Track the known repositories from which the system packages (drivers) + # have been installed (or suggested to the user). + # @see https://github.com/yast/yast-packager/wiki/Selecting-the-Driver-Packages + class KnownRepositories + include Yast::Logger + + STATUS_FILE = "/var/lib/YaST2/system_packages_repos.yaml".freeze + + # Constructor + def initialize + Yast.import "Pkg" + Yast.import "Installation" + end + + def repositories + @repositories ||= read_repositories + end + + def write + 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.write(status_file, repositories.to_yaml, open_args: ["w", 0o600]) + end + + def update + # add the current repositories + repositories.concat(current_repositories) + # remove duplicates and sort them + repositories.uniq! + repositories.sort! + end + + # + # Return new (unknown) repositories + # + # @return [Array<String>] List of new repositories (URLs) + # + def new_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 + + def read_repositories + if !File.exist?(status_file) + log.info("Status file #{status_file} not found") + return [] + end + + status = YAML.load_file(status_file) + # unify the file in case it was manually modified + status.uniq! + status.sort! + + log.info("Read known repositories from #{status_file}: #{status}") + status + end + + def current_repositories + # only the enabled repositories + repo_ids = Yast::Pkg.SourceGetCurrent(true) + + urls = repo_ids.map { |r| Yast::Pkg.SourceGeneralData(r)["url"] } + urls.uniq! + urls.sort + end + + def status_file + # add the current target prefix + File.join(Yast::Installation.destdir, STATUS_FILE) + end + end +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-packager-4.1.26/src/lib/y2packager/system_packages.rb new/yast2-packager-4.1.27/src/lib/y2packager/system_packages.rb --- old/yast2-packager-4.1.26/src/lib/y2packager/system_packages.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-packager-4.1.27/src/lib/y2packager/system_packages.rb 2019-02-15 14:27:07.000000000 +0100 @@ -0,0 +1,92 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) 2019 SUSE LLC, All Rights Reserved. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of version 2 of the GNU General Public License as published by the +# Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# ------------------------------------------------------------------------------ + +require "yast" + +module Y2Packager + # Preselect the system packages (drivers) from the specified repositories. + # @see https://github.com/yast/yast-packager/wiki/Selecting-the-Driver-Packages + class SystemPackages + include Yast::Logger + + # @return [Array<String>] Repositories from which the driver packages should be selected + attr_reader :repositories + + # + # 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 + + def packages + @packages ||= find_packages + end + + 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 repository IDs + # + def repo_ids(urls) + all_ids = Yast::Pkg.SourceGetCurrent(true) + all_ids.select { |i| urls.include?(Yast::Pkg.SourceGeneralData(i)["url"]) } + 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) + # see https://github.com/yast/yast-packager/wiki/Selecting-the-Driver-Packages, + # https://bugzilla.suse.com/show_bug.cgi?id=953522 + 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-packager-4.1.26/test/known_repositories_test.rb new/yast2-packager-4.1.27/test/known_repositories_test.rb --- old/yast2-packager-4.1.26/test/known_repositories_test.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-packager-4.1.27/test/known_repositories_test.rb 2019-02-15 14:27:07.000000000 +0100 @@ -0,0 +1,70 @@ +#!/usr/bin/env rspec + +require_relative "test_helper" +require "y2packager/known_repositories" + +describe Y2Packager::KnownRepositories do + Yast.import "Pkg" + + let(:repo_url) { "http://example.com/repo" } + let(:repos) { [repo_url] } + let(:source_id) { 42 } + + before do + allow(Yast::WFM).to receive(:scr_root).and_return("/") + end + + describe "#repositories" do + it "returns empty list if the file does not exist" do + expect(File).to receive(:exist?).with(Y2Packager::KnownRepositories::STATUS_FILE) + .and_return(false) + expect(subject.repositories).to eq([]) + end + + it "reads the repository list from file" do + expect(File).to receive(:exist?).with(Y2Packager::KnownRepositories::STATUS_FILE) + .and_return(true) + expect(YAML).to receive(:load_file).with(Y2Packager::KnownRepositories::STATUS_FILE) + .and_return(repos) + + expect(subject.repositories).to eq(repos) + end + end + + describe "#write" do + it "writes the known repositories to the file" do + allow(subject).to receive(:repositories).and_return(repos) + + expect(File).to receive(:write) + .with(Y2Packager::KnownRepositories::STATUS_FILE, repos.to_yaml, open_args: ["w", 0o600]) + + subject.write + end + end + + describe "#new_repositories" do + it "return the unknown repositories" do + allow(subject).to receive(:repositories).and_return(repos) + + allow(Yast::Pkg).to receive(:SourceGetCurrent).with(true).and_return([source_id]) + allow(Yast::Pkg).to receive(:SourceGeneralData).with(source_id) + .and_return("url" => "http://new.example.com") + + expect(subject.new_repositories).to eq(["http://new.example.com"]) + end + end + + describe "#update" do + it "add the current repositories to the known repositories" do + allow(subject).to receive(:repositories).and_return(repos) + + allow(Yast::Pkg).to receive(:SourceGetCurrent).with(true).and_return([source_id]) + allow(Yast::Pkg).to receive(:SourceGeneralData).with(source_id) + .and_return("url" => "http://new.example.com") + + subject.update + expect(repos).to eq(["http://example.com/repo", "http://new.example.com"]) + end + end + +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-packager-4.1.26/test/system_packages_test.rb new/yast2-packager-4.1.27/test/system_packages_test.rb --- old/yast2-packager-4.1.26/test/system_packages_test.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-packager-4.1.27/test/system_packages_test.rb 2019-02-15 14:27:07.000000000 +0100 @@ -0,0 +1,51 @@ +#!/usr/bin/env rspec + +require_relative "test_helper" +require "y2packager/system_packages" + +describe Y2Packager::SystemPackages do + Yast.import "Pkg" + + let(:repo_url) { "http://example.com/repo" } + let(:repos) { [repo_url] } + let(:source_id) { 42 } + let(:system_package) { "system_package" } + + subject do + Y2Packager::SystemPackages.new(repos) + end + + describe "#packages" do + it "returns the packages from the new repository" do + allow(Yast::Pkg).to receive(:SourceGetCurrent).and_return([source_id]) + allow(Yast::Pkg).to receive(:SourceGeneralData).and_return("url" => repo_url) + allow(Yast::Pkg).to receive(:GetSolverFlags) + allow(Yast::Pkg).to receive(:PkgSolve) + allow(Yast::Pkg).to receive(:SetSolverFlags) + allow(Yast::Pkg).to receive(:ResolvableProperties).and_return( + [ + "name" => system_package, + "source" => source_id, + "status" => :selected, + "transact_by" => :solver + ] + ) + + expect(subject.packages).to eq(["system_package"]) + end + + it "returns empty list if repository list is empty" do + expect(Y2Packager::SystemPackages.new([]).packages).to eq([]) + end + end + + describe "#select" do + it "selects the system packages to install" do + allow(subject).to receive(:packages).and_return([system_package]) + expect(Yast::Pkg).to receive(:PkgInstall).with(system_package) + + subject.select + end + end + +end
