[Kimchi-devel] [PATCH] Make Kimchi show arch linux version and add support for pacman

stephan.conrad at gmail.com stephan.conrad at gmail.com
Fri Jun 26 06:51:29 UTC 2015


From: Stephan Conrad <stephan.conrad at gmail.com>

Signed-off-by: Stephan Conrad <stephan.conrad at gmail.com>
---
 src/kimchi/model/host.py |  2 +-
 src/kimchi/swupdate.py   | 76 ++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 75 insertions(+), 3 deletions(-)

diff --git a/src/kimchi/model/host.py b/src/kimchi/model/host.py
index b2fa379..477e126 100644
--- a/src/kimchi/model/host.py
+++ b/src/kimchi/model/host.py
@@ -91,7 +91,7 @@ class HostModel(object):
         res['memory'] = 0L
 
         # Include IBM PowerKVM name to supported distro names
-        _sup_distros = platform._supported_dists + ('ibm_powerkvm',)
+        _sup_distros = platform._supported_dists + ('ibm_powerkvm','arch',)
         # 'fedora' '17' 'Beefy Miracle'
         distro, version, codename = platform.linux_distribution(
             supported_dists=_sup_distros)
diff --git a/src/kimchi/swupdate.py b/src/kimchi/swupdate.py
index 70db2ef..752c480 100644
--- a/src/kimchi/swupdate.py
+++ b/src/kimchi/swupdate.py
@@ -26,6 +26,9 @@ from kimchi.exception import NotFoundError, OperationFailed
 from kimchi.utils import kimchi_log, run_command
 from kimchi.yumparser import get_yum_packages_list_update
 
+import re
+import os
+
 
 class SoftwareUpdate(object):
     __metaclass__ = Singleton
@@ -63,8 +66,14 @@ class SoftwareUpdate(object):
                     kimchi_log.info("Loading ZypperUpdate features.")
                     self._pkg_mnger = ZypperUpdate()
                 else:
-                    raise Exception("There is no compatible package manager "
-                                    "for this system.")
+                    pacman_help = ["pacman", "--help"]
+                    (stdout, stderr, returncode) = run_command(pacman_help)
+                    if returncode == 0:
+                        kimchi_log.info("Loading PacmanUpdate features.")
+                        self._pkg_mnger = PacmanUpdate()
+                    else:
+                        raise Exception("There is no compatible package manager "
+                                        "for this system.")
 
     def _scanUpdates(self):
         """
@@ -260,3 +269,66 @@ class ZypperUpdate(object):
         self._refreshUpdateList()
         kimchiLock.release()
         return self._pkgs
+
+class PacmanUpdate(object):
+    """
+    Class to represent and operate with Pacman software update system.
+    It's loaded only on those systems listed at PACMAN_DISTROS and loads
+    necessary modules in runtime.
+    """
+
+    def __init__(self):
+        self._pkgs = {}
+        self.update_cmd = ["pacman", "-Su", "--noconfirm", "--noprogressbar"]
+
+    def _refreshUpdateList(self):
+        """
+        Update the list of packages to be updated in the system.
+        """
+        self._pkgs = []
+        cmd_update = ["pacman", "-Sy"]
+        cmd_list = ["pacman", "-Qu"]
+        (stdout, stderr, rc) = run_command(cmd_update)
+        if rc > 0:
+            raise OperationFailed('KCHPKGUPD0003E', {'err': stderr})
+
+        (stdout, stderr, rc) = run_command(cmd_list)
+        if rc > 0:
+            if not (rc == 1 and len(stdout)==0):
+                raise OperationFailed('KCHPKGUPD0003E', {'err': stderr})
+
+        os.environ['LANG'] = 'C'
+
+        for line in stdout.split('\n'):
+            if line.find('->') >= 0:
+                info = line.split(" ")
+                (sout, serr, ret) = run_command(["pacman", "-Si", info[0]])
+                if len(sout) > 0:
+                    for l in sout.split('\n'):
+                        i = re.split('\s+', l.strip())
+                        if len(i) >= 2:
+                            if i[0] == "Repository":
+                                repo = i[2]
+                            elif i[0] == "Architecture":
+                                arch = i[2]
+                if arch == "any":
+                    arch = "noarch"
+                package = {
+                    'package_name': info[0],
+                    'version': info[3],
+                    'arch': arch,
+                    'repository': repo
+                    }
+                self._pkgs.append(package)
+
+    def getPackagesList(self):
+        """
+        Return a list of package's dictionaries. Each dictionary contains the
+        information about a package, in the format
+        package = {'package_name': <string>, 'version': <string>,
+                   'arch': <string>, 'repository': <string>}
+        """
+        self._refreshUpdateList()
+        return self._pkgs
+
+
-- 
2.4.3




More information about the Kimchi-devel mailing list