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

Reply via email to