Hello community, here is the log from the commit of package yast2-installation for openSUSE:Factory checked in at 2016-04-22 16:18:35 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/yast2-installation (Old) and /work/SRC/openSUSE:Factory/.yast2-installation.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "yast2-installation" Changes: -------- --- /work/SRC/openSUSE:Factory/yast2-installation/yast2-installation.changes 2016-04-08 09:39:19.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.yast2-installation.new/yast2-installation.changes 2016-04-22 16:18:36.000000000 +0200 @@ -1,0 +2,29 @@ +Tue Apr 19 09:08:35 UTC 2016 - igonzalezsosa@suse.com + +- Fix handling of license acceptance in welcome screen + (bsc#975774) +- 3.1.181 + +------------------------------------------------------------------- +Fri Apr 15 12:51:00 UTC 2016 - lslezak@suse.cz + +- Run the automatic installer self update also in the AutoYaST + mode, read the optional custom URL from the profile ("general" -> + "self_update_url" node) (FATE#319716) +- 3.1.180 + +------------------------------------------------------------------- +Wed Apr 13 07:14:09 UTC 2016 - mfilka@suse.com + +- bsc#956473 + - improved formatting of network interfaces listing +- 3.1.179 + +------------------------------------------------------------------- +Tue Apr 12 15:09:15 UTC 2016 - jreidinger@suse.com + +- do not install perl-Bootloader-YAML on target system as it is no + longer needed (FATE#317701) +- 3.1.178 + +------------------------------------------------------------------- Old: ---- yast2-installation-3.1.177.tar.bz2 New: ---- yast2-installation-3.1.181.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ yast2-installation.spec ++++++ --- /var/tmp/diff_new_pack.zf78m3/_old 2016-04-22 16:18:37.000000000 +0200 +++ /var/tmp/diff_new_pack.zf78m3/_new 2016-04-22 16:18:37.000000000 +0200 @@ -17,7 +17,7 @@ Name: yast2-installation -Version: 3.1.177 +Version: 3.1.181 Release: 0 BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -91,6 +91,9 @@ # InstError Conflicts: yast2 < 2.18.6 +# lower version requires perl-Bootloader-YAML no longer installed +Conflicts: yast2-bootloader < 3.1.166 + # Added new function WFM::ClientExists Conflicts: yast2-core < 2.17.10 ++++++ yast2-installation-3.1.177.tar.bz2 -> yast2-installation-3.1.181.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-installation-3.1.177/doc/SELF_UPDATE.md new/yast2-installation-3.1.181/doc/SELF_UPDATE.md --- old/yast2-installation-3.1.177/doc/SELF_UPDATE.md 2016-04-07 09:01:23.000000000 +0200 +++ new/yast2-installation-3.1.181/doc/SELF_UPDATE.md 2016-04-19 15:25:10.000000000 +0200 @@ -1,18 +1,18 @@ -# Installer self-update +# Installer Self-update Starting on version 3.1.175, yast2-install is able to update itself during system installation. This feature will help to solve problems with the installation even after the media has been released. Check [FATE#319716](https://fate.suse.com/319716) for a more in-depth rationale. -## Disabling updates +## Disabling Updates -Self-update is enabled by default. However, it can be disabled setting -`self_update=0` in Linuxrc. +Self-update is enabled by default. However, it can be disabled by setting +`self_update=0` boot option. -## Basic workflow +## Basic Workflow -These are the basic steps performed by YaST in order to peform the update: +These are the basic steps performed by YaST in order to perform the update: 1. During installation, YaST will look automatically for a rpm-md repository containing the updates. @@ -21,7 +21,7 @@ 3. The update will be applied to the installation system. 4. YaST will be restarted and the installation will be resumed. -## Update format +## Update Format YaST will use RPM packages stored in a rpm-md repository, although they are handled in a different way: @@ -31,31 +31,45 @@ are executed. * No dependency checks are performed. RPMs are added in alphabetical order. -## Where to find updates +## Where to Find the Updates -The URL of the update repository can be hard-coded in `control.xml` file or -specified setting `SelfUpdate` option in Linuxrc. +The URL of the update repository is evaluated in this order: + +1. The `SelfUpdate` boot option +2. The AutoYaST control file - in AutoYaST installation only, use the + `/generic/self_update_url` XML node: + + ```xml + <generic> + <self_update_url>http://example.com/updates/$arch</self_update_url> + </generic> + ``` +3. Hard-coded in the `control.xml` file on the installation medium (thus it + depends on the base product): + + ```xml + <globals> + <self_update_url>http://updates.suse.com/sle12/$arch</self_update_url> + </globals> + ``` + +The first found option is used. If no update URL is found then the self update +is skipped. The URL can contain a variable `$arch` that will be replaced by the system's architecture, such as `x86_64`, `s390x`, etc. You can find more information in the [Arch module](http://www.rubydoc.info/github/yast/yast-yast2/Yast/ArchClass). -```xml -<globals> - <self_update_url>http://updates.suse.com/sle12/$arch</self_update_url> -</globals> -``` - ## Security Updates signatures will be checked by libzypp. If the signature is not correct (or is missing), the user will be asked whether she/he wants to apply the update (although it's a security risk). -## Self-update and user updates +## Self-update and User Updates -Changes introduced by the user via Driver Updates (option `dud` in Linuxrc -command line) will take precedence. As you may know, user driver updates -are applied first (before the self-update is performed). +Changes introduced by the user via Driver Updates (`dud` boot option) will take +precedence. As you may know, user driver updates are applied first (before the +self-update is performed). -However, user changes will be re-applied on top of installer updates. \ No newline at end of file +However, the user changes will be re-applied on top of the installer updates. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-installation-3.1.177/package/yast2-installation.changes new/yast2-installation-3.1.181/package/yast2-installation.changes --- old/yast2-installation-3.1.177/package/yast2-installation.changes 2016-04-07 09:01:23.000000000 +0200 +++ new/yast2-installation-3.1.181/package/yast2-installation.changes 2016-04-19 15:25:10.000000000 +0200 @@ -1,4 +1,33 @@ ------------------------------------------------------------------- +Tue Apr 19 09:08:35 UTC 2016 - igonzalezsosa@suse.com + +- Fix handling of license acceptance in welcome screen + (bsc#975774) +- 3.1.181 + +------------------------------------------------------------------- +Fri Apr 15 12:51:00 UTC 2016 - lslezak@suse.cz + +- Run the automatic installer self update also in the AutoYaST + mode, read the optional custom URL from the profile ("general" -> + "self_update_url" node) (FATE#319716) +- 3.1.180 + +------------------------------------------------------------------- +Wed Apr 13 07:14:09 UTC 2016 - mfilka@suse.com + +- bsc#956473 + - improved formatting of network interfaces listing +- 3.1.179 + +------------------------------------------------------------------- +Tue Apr 12 15:09:15 UTC 2016 - jreidinger@suse.com + +- do not install perl-Bootloader-YAML on target system as it is no + longer needed (FATE#317701) +- 3.1.178 + +------------------------------------------------------------------- Mon Apr 4 09:48:42 UTC 2016 - igonzalezsosa@suse.com - Automatic update during installation will use Zypper repositories diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-installation-3.1.177/package/yast2-installation.spec new/yast2-installation-3.1.181/package/yast2-installation.spec --- old/yast2-installation-3.1.177/package/yast2-installation.spec 2016-04-07 09:01:23.000000000 +0200 +++ new/yast2-installation-3.1.181/package/yast2-installation.spec 2016-04-19 15:25:10.000000000 +0200 @@ -17,7 +17,7 @@ Name: yast2-installation -Version: 3.1.177 +Version: 3.1.181 Release: 0 BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -88,6 +88,9 @@ # InstError Conflicts: yast2 < 2.18.6 +# lower version requires perl-Bootloader-YAML no longer installed +Conflicts: yast2-bootloader < 3.1.166 + # Added new function WFM::ClientExists Conflicts: yast2-core < 2.17.10 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-installation-3.1.177/src/lib/installation/clients/inst_complex_welcome.rb new/yast2-installation-3.1.181/src/lib/installation/clients/inst_complex_welcome.rb --- old/yast2-installation-3.1.177/src/lib/installation/clients/inst_complex_welcome.rb 2016-04-07 09:01:23.000000000 +0200 +++ new/yast2-installation-3.1.181/src/lib/installation/clients/inst_complex_welcome.rb 2016-04-19 15:25:10.000000000 +0200 @@ -83,8 +83,6 @@ private - attr_reader :license_required - def event_loop loop do ret = UI.UserInput @@ -115,7 +113,10 @@ # BNC #448598 # Check whether the license has been accepted only if required - next if license_required && !license_accepted? + if license_required? && !license_accepted? + warn_license_required + next + end next if !Language.CheckIncompleteTranslation(@language) @@ -261,9 +262,25 @@ ) end + # Determines whether the license was accepted or not + # + # It relies in the value of the :license_agreement widget. + # + # @return [Boolean] true if license was accepted; false otherwise. def license_accepted? - return true if @license_acc + license_required? ? UI.QueryWidget(Id(:license_agreement), :Value) : true + end + + # Determines whether the license is required or not + # + # @return [Boolean] true if license is required; false otherwise. + def license_required? + return @license_required unless @license_required.nil? + @license_required = ProductLicense.AcceptanceNeeded(@license_id.to_s) + end + # Report error about missing license acceptance + def warn_license_required UI.SetFocus(Id(:license_agreement)) Report.Message(_("You must accept the license to install this product")) end @@ -271,8 +288,6 @@ def read_ui_state @language = UI.QueryWidget(Id(:language), :Value) @keyboard = UI.QueryWidget(Id(:keyboard), :Value) - - @license_acc = @licence_required ? UI.QueryWidget(Id(:license_agreement), :Value) : true end def retranslate_yast @@ -437,12 +452,10 @@ ProductLicense.ShowLicenseInInstallation(:base_license_rp, @license_id) # If accepting the license is required, show the check-box - @licence_required = ProductLicense.AcceptanceNeeded(@license_id.to_s) - - if @licence_required + if license_required? UI.ReplaceWidget(:license_checkbox_rp, license_agreement_checkbox) end - log.info "Acceptance needed: #{@id} => #{@licence_required}" + log.info "Acceptance needed: #{@id} => #{license_required?}" end end unless defined? Yast::InstComplexWelcomeClient end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-installation-3.1.177/src/lib/installation/clients/inst_installation_options.rb new/yast2-installation-3.1.181/src/lib/installation/clients/inst_installation_options.rb --- old/yast2-installation-3.1.177/src/lib/installation/clients/inst_installation_options.rb 2016-04-07 09:01:23.000000000 +0200 +++ new/yast2-installation-3.1.181/src/lib/installation/clients/inst_installation_options.rb 2016-04-19 15:25:10.000000000 +0200 @@ -73,10 +73,7 @@ end # nothing to display, simply continue - if !@show_online_repositories - SetRequiredPackages() - return :auto - end + return :auto unless @show_online_repositories Wizard.SetContents( # dialog caption @@ -159,7 +156,6 @@ Wizard.SetTitleIcon("yast-software") UpdateWizardSteps() - SetRequiredPackages() @ret = ProductControl.RunFrom(ProductControl.CurrentStep + 1, false) @ret = :finish if @ret == :next @@ -215,16 +211,5 @@ # help text: additional help for installation _("<p>If you need specific hardware drivers for installation, see <i>http://drivers.suse.com</i> site.</p>") end - - def SetRequiredPackages - Builtins.y2milestone( - "Adding packages required for installation to succeed..." - ) - PackagesProposal.AddResolvables( - "YaST-Installation", - :package, - ["perl-Bootloader-YAML"] - ) - end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-installation-3.1.177/src/lib/installation/clients/inst_update_installer.rb new/yast2-installation-3.1.181/src/lib/installation/clients/inst_update_installer.rb --- old/yast2-installation-3.1.177/src/lib/installation/clients/inst_update_installer.rb 2016-04-07 09:01:23.000000000 +0200 +++ new/yast2-installation-3.1.181/src/lib/installation/clients/inst_update_installer.rb 2016-04-19 15:25:10.000000000 +0200 @@ -34,6 +34,7 @@ Yast.import "Popup" Yast.import "Report" Yast.import "NetworkService" + Yast.import "Mode" def main textdomain "installation" @@ -82,8 +83,10 @@ # # @see #self_update_url_from_linuxrc # @see #self_update_url_from_control + # @see #self_update_url_from_profile def self_update_url - url = self_update_url_from_linuxrc || self_update_url_from_control + url = self_update_url_from_linuxrc || self_update_url_from_profile || + self_update_url_from_control log.info("self-update URL is #{url}") url end @@ -101,6 +104,19 @@ get_url_from(ProductFeatures.GetStringFeature("globals", "self_update_url")) end + # Return the self-update URL from the AutoYaST profile + # @return [URI,nil] the self-update URL, nil if not running in AutoYaST mode + # or when the URL is not defined in the profile + def self_update_url_from_profile + return nil unless Mode.auto + + Yast.import "Profile" + profile = Yast::Profile.current + profile_url = profile.fetch("general", {})["self_update_url"] + + get_url_from(profile_url) + end + # Converts the string into an URI if it's valid # # It substitutes $arch pattern with the architecture of the current system. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-installation-3.1.177/startup/common/network.sh new/yast2-installation-3.1.181/startup/common/network.sh --- old/yast2-installation-3.1.177/startup/common/network.sh 2016-04-07 09:01:24.000000000 +0200 +++ new/yast2-installation-3.1.181/startup/common/network.sh 2016-04-19 15:25:10.000000000 +0200 @@ -47,7 +47,15 @@ # list network interfaces # - all active ones with all IPv4 / IPv6 addresses # - excluding loopback device - /sbin/ip -o a s | grep "inet" | cut -d' ' -f2 | uniq | grep -v "^lo" | xargs -n1 -d'\n' /sbin/ip a s + ifaces=$(/sbin/ip -oneline address show | grep "inet" | cut --delimiter=' ' --fields=2 | uniq | grep --invert-match "^lo") + + for i in ${ifaces}; do + ip address show $i | sed --quiet \ + --expression="1{s/^[^ ]* \([^:]*\).*/\1:/;h}" \ + --expression="/ether/{ s/^.*ether[^ ]* \([^ ]*\).*/\1/; H; g; s/\n/ /; p}" \ + --expression="s/^[ ]*inet \([^ ]*\).*/ \1/p" \ + --expression="s/^[ ]*inet6 \([^ ]*\).*/ \1/p" + done; } @@ -77,7 +85,7 @@ you can login now and proceed with the installation run the command 'yast.ssh' - active interfaces: + These network addresses are available: EOF list_ifaces diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-installation-3.1.177/test/inst_complex_welcome_test.rb new/yast2-installation-3.1.181/test/inst_complex_welcome_test.rb --- old/yast2-installation-3.1.177/test/inst_complex_welcome_test.rb 2016-04-07 09:01:24.000000000 +0200 +++ new/yast2-installation-3.1.181/test/inst_complex_welcome_test.rb 2016-04-19 15:25:10.000000000 +0200 @@ -4,6 +4,20 @@ require "installation/clients/inst_complex_welcome" describe Yast::InstComplexWelcomeClient do + Yast.import "Mode" + Yast.import "ProductLicense" + + textdomain "installation" + + let(:store_path) { File.join(File.dirname(__FILE__), "complex_welcome_store.yaml") } + + before do + stub_const("Yast::InstComplexWelcomeClient::DATA_PATH", store_path) + end + + after do + FileUtils.rm(store_path) if File.exist?(store_path) + end describe "#main" do context "when installation Mode is auto" do @@ -59,42 +73,57 @@ context "when next is selected" do before do - expect(Yast::Mode).to receive(:config) { false } - expect(subject).to receive(:initialize_dialog) + allow(Yast::Mode).to receive(:config).and_return(false) + allow(Yast::Stage).to receive(:initial).and_return(true) + + allow(Yast::Language).to receive(:CheckIncompleteTranslation).and_return(true) + allow(Yast::Language).to receive(:CheckLanguagesSupport) + + allow(Yast::ProductLicense).to receive(:AcceptanceNeeded).and_return(license_needed) + allow(subject).to receive(:license_accepted?).and_return(license_accepted) end context "when license is required and not accepted" do + let(:license_needed) { true } + let(:license_accepted) { false } + it "not returns" do expect(Yast::UI).to receive(:UserInput).and_return(:next, :back) - expect(subject).to receive(:read_ui_state) - expect(subject).to receive(:license_required) { true } - expect(subject).to receive(:license_accepted?) { false } - + expect(Yast::Report).to receive(:Message) + .with(_("You must accept the license to install this product")) expect(subject.main).to eql(:back) end end - context "when license is not required or is required and accepted" do + context "when license is not required" do + let(:license_needed) { false } + let(:license_accepted) { false } + it "stores selected data and returns next" do expect(Yast::UI).to receive(:UserInput).and_return(:next) - expect(subject).to receive(:read_ui_state) + expect(subject).to receive(:setup_final_choice) + expect(subject).to receive(:store_data) + expect(Yast::Report).to_not receive(:Message) - expect(subject).to receive(:license_required) { true } - expect(subject).to receive(:license_accepted?) { true } - expect(Yast::Language).to receive(:CheckIncompleteTranslation) { true } - expect(Yast::Stage).to receive(:initial) { false } + expect(subject.main).to eql(:next) + end + end - expect(subject).to receive(:setup_final_choice) + context "when license is required and accepted" do + let(:license_needed) { true } + let(:license_accepted) { true } + it "stores selected data and returns next" do + expect(Yast::UI).to receive(:UserInput).and_return(:next) + expect(subject).to receive(:setup_final_choice) expect(subject).to receive(:store_data) + expect(Yast::Report).to_not receive(:Message) + expect(subject.main).to eql(:next) end end end - end - end end - end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-installation-3.1.177/test/inst_update_installer_test.rb new/yast2-installation-3.1.181/test/inst_update_installer_test.rb --- old/yast2-installation-3.1.177/test/inst_update_installer_test.rb 2016-04-07 09:01:24.000000000 +0200 +++ new/yast2-installation-3.1.181/test/inst_update_installer_test.rb 2016-04-19 15:25:10.000000000 +0200 @@ -20,8 +20,13 @@ before do allow(Yast::Arch).to receive(:architecture).and_return(arch) + allow(Yast::Mode).to receive(:auto).and_return(false) allow(Yast::NetworkService).to receive(:isNetworkRunning).and_return(network_running) allow(::Installation::UpdatesManager).to receive(:new).and_return(manager) + + # stub the Profile module to avoid dependency on autoyast2-installation + ay_profile = double("Yast::Profile") + stub_const("Yast::Profile", ay_profile) end describe "#main" do @@ -118,24 +123,81 @@ allow(Yast::ProductFeatures).to receive(:GetStringFeature).and_return(url) end - it "gets URL from control file" do - allow(::FileUtils).to receive(:touch) - expect(manager).to receive(:add_repository).with(URI(real_url)) - expect(subject.main).to eq(:restart_yast) - end + context "in standard installation" do + it "gets URL from control file" do + allow(::FileUtils).to receive(:touch) + expect(manager).to receive(:add_repository).with(URI(real_url)) + expect(subject.main).to eq(:restart_yast) + end - it "does not show an error if update is not found" do - expect(Yast::Popup).to_not receive(:Error) - expect(manager).to receive(:add_repository).with(URI(real_url)) - .and_raise(::Installation::UpdatesManager::NotValidRepo) - expect(subject.main).to eq(:next) + it "does not show an error if update is not found" do + expect(Yast::Popup).to_not receive(:Error) + expect(manager).to receive(:add_repository).with(URI(real_url)) + .and_raise(::Installation::UpdatesManager::NotValidRepo) + expect(subject.main).to eq(:next) + end + + context "and control file doesn't have an URL" do + let(:url) { "" } + + it "does not update the installer" do + expect(subject).to_not receive(:update_installer) + end + end end - context "and control file doesn't have an URL" do - let(:url) { "" } + context "in AutoYaST installation or upgrade" do + let(:profile_url) { "http://ay.test.example.com/update" } + + before do + expect(Yast::Mode).to receive(:auto).at_least(1).and_return(true) + allow(Yast::Profile).to receive(:current) + .and_return("general" => { "self_update_url" => profile_url }) + allow(::FileUtils).to receive(:touch) + end + + context "the profile defines the update URL" do + it "gets the URL from AutoYaST profile" do + expect(manager).to receive(:add_repository).with(URI(profile_url)) + subject.main + end + + it "returns :restart_yast" do + allow(manager).to receive(:add_repository).with(URI(profile_url)) + expect(subject.main).to eq(:restart_yast) + end + + it "shows an error and returns :next if update fails" do + expect(Yast::Report).to receive(:Error) + expect(manager).to receive(:add_repository) + .and_raise(::Installation::UpdatesManager::CouldNotFetchUpdateFromRepo) + expect(subject.main).to eq(:next) + end + end + + context "the profile does not define the update URL" do + let(:profile_url) { nil } - it "does not update the installer" do - expect(subject).to_not receive(:update_installer) + it "gets URL from control file" do + expect(manager).to receive(:add_repository).with(URI(real_url)) + expect(subject.main).to eq(:restart_yast) + end + + it "does not show an error if update is not found" do + expect(Yast::Report).to_not receive(:Error) + expect(manager).to receive(:add_repository).with(URI(real_url)) + .and_raise(::Installation::UpdatesManager::NotValidRepo) + expect(subject.main).to eq(:next) + end + + context "and control file doesn't have an URL" do + let(:url) { "" } + + it "does not update the installer" do + expect(subject).to_not receive(:update_installer) + expect(subject.main).to eq(:next) + end + end end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-installation-3.1.177/test/test_helper.rb new/yast2-installation-3.1.181/test/test_helper.rb --- old/yast2-installation-3.1.177/test/test_helper.rb 2016-04-07 09:01:24.000000000 +0200 +++ new/yast2-installation-3.1.181/test/test_helper.rb 2016-04-19 15:25:10.000000000 +0200 @@ -11,10 +11,20 @@ class AutoinstConfigClass # we need at least one non-default methods, otherwise ruby-bindings thinks # it is just namespace - def fake_method + def cio_ignore + end + + def second_stage end end AutoinstConfig = AutoinstConfigClass.new + + # Faked Profile module + class Profile + def current + end + end + Profile = Profile.new end if ENV["COVERAGE"] @@ -39,3 +49,8 @@ ] end end + +RSpec.configure do |config| + config.extend Yast::I18n # available in context/describe + config.include Yast::I18n # available in it/let/before/... +end