all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Stefan Reiter <s.reiter@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup 5/7] apt: refactor package detail reading into function
Date: Wed, 21 Oct 2020 11:41:14 +0200	[thread overview]
Message-ID: <20201021094116.32501-6-s.reiter@proxmox.com> (raw)
In-Reply-To: <20201021094116.32501-1-s.reiter@proxmox.com>

No functional change intended.

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
---
 src/api2/node/apt.rs | 204 +++++++++++++++++++++++--------------------
 1 file changed, 111 insertions(+), 93 deletions(-)

diff --git a/src/api2/node/apt.rs b/src/api2/node/apt.rs
index b120eef5..d8a2e824 100644
--- a/src/api2/node/apt.rs
+++ b/src/api2/node/apt.rs
@@ -90,101 +90,16 @@ fn list_installed_apt_packages<F: Fn(FilterData) -> bool>(filter: F)
     let mut cache_iter = cache.iter();
 
     loop {
-        let view = match cache_iter.next() {
-            Some(view) => view,
-            None => break
-        };
 
-        let current_version = view.current_version();
-        let candidate_version = view.candidate_version();
-
-        let (current_version, candidate_version) = match (current_version, candidate_version) {
-            (Some(cur), Some(can)) => (cur, can), // package installed and there is an update
-            (Some(cur), None) => (cur.clone(), cur), // package installed and up-to-date
-            (None, Some(_)) => continue, // package could be installed
-            (None, None) => continue, // broken
-        };
-
-        // get additional information via nested APT 'iterators'
-        let mut view_iter = view.versions();
-        while let Some(ver) = view_iter.next() {
-
-            let package = view.name();
-            let version = ver.version();
-            let mut origin_res = "unknown".to_owned();
-            let mut section_res = "unknown".to_owned();
-            let mut priority_res = "unknown".to_owned();
-            let mut change_log_url = "".to_owned();
-            let mut short_desc = package.clone();
-            let mut long_desc = "".to_owned();
-
-            let fd = FilterData {
-                installed_version: &current_version,
-                candidate_version: &candidate_version,
-                active_version: &version,
-            };
-
-            if filter(fd) {
-                if let Some(section) = ver.section() {
-                    section_res = section;
+        match cache_iter.next() {
+            Some(view) => {
+                let di = query_detailed_info(&filter, view);
+                if let Some(info) = di {
+                    ret.push(info);
                 }
-
-                if let Some(prio) = ver.priority_type() {
-                    priority_res = prio;
-                }
-
-                // assume every package has only one origin file (not
-                // origin, but origin *file*, for some reason those seem to
-                // be different concepts in APT)
-                let mut origin_iter = ver.origin_iter();
-                let origin = origin_iter.next();
-                if let Some(origin) = origin {
-
-                    if let Some(sd) = origin.short_desc() {
-                        short_desc = sd;
-                    }
-
-                    if let Some(ld) = origin.long_desc() {
-                        long_desc = ld;
-                    }
-
-                    // the package files appear in priority order, meaning
-                    // the one for the candidate version is first - this is fine
-                    // however, as the source package should be the same for all
-                    // versions anyway
-                    let mut pkg_iter = origin.file();
-                    let pkg_file = pkg_iter.next();
-                    if let Some(pkg_file) = pkg_file {
-                        if let Some(origin_name) = pkg_file.origin() {
-                            origin_res = origin_name;
-                        }
-
-                        let filename = pkg_file.file_name();
-                        let component = pkg_file.component();
-
-                        // build changelog URL from gathered information
-                        // ignore errors, use empty changelog instead
-                        let url = get_changelog_url(&package, &filename,
-                            &version, &origin_res, &component);
-                        if let Ok(url) = url {
-                            change_log_url = url;
-                        }
-                    }
-                }
-
-                let info = APTUpdateInfo {
-                    package,
-                    title: short_desc,
-                    arch: view.arch(),
-                    description: long_desc,
-                    change_log_url,
-                    origin: origin_res,
-                    version: candidate_version.clone(),
-                    old_version: current_version.clone(),
-                    priority: priority_res,
-                    section: section_res,
-                };
-                ret.push(info);
+            },
+            None => {
+                break;
             }
         }
     }
@@ -192,6 +107,109 @@ fn list_installed_apt_packages<F: Fn(FilterData) -> bool>(filter: F)
     return ret;
 }
 
+fn query_detailed_info<'a, F, V>(
+    filter: F,
+    view: V,
+) -> Option<APTUpdateInfo>
+where
+    F: Fn(FilterData) -> bool,
+    V: std::ops::Deref<Target = apt_pkg_native::sane::PkgView<'a>>
+{
+    let current_version = view.current_version();
+    let candidate_version = view.candidate_version();
+
+    let (current_version, candidate_version) = match (current_version, candidate_version) {
+        (Some(cur), Some(can)) => (cur, can), // package installed and there is an update
+        (Some(cur), None) => (cur.clone(), cur), // package installed and up-to-date
+        (None, Some(_)) => return None, // package could be installed
+        (None, None) => return None, // broken
+    };
+
+    // get additional information via nested APT 'iterators'
+    let mut view_iter = view.versions();
+    while let Some(ver) = view_iter.next() {
+
+        let package = view.name();
+        let version = ver.version();
+        let mut origin_res = "unknown".to_owned();
+        let mut section_res = "unknown".to_owned();
+        let mut priority_res = "unknown".to_owned();
+        let mut change_log_url = "".to_owned();
+        let mut short_desc = package.clone();
+        let mut long_desc = "".to_owned();
+
+        let fd = FilterData {
+            installed_version: &current_version,
+            candidate_version: &candidate_version,
+            active_version: &version,
+        };
+
+        if filter(fd) {
+            if let Some(section) = ver.section() {
+                section_res = section;
+            }
+
+            if let Some(prio) = ver.priority_type() {
+                priority_res = prio;
+            }
+
+            // assume every package has only one origin file (not
+            // origin, but origin *file*, for some reason those seem to
+            // be different concepts in APT)
+            let mut origin_iter = ver.origin_iter();
+            let origin = origin_iter.next();
+            if let Some(origin) = origin {
+
+                if let Some(sd) = origin.short_desc() {
+                    short_desc = sd;
+                }
+
+                if let Some(ld) = origin.long_desc() {
+                    long_desc = ld;
+                }
+
+                // the package files appear in priority order, meaning
+                // the one for the candidate version is first - this is fine
+                // however, as the source package should be the same for all
+                // versions anyway
+                let mut pkg_iter = origin.file();
+                let pkg_file = pkg_iter.next();
+                if let Some(pkg_file) = pkg_file {
+                    if let Some(origin_name) = pkg_file.origin() {
+                        origin_res = origin_name;
+                    }
+
+                    let filename = pkg_file.file_name();
+                    let component = pkg_file.component();
+
+                    // build changelog URL from gathered information
+                    // ignore errors, use empty changelog instead
+                    let url = get_changelog_url(&package, &filename,
+                        &version, &origin_res, &component);
+                    if let Ok(url) = url {
+                        change_log_url = url;
+                    }
+                }
+            }
+
+            return Some(APTUpdateInfo {
+                package,
+                title: short_desc,
+                arch: view.arch(),
+                description: long_desc,
+                change_log_url,
+                origin: origin_res,
+                version: candidate_version.clone(),
+                old_version: current_version.clone(),
+                priority: priority_res,
+                section: section_res,
+            });
+        }
+    }
+
+    return None;
+}
+
 #[api(
     input: {
         properties: {
-- 
2.20.1





  parent reply	other threads:[~2020-10-21  9:42 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-21  9:41 [pbs-devel] [PATCH 0/7] apt: add changelog API and fix #2934 (list new packages) Stefan Reiter
2020-10-21  9:41 ` [pbs-devel] [PATCH proxmox-backup 1/7] apt: allow filter to select different package version Stefan Reiter
2020-10-21  9:41 ` [pbs-devel] [PATCH proxmox-backup 2/7] add tools::http for generic HTTP GET and move HttpsConnector there Stefan Reiter
2020-10-21 18:31   ` [pbs-devel] applied: " Thomas Lamprecht
2020-10-21  9:41 ` [pbs-devel] [PATCH proxmox-backup 3/7] apt: use 'apt-get changelog --print-uris' in get_changelog_url Stefan Reiter
2020-10-21  9:41 ` [pbs-devel] [PATCH proxmox-backup 4/7] bump apt-pkg-native dependency to 0.3.2 Stefan Reiter
2020-10-21  9:41 ` Stefan Reiter [this message]
2020-10-21  9:41 ` [pbs-devel] [PATCH proxmox-backup 6/7] fix #2934: list to-be-installed packages in updates Stefan Reiter
2020-10-21  9:41 ` [pbs-devel] [PATCH proxmox-backup 7/7] apt: add /changelog API call similar to PVE Stefan Reiter
2020-10-22 15:20 ` [pbs-devel] applied-series: [PATCH 0/7] apt: add changelog API and fix #2934 (list new packages) Fabian Grünbichler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201021094116.32501-6-s.reiter@proxmox.com \
    --to=s.reiter@proxmox.com \
    --cc=pbs-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal