Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package yast2-update for openSUSE:Factory checked in at 2022-11-18 15:42:46 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/yast2-update (Old) and /work/SRC/openSUSE:Factory/.yast2-update.new.1597 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "yast2-update" Fri Nov 18 15:42:46 2022 rev:149 rq:1036266 version:4.5.2 Changes: -------- --- /work/SRC/openSUSE:Factory/yast2-update/yast2-update.changes 2022-05-01 18:53:25.635153977 +0200 +++ /work/SRC/openSUSE:Factory/.yast2-update.new.1597/yast2-update.changes 2022-11-18 15:42:56.042404169 +0100 @@ -1,0 +2,7 @@ +Wed Nov 16 14:33:33 UTC 2022 - Ladislav Slezák <lsle...@suse.cz> + +- Display a warning in the upgrade summary when removing orphaned + 3rd party packages (bsc#1202007) +- 4.5.2 + +------------------------------------------------------------------- Old: ---- yast2-update-4.5.1.tar.bz2 New: ---- yast2-update-4.5.2.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ yast2-update.spec ++++++ --- /var/tmp/diff_new_pack.BSyqJW/_old 2022-11-18 15:42:56.598406612 +0100 +++ /var/tmp/diff_new_pack.BSyqJW/_new 2022-11-18 15:42:56.602406630 +0100 @@ -17,11 +17,11 @@ Name: yast2-update -Version: 4.5.1 +Version: 4.5.2 Release: 0 Summary: YaST2 - Update -License: GPL-2.0-only Group: System/YaST +License: GPL-2.0-only URL: https://github.com/yast/yast-update Source0: %{name}-%{version}.tar.bz2 @@ -52,8 +52,8 @@ Requires: yast2-installation # ProductSpec#register_target Requires: yast2-packager >= 4.4.15 -# Pkg::SetAdditionalVendors -Requires: yast2-pkg-bindings >= 4.3.3 +# filtering orphaned packages +Requires: yast2-pkg-bindings >= 4.5.1 Requires: yast2-ruby-bindings >= 1.0.0 # nokogiri is used for parsing pam conf. Requires: rubygem(%{rb_default_ruby_abi}:nokogiri) ++++++ yast2-update-4.5.1.tar.bz2 -> yast2-update-4.5.2.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/POTCOMMENTS new/yast2-update-4.5.2/POTCOMMENTS --- old/yast2-update-4.5.1/POTCOMMENTS 1970-01-01 01:00:00.000000000 +0100 +++ new/yast2-update-4.5.2/POTCOMMENTS 2022-11-16 17:23:03.000000000 +0100 @@ -0,0 +1 @@ +TRANSLATORS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/package/yast2-update.changes new/yast2-update-4.5.2/package/yast2-update.changes --- old/yast2-update-4.5.1/package/yast2-update.changes 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/package/yast2-update.changes 2022-11-16 17:23:03.000000000 +0100 @@ -1,4 +1,11 @@ ------------------------------------------------------------------- +Wed Nov 16 14:33:33 UTC 2022 - Ladislav Slezák <lsle...@suse.cz> + +- Display a warning in the upgrade summary when removing orphaned + 3rd party packages (bsc#1202007) +- 4.5.2 + +------------------------------------------------------------------- Thu Apr 28 08:09:47 UTC 2022 - Ladislav Slezák <lsle...@suse.cz> - Use the "norecovery" mount option when searching the root diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/package/yast2-update.spec new/yast2-update-4.5.2/package/yast2-update.spec --- old/yast2-update-4.5.1/package/yast2-update.spec 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/package/yast2-update.spec 2022-11-16 17:23:03.000000000 +0100 @@ -17,7 +17,7 @@ Name: yast2-update -Version: 4.5.1 +Version: 4.5.2 Release: 0 Summary: YaST2 - Update Group: System/YaST @@ -52,8 +52,8 @@ Requires: yast2-installation # ProductSpec#register_target Requires: yast2-packager >= 4.4.15 -# Pkg::SetAdditionalVendors -Requires: yast2-pkg-bindings >= 4.3.3 +# filtering orphaned packages +Requires: yast2-pkg-bindings >= 4.5.1 Requires: yast2-ruby-bindings >= 1.0.0 # nokogiri is used for parsing pam conf. Requires: rubygem(%{rb_default_ruby_abi}:nokogiri) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/src/clients/backup_proposal.rb new/yast2-update-4.5.2/src/clients/backup_proposal.rb --- old/yast2-update-4.5.1/src/clients/backup_proposal.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/src/clients/backup_proposal.rb 2022-11-16 17:23:03.000000000 +0100 @@ -59,23 +59,24 @@ if Installation.update_backup_modified || Installation.update_backup_sysconfig if Installation.update_backup_modified - # Proposal for backup during update + # TRANSLATORS: proposal item in the update summary @tmp = Builtins.add(@tmp, _("Create Backup of Modified Files")) end if Installation.update_backup_sysconfig - # Proposal for backup during update @tmp = Builtins.add( @tmp, + # TRANSLATORS: item in the update summary _("Create Backup of /etc/sysconfig Directory") ) end else + # TRANSLATORS: proposal item in the update summary @tmp = Builtins.add(@tmp, _("Do Not Create Backups")) end if Installation.update_remove_old_backups - # Proposal for backup during update + # TRANSLATORS: proposal item in the update summary @tmp = Builtins.add(@tmp, _("Remove Backups from Previous Updates")) end @@ -101,9 +102,9 @@ # Static values do just nicely here, no need to call a function. @ret = { - # this is a heading + # TRANSLATORS: proposal heading "rich_text_title" => _("Backup"), - # this is a menu entry + # TRANSLATORS: a menu entry "menu_title" => _("&Backup"), "id" => "backup_stuff" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/src/clients/inst_backup.rb new/yast2-update-4.5.2/src/clients/inst_backup.rb --- old/yast2-update-4.5.1/src/clients/inst_backup.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/src/clients/inst_backup.rb 2022-11-16 17:23:03.000000000 +0100 @@ -47,7 +47,7 @@ ) Builtins.y2milestone("evaluate partitions: %1", @partition) - # screen title for software selection + # TRANSLATORS: screen title for software selection @title = _("Backup System Before Update") # Build and show dialog @@ -60,7 +60,7 @@ CheckBox( Id(:modified), Opt(:notify), - # checkbox label if user wants to backup modified files + # TRANSLATORS: checkbox label if user wants to backup modified files _("Create &Backup of Modified Files") ) ), @@ -68,7 +68,7 @@ CheckBox( Id(:sysconfig), Opt(:notify), - # checkbox label if user wants to backup /etc/sysconfig + # TRANSLATORS: checkbox label if user wants to backup /etc/sysconfig _("Create a &Complete Backup of /etc/sysconfig") ) ), @@ -77,20 +77,20 @@ CheckBox( Id(:remove), Opt(:notify), - # checkbox label if user wants remove old backup stuff + # TRANSLATORS: checkbox label if user wants remove old backup stuff _("Remove &Old Backups from the Backup Directory") ) ) ) ) - # help text for backup dialog during update 1/7 + # TRANSLATORS: help text for backup dialog during update 1/7 @help_text = _( "<p>To avoid any loss of information during update,\n" \ "create a <b>backup</b> prior to updating.</p>\n" ) - # help text for backup dialog during update 2/7 + # TRANSLATORS: help text for backup dialog during update 2/7 @help_text = Ops.add( @help_text, _( @@ -99,13 +99,13 @@ ) ) - # help text for backup dialog during update 3/7 + # TRANSLATORS: help text for backup dialog during update 3/7 @help_text = Ops.add( @help_text, _("<p>Select the desired options.</p>\n") ) - # help text for backup dialog during update 4/7 + # TRANSLATORS: help text for backup dialog during update 4/7 @help_text = Ops.add( @help_text, _( @@ -114,7 +114,7 @@ ) ) - # help text for backup dialog during update 5/7 + # TRANSLATORS: help text for backup dialog during update 5/7 @help_text = Ops.add( @help_text, _( @@ -124,7 +124,7 @@ ) ) - # help text for backup dialog during update 6/7 + # TRANSLATORS: help text for backup dialog during update 6/7 @help_text = Ops.add( @help_text, _( @@ -135,7 +135,7 @@ ) ) - # help text for backup dialog during update 7/7 + # TRANSLATORS: help text for backup dialog during update 7/7 @help_text = Ops.add( @help_text, Builtins.sformat( @@ -216,7 +216,7 @@ if Ops.less_or_equal(Builtins.size(backup_path), 1) || Builtins.substring(backup_path, 0, 1) != "/" - # error popup, user did not enter a valid directory specification + # TRANSLATORS: error popup, user did not enter a valid directory specification Popup.Message(_("Invalid backup path.")) return false end @@ -255,6 +255,7 @@ # there is not enough space for the backup during update # inform the user about this (MB==megabytes) message = Builtins.sformat( + # TRANSLATORS: popup message _("Minimum disk space of %1 MB required."), min_space ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/src/clients/packages_proposal.rb new/yast2-update-4.5.2/src/clients/packages_proposal.rb --- old/yast2-update-4.5.1/src/clients/packages_proposal.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/src/clients/packages_proposal.rb 2022-11-16 17:23:03.000000000 +0100 @@ -23,7 +23,6 @@ # # Purpose: Let user choose packages during update. # -# $Id$ require "y2packager/resolvable" @@ -116,34 +115,34 @@ @tmp = [] - # proposal for packages during update, %1 is count of packages @tmp = Builtins.add( @tmp, Builtins.sformat( + # TRANSLATORS: proposal for packages during update, %1 is count of packages _("Packages to Update: %1"), Update.packages_to_update ) ) - # proposal for packages during update, %1 is count of packages @tmp = Builtins.add( @tmp, Builtins.sformat( + # TRANSLATORS: proposal for packages during update, %1 is count of packages _("New Packages to Install: %1"), Update.packages_to_install ) ) - # proposal for packages during update, %1 is count of packages @tmp = Builtins.add( @tmp, Builtins.sformat( + # TRANSLATORS: proposal for packages during update, %1 is count of packages _("Packages to Remove: %1"), Update.packages_to_remove ) ) - # part of summary, %1 is size of packages (in MB or GB) @tmp = Builtins.add( @tmp, Builtins.sformat( + # TRANSLATORS: part of summary, %1 is size of packages (in MB or GB) _("Total Size of Packages to Update: %1"), Packages.CountSizeToBeInstalled ) @@ -160,6 +159,10 @@ } } + # add a warning about orphaned packages if there is any + orphaned_warning = orphaned_packages_warning + @warning << orphaned_warning if orphaned_warning + if Ops.greater_than(Update.solve_errors, 0) # the proposal for the packages requires manual invervention @ret.merge!( @@ -205,9 +208,9 @@ # Static values do just nicely here, no need to call a function. @ret = { - # this is a heading + # TRANSLATORS: proposal heading "rich_text_title" => _("Packages"), - # this is a menu entry + # TRANSLATORS: proposal a menu entry "menu_title" => _("&Packages"), "id" => "packages_stuff" } @@ -217,6 +220,8 @@ @ret end + private + def call_packageselector options = {} @@ -234,6 +239,69 @@ ret end + + # Summary with the list of uninstalled 3rd party packages + # @return [String,nil] Rich text summary or `nil` if no 3rd party package + # is uninstalled + def orphaned_packages_warning + orphaned_packages = find_orphaned_packages + return nil if orphaned_packages.empty? + + list = HTML.List(orphaned_packages_summary(orphaned_packages)) + # TRANSLATORS: warning displayed in the upgrade summary, this informs the + # user that some manually installed non-SUSE packages will be uninstalled, + # user should check if that is OK, it is possible to manually change the + # package status and keep it in the system + _("<b>Warning: These packages will be removed:</b> %s") % list + end + + # find the orphaned non-SUSE packages which will be uninstalled from the system + # @return [Array<Y2Packager::Resolvable>] list of orphaned packages + def find_orphaned_packages + # preload the "vendor" attribute so the vendor matching below is faster + orphaned = Y2Packager::Resolvable.find( + { kind: :package, status: :removed, orphaned: true }, + [:vendor] + ) + # ignore SUSE or openSUSE packages, but include packages from OBS projects + # where vendor is like "obs://build.opensuse.org/YaST", + # the SUSE Hub packages use the "openSUSE" vendor + orphaned.reject! { |o| o.vendor.start_with?("SUSE") || o.vendor.start_with?("openSUSE") } + # sort the packages alphabetically by name for easier reading (case insensitive) + orphaned.sort_by! { |o| o.name.downcase } + log.info "Found #{orphaned.size} non-SUSE orphaned packages: " + + orphaned.map { |p| package_label(p) }.to_s + orphaned + end + + # limit the list of the displayed orphaned packages, the list might be potentially huge, + # let's display just first few packages in the summary, the full list can be + # displayed in the package manager + ORPHANED_MAX_SIZE = 10 + private_constant :ORPHANED_MAX_SIZE + + # create summary list + # @param packages [Array<Y2Packager::Resolvable>] list of packages + # @return [Array<String>] list of text items + def orphaned_packages_summary(packages) + summary = packages.first(ORPHANED_MAX_SIZE).map { |p| package_label(p) } + + if packages.size > ORPHANED_MAX_SIZE + # TRANSLATORS: %s is replaced by a number of remaining items + summary << _("... and %s more") % (packages.size - ORPHANED_MAX_SIZE) + end + + summary + end + + # create short description label for a package + # @param package [Y2Packager::Resolvable] the package object + # @return [String] human readable package label + def package_label(package) + label = "#{package.name}-#{package.version}.#{package.arch}" + label << " (#{package.vendor})" if !package.vendor.empty? + label + end end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/src/clients/rootpart_proposal.rb new/yast2-update-4.5.2/src/clients/rootpart_proposal.rb --- old/yast2-update-4.5.1/src/clients/rootpart_proposal.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/src/clients/rootpart_proposal.rb 2022-11-16 17:23:03.000000000 +0100 @@ -63,7 +63,7 @@ @ret = { "warning" => - # Proposal for system to update + # TRANSLATORS: Warning in update proposal _("No root partition found"), "warning_level" => :fatal, "raw_proposal" => [] @@ -88,7 +88,9 @@ else { "raw_proposal" => - # Proposal for system to update + # TRANSLATORS: Proposal for system to update + # %1 is a product name name (e.g. "openSUSE Leap 15.4") + # %2 is a partition name (e.g. "/dev/sda1") [ Builtins.sformat( _("%1 on root partition %2"), @@ -104,6 +106,7 @@ @ret = Builtins.add( @ret, "warning", + # TRANSLATORS: error message _("Failed to mount target system") ) @ret = Builtins.add(@ret, "warning_level", :fatal) @@ -142,9 +145,9 @@ {} else { - # this is a heading + # TRANSLATORS: proposal heading "rich_text_title" => _("Selected for Update"), - # this is a menu entry + # TRANSLATORS: proposal menu entry "menu_title" => _( "&Selected for Update" ), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/src/clients/run_update.rb new/yast2-update-4.5.2/src/clients/run_update.rb --- old/yast2-update-4.5.1/src/clients/run_update.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/src/clients/run_update.rb 2022-11-16 17:23:03.000000000 +0100 @@ -51,6 +51,7 @@ ProductControl.custom_control_file = "/usr/share/YaST2/control/update.xml" Wizard.OpenNextBackStepsDialog + # TRANSLATORS: button label Wizard.SetNextButton(:next, _("&Update")) if !ProductControl.Init Builtins.y2error( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/src/clients/update_proposal.rb new/yast2-update-4.5.2/src/clients/update_proposal.rb --- old/yast2-update-4.5.1/src/clients/update_proposal.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/src/clients/update_proposal.rb 2022-11-16 17:23:03.000000000 +0100 @@ -82,7 +82,7 @@ # packager will then suggest some set of packages if !CheckRPMDBforExistency() return { - # error message in proposal + # TRANSLATORS: error message in proposal "warning" => _( "Cannot read the current RPM Database." ), @@ -124,7 +124,7 @@ if Update.products_incompatible return { - # error message in proposal + # TRANSLATORS: error message in proposal "warning" => format( _( "The installed product (%{update_from}) is not compatible with " \ @@ -171,15 +171,15 @@ "Warning: Updating from '%1' to '%2', products do not exactly match." ), Ops.get_locale( - # TRANSLATORS: unknown product name Installation.installedVersion, "show", + # TRANSLATORS: unknown product name _("Unknown product") ), Ops.get_locale( - # TRANSLATORS: unknown product name Installation.updateVersion, "show", + # TRANSLATORS: unknown product name _("Unknown product") ) ) @@ -220,6 +220,7 @@ Pkg.CreateSolverTestCase("/var/log/YaST2/solver-upgrade-proposal") if @ret["warning"] elsif @func == "AskUser" # With proper control file, this should never be reached + # TRANSLATORS: error message Report.Error(_("The update summary is read only and cannot be changed.")) @ret = { "workflow_sequence" => :back } elsif @func == "Description" @@ -228,9 +229,9 @@ # Static values do just nicely here, no need to call a function. @ret = { - # this is a heading + # TRANSLATORS: proposal heading "rich_text_title" => _("Update Options"), - # this is a menu entry + # TRANSLATORS: proposal menu entry "menu_title" => _("&Update Options"), "id" => "update_stuff" } @@ -339,9 +340,10 @@ Label( Ops.add( Ops.add( - # part of error popup message + # TRANSLATORS: part of error popup message _("Cannot read the current RPM Database.") + "\n\n", - # part of error popup message, %1 stands for newline-separated list of files + # TRANSLATORS: part of error popup message, + # %1 stands for newline-separated list of files Builtins.sformat( _("None of these files exist:%1"), missing_files @@ -479,7 +481,7 @@ # check product compatibility if !(Update.ProductsCompatible || Update.products_incompatible) || update_not_possible if Popup.ContinueCancel( - # continue-cancel popup + # TRANSLATORS: continue-cancel popup _( "The installed product is not compatible with the product\n" \ "on the installation media. If you try to update using the\n" \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/src/include/update/rootpart.rb new/yast2-update-4.5.2/src/include/update/rootpart.rb --- old/yast2-update-4.5.1/src/include/update/rootpart.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/src/include/update/rootpart.rb 2022-11-16 17:23:03.000000000 +0100 @@ -120,20 +120,20 @@ if system == "unknown" if !part_fs.nil? system = if CanBeLinuxRootFS(part_fs) || legacy_filesystem?(part_fs) - # Table item (unknown system) + # TRANSLATORS: Table item (unknown system) _("Unknown Linux") else - # Table item (unknown system) + # TRANSLATORS: Table item (unknown system) _("Unknown or Non-Linux") end - # Table item (unknown system [neither openSUSE 11.1 nor SLES 14 nor ...]) + # TRANSLATORS: Table item (unknown system [neither openSUSE 11.1 nor SLES 14 nor ...]) elsif system == "unknown" system = _("Unknown") end end arch = Ops.get_string(i, :arch, "error") - # Table item (unknown architecture) + # TRANSLATORS: Table item (unknown architecture) arch = _("Unknown") if arch == "unknown" # fist, use the name of file system (with short name for Linux) @@ -153,7 +153,7 @@ else Ops.get_string(i, :fstype, Ops.get_string(i, :fs, "")) end - # Table item (unknown file system) + # TRANSLATORS: Table item (unknown file system) fs = _("Unknown") if fs == "" label = Ops.get_string(i, :label, "") @@ -204,20 +204,20 @@ help_text = "" if flavor == :boot_popup - # label for selection of root partition (for boot) + # TRANSLATORS: label for selection of root partition (for boot) label = _("Partition or System to Boot:") - # help text for root partition dialog (for boot) + # TRANSLATORS: help text for root partition dialog (for boot) help_text = _( "<p>\n" \ "Select the partition or system to boot.\n" \ "</p>\n" ) else - # label for selection of root partition (for update) + # TRANSLATORS: label for selection of root partition (for update) label = _("Partition or System to Update:") - # help text for root partition dialog (for update) + # TRANSLATORS: help text for root partition dialog (for update) help_text = _( "<p>\n" \ "Select the partition or system to update.\n" \ @@ -225,12 +225,12 @@ ) if flavor == :update_dialog || flavor == :update_dialog_proposal - # headline for dialog "Select for update" + # TRANSLATORS: headline for dialog "Select for update" title = _("Select for Update") end end - # help text for root partition dialog (general part) + # TRANSLATORS: help text for root partition dialog (general part) help_text = Ops.add( help_text, _( @@ -252,15 +252,15 @@ Id(:partition), Opt(:hstretch), Header( - # table header + # TRANSLATORS: table header _("System"), - # table header item + # TRANSLATORS: table header item _("Partition"), - # table header item + # TRANSLATORS: table header item _("Architecture"), - # table header item + # TRANSLATORS: table header item _("File System"), - # table header item + # TRANSLATORS: table header item _("Label") ), partition_list @@ -270,7 +270,7 @@ CheckBox( Id(:showall), Opt(:notify), - # check box + # TRANSLATORS: check box _("&Show All Partitions"), false ) @@ -301,7 +301,7 @@ if flavor == :boot_popup buttons = HBox( HStretch(), - # pushbutton to (rightaway) boot the system selected above + # TRANSLATORS: pushbutton to (rightaway) boot the system selected above HWeight(1, PushButton(Id(:next), Opt(:default), _("&Boot"))), HSpacing(1), HWeight(1, PushButton(Id(:cancel), Label.CancelButton)), @@ -371,13 +371,14 @@ # Removed ReiserFS support for system upgrade (fate#323394). if freshman[:fs] == :reiserfs cont = false + # TRANSLATORS: error message Report.Error(_("ReiserFS is not supported anymore.\n" \ "Please migrate your data to another " \ "filesystem before performing the upgrade.\n\n")) elsif (freshman[:name] || "unknown") == "unknown" cont = false Popup.Error( - # error popup + # TRANSLATORS: error popup _( "No installed system that can be upgraded with this product was found\n" \ "on the selected partition." @@ -388,7 +389,7 @@ RootPart.GetDistroArch ) cont = Popup.ContinueCancel( - # continue-cancel popup + # TRANSLATORS: continue-cancel popup _( "The architecture of the system installed in the selected partition\n " \ "is different from the one of this product.\n" @@ -410,7 +411,7 @@ # Not mounted correctly if !RootPart.targetOk - # error report + # TRANSLATORS: error report Report.Error(_("Failed to mount target system")) UmountMountedPartition() next @@ -419,12 +420,12 @@ elsif RootPart.IncompleteInstallationDetected(Installation.destdir) if Popup.AnyQuestion( Label.WarningMsg, - # pop-up question + # TRANSLATORS: pop-up question _( "A possibly incomplete installation has been detected on the selected " \ "partition.\nAre sure you want to use it anyway?" ), - # button label + # TRANSLATORS: button label _("&Yes, Use It"), Label.CancelButton, :focus_no @@ -463,12 +464,14 @@ Builtins.y2error("Pkg::TargetInitialize failed") if Popup.AnyQuestion( Label.ErrorMsg, + # TRANSLATORS: error message _( "Initializing the system for upgrade has failed for unknown reason.\n" \ "It is highly recommended not to continue the upgrade process.\n" \ "\n" \ "Are you sure you want to continue?" ), + # TRANSLATORS: button label _("&Yes, Continue"), Label.CancelButton, :focus_no @@ -488,12 +491,14 @@ Builtins.y2error("Pkg::TargetLoad failed") if Popup.AnyQuestion( Label.ErrorMsg, + # TRANSLATORS: error message _( "Initializing the system for upgrade has failed for unknown reason.\n" \ "It is highly recommended not to continue the upgrade process.\n" \ "\n" \ "Are you sure you want to continue?" ), + # TRANSLATORS: button label _("&Yes, Continue"), Label.CancelButton, :focus_no diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/src/lib/update/clients/inst_update_partition_auto.rb new/yast2-update-4.5.2/src/lib/update/clients/inst_update_partition_auto.rb --- old/yast2-update-4.5.1/src/lib/update/clients/inst_update_partition_auto.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/src/lib/update/clients/inst_update_partition_auto.rb 2022-11-16 17:23:03.000000000 +0100 @@ -62,12 +62,13 @@ # Not mounted correctly if !RootPart.targetOk - # error report + # TRANSLATORS: error message Report.Error(_("Failed to mount target system")) UmountMountedPartition() # Correctly mounted but incomplete installation found elsif RootPart.IncompleteInstallationDetected(Installation.destdir) Report.Error( + # TRANSLATORS: error message _("A possibly incomplete installation has been detected.") ) UmountMountedPartition() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/src/modules/RootPart.rb new/yast2-update-4.5.2/src/modules/RootPart.rb --- old/yast2-update-4.5.1/src/modules/RootPart.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/src/modules/RootPart.rb 2022-11-16 17:23:03.000000000 +0100 @@ -120,7 +120,7 @@ def GetInfoOfSelected(what) i = Ops.get(@rootPartitions, @selectedRootPartition, {}) - # label - name of sustem to update + # TRANSLATORS: label - name of system to update was not found return Ops.get_locale(i, what, _("Unknown")) if what != :name # Name is known @@ -132,12 +132,12 @@ FileSystems.possible_root_fs, Ops.get_symbol(i, :fs, :nil) ) - # label - name of sustem to update + # TRANSLATORS: label - name of system to update _("Unknown Linux System") # Non-Linux else - # label - name of sustem to update + # TRANSLATORS: label - name of system to update _("Non-Linux System") end end @@ -192,7 +192,7 @@ Ops.get_string(info, :mntpt, "") ) if !Convert.to_boolean(SCR.Execute(path(".target.umount"), file)) - # error report, %1 is device (eg. /dev/hda1) + # TRANSLATORS: error report, %1 is device (eg. /dev/hda1) Report.Error( Builtins.sformat( _( @@ -260,7 +260,7 @@ def FSCKPartition(partition) detected_fs = fstype_for_device(probed, partition) if detected_fs == "ext2" - # label, %1 is partition + # TRANSLATORS: label, %1 is partition out = Builtins.sformat(_("Checking partition %1"), partition) UI.OpenDialog(Opt(:decorated), Label(out)) @@ -295,6 +295,7 @@ details_checkbox = if has_details VBox( VSpacing(1), + # TRANSLATORS: check box label Left(CheckBox(Id(:details), Opt(:notify), _("Show &Details"), false)) ) else @@ -378,6 +379,7 @@ end UI.OpenDialog( + # TRANSLATORS: progress status, %1 is a device name, e.g. "/dev/sda1" Label(Builtins.sformat(_("Checking file system on %1..."), device)) ) @@ -409,10 +411,10 @@ end return AnyQuestionAnyButtonsDetails( - # popup headline + # TRANSLATORS: popup headline _("File System Check Failed"), Builtins.sformat( - # popup question (continue/cancel dialog) + # TRANSLATORS: popup question (continue/cancel dialog) # %1 is a device name such as /dev/hda5 _( "The file system check of device %1 has failed.\n" \ @@ -422,7 +424,7 @@ device ), Label.ContinueButton, - # button + # TRANSLATORS: button label _("&Skip Mounting"), details ) @@ -903,7 +905,7 @@ VBox( Label( Builtins.sformat( - # label in a popup, %1 is device (eg. /dev/hda1), + # TRANSLATORS: label in a popup, %1 is device (eg. /dev/hda1), # %2 is output of the 'mount' command _( "The partition %1 could not be mounted.\n" \ @@ -922,6 +924,7 @@ VSpacing(1), HBox( PushButton(Id(:cont), Label.ContinueButton), + # TRANSLATORS: button label PushButton(Id(:cmd), _("&Specify Mount Options")), PushButton(Id(:cancel), Label.CancelButton) ) @@ -950,12 +953,16 @@ def user_mount_options(fspath, spec, mount_type) UI.OpenDialog( VBox( + # TRANSLATORS: dialog heading Heading(_("Mount Options")), VSpacing(0.6), + # TRANSLATORS: input field TextEntry(Id(:mp), _("&Mount Point"), fspath), VSpacing(0.4), + # TRANSLATORS: input field TextEntry(Id(:device), _("&Device"), spec), VSpacing(0.4), + # TRANSLATORS: input field TextEntry(Id(:fs), _("&File System\n(empty for autodetection)"), mount_type), VSpacing(1), HBox( @@ -1001,7 +1008,7 @@ success = true - # popup message, %1 will be replace with the name of the logfile + # TRANSLATORS: popup message, %1 will be replace with the name of the logfile message = Builtins.sformat( _( "Partitions could not be mounted.\n" \ @@ -1053,6 +1060,7 @@ root_device_current ) warning = Builtins.sformat( + # TRANSLATORS: warning popup _( "Some partitions in the system on %1 are mounted by kernel-device name. This is\n" \ "not reliable for the update since kernel-device names are unfortunately not\n" \ @@ -1070,6 +1078,7 @@ if has_pam_mount warning = Builtins.sformat( + # TRANSLATORS: warning popup _( "Some home directories in the system on %1 are encrypted. This release does not\n" \ "support cryptconfig any longer and those home directories " \ @@ -1086,7 +1095,7 @@ if Builtins.size(fstab) == 0 Builtins.y2error("no or empty fstab found!") - # error message + # TRANSLATORS: error message message = _("No fstab found.") success = false else @@ -1126,6 +1135,7 @@ if !legacy_entries.empty? message = Builtins.sformat( + # TRANSLATORS: popup message _("The mount points listed below are using legacy filesystems " \ "that are not supported anymore:\n\n%1\n\n" \ "Before upgrade you should migrate all " \ @@ -1453,6 +1463,7 @@ Id("search_progress"), ProgressBar( Id("search_pb"), + # TRANSLATORS: progress bar label _("Evaluating root partition. One moment please..."), 100, 0 @@ -1496,7 +1507,7 @@ def mount_target UI.OpenDialog( Opt(:decorated), - # intermediate popup while mounting partitions + # TRANSLATORS: intermediate popup while mounting partitions Label(_("Mounting partitions. One moment please...")) ) @@ -1804,6 +1815,7 @@ rescue Yast2::SnapshotCreationFailed => e log.error("Error creating a pre-update snapshot: #{e}") Yast::Report.Error( + # TRANSLATORS: error message _("A pre-update snapshot could not be created. You can continue with the \n" \ "installation, but beware that you cannot roll back to a pre-update state \n" \ "unless you have created a snapshot manually.") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/src/modules/SUSERelease.rb new/yast2-update-4.5.2/src/modules/SUSERelease.rb --- old/yast2-update-4.5.1/src/modules/SUSERelease.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/src/modules/SUSERelease.rb 2022-11-16 17:23:03.000000000 +0100 @@ -59,6 +59,7 @@ log.info "Release file #{release_file} not found" raise( SUSEReleaseFileMissingError, + # TRANSLATORS: error message, %{file} is replaced with file name format(_("Release file %{file} not found"), file: release_file) ) end @@ -68,6 +69,7 @@ log.error "Cannot read file #{release_file}" raise( IOError, + # TRANSLATORS: error message, %{file} is replaced with file name format(_("Cannot read release file %{file}"), file: release_file) ) end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/src/modules/Update.rb new/yast2-update-4.5.2/src/modules/Update.rb --- old/yast2-update-4.5.1/src/modules/Update.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/src/modules/Update.rb 2022-11-16 17:23:03.000000000 +0100 @@ -274,6 +274,7 @@ next product.summary unless product.summary.empty? next product.name unless product.name.empty? + # TRANSLATORS: label for unknown product _("Unknown Product") end end @@ -743,11 +744,13 @@ failed_packages = select_for_installation(:package, install_packages) failed_patterns.empty? or Report.Error( + # TRANSLATORS: error message, %{patterns} is replaced by list of patterns format(_("Cannot select these patterns required for installation:\n%{patterns}"), patterns: failed_patterns.join("\n")) ) failed_packages.empty? or Report.Error( + # TRANSLATORS: error message, %{packages} is replaced by list of packages format(_("Cannot select these packages required for installation:\n%{packages}"), packages: failed_packages.join("\n")) ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-update-4.5.1/test/packages_proposal_test.rb new/yast2-update-4.5.2/test/packages_proposal_test.rb --- old/yast2-update-4.5.1/test/packages_proposal_test.rb 2022-04-28 16:58:44.000000000 +0200 +++ new/yast2-update-4.5.2/test/packages_proposal_test.rb 2022-11-16 17:23:03.000000000 +0100 @@ -24,11 +24,12 @@ before do allow(Yast::SpaceCalculation).to receive(:GetPartitionWarning) - .and_return(nil) + .and_return([]) allow(Yast::Packages).to receive(:proposal_for_update) allow(Yast::Pkg).to receive(:GetPackages).with(anything, true) do |status, _names_only| PACKAGES[status] end + allow(Y2Packager::Resolvable).to receive(:find).and_return([]) end it "asks for a packages selection proposal" do @@ -52,6 +53,30 @@ "value" => false ) end + + it "returns a warning with removed 3rd party orphaned packages" do + orphaned = Y2Packager::Resolvable.new( + arch: "x86_64", + kind: :package, + name: "orphaned", + path: "", + source: -1, + status: :removed, + vendor: "Foo Corporation", + version: "42.0.0", + orphaned: true + ) + + expect(Y2Packager::Resolvable).to receive(:find).with( + { kind: :package, status: :removed, orphaned: true }, + [:vendor] + ).and_return([orphaned]) + + result = client.main + + expect(result["warning"]).to include("orphaned-42.0.0.x86_64 (Foo Corporation)") + expect(result["warning_level"]).to eq(:warning) + end end end end