[node-patches] Change in ovirt-node[master]: utils: Better errors for NVR parsing

fabiand at fedoraproject.org fabiand at fedoraproject.org
Thu Mar 27 19:53:43 UTC 2014


Fabian Deutsch has uploaded a new change for review.

Change subject: utils: Better errors for NVR parsing
......................................................................

utils: Better errors for NVR parsing

Change-Id: I280f18235374da5604747499f2491669d75b9970
Signed-off-by: Fabian Deutsch <fabiand at redhat.com>
---
M src/ovirt/node/utils/system.py
1 file changed, 73 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-node refs/changes/82/26182/1

diff --git a/src/ovirt/node/utils/system.py b/src/ovirt/node/utils/system.py
index 024b222..0baf800 100644
--- a/src/ovirt/node/utils/system.py
+++ b/src/ovirt/node/utils/system.py
@@ -192,6 +192,79 @@
                                                                       f))
 
 
+class NVR(object):
+    """Simple clas to parse and compare NVRs
+
+    >>> nvr = NVR.parse("ovirt-node-1.2.3-4.el6")
+    >>> nvr.name
+    'ovirt-node'
+    >>> nvr.version
+    '1.2.3'
+    >>> nvr.release
+    '4.el6'
+
+    >>> nvr_new = NVR.parse("ovirt-node-1.2.3-5.el6")
+    >>> nvr < nvr_new
+    True
+
+    >>> nvr_new = NVR.parse("ovirt-node-2.2.3-4.el6")
+    >>> nvr < nvr_new
+    True
+    """
+    name = None
+    version = None
+    release = None
+
+    @staticmethod
+    def parse(nvr):
+        if not nvr.strip():
+            raise RuntimeError("No package NVR to parse: %s" % nvr)
+        o = NVR()
+        try:
+            nvrtuple = re.match("^(^.*)-([^-]*)-([^-]*)$", nvr).groups()
+        except:
+            raise RuntimeError("Failed to parse NVR: %s" % nvr)
+        if not nvrtuple:
+            raise RuntimeError("Failed to parse nvr: %s" % nvr)
+        o.name, o.version, o.release = nvrtuple
+        return o
+
+    def __cmp__(self, other):
+        if not self.name == other.name:
+            raise RuntimeError("NVRs for different names: %s %s"
+                               % (self.name, other.name))
+        this_version = (None, self.version, self.release)
+        other_version = (None, other.version, other.release)
+        return rpm.labelCompare(this_version,  # @UndefinedVariable
+                                other_version)
+
+    def __str__(self):
+        return "%s-%s-%s" % (self.name, self.version, self.release)
+
+
+class RpmPackage(base.Base):
+    """Provide access to some rpm meta informations
+    """
+
+    name = None
+
+    def __init__(self, name):
+        super(RpmPackage, self).__init__()
+        self.name = name
+
+    def _raw_nvr(self):
+        cmd = ["rpm", "-q", self.name]
+        nvr = process.pipe(cmd).strip().split("\n")
+        self.logger.debug("Found build: %s" % nvr)
+        if len(nvr) != 1:
+            raise RuntimeError("Failed to retrieve nvr for %s: %s" %
+                               (self.name, nvr))
+        return nvr[0]
+
+    def nvr(self):
+        return NVR.parse(self._raw_nvr())
+
+
 class SystemRelease(base.Base):
     """Informations about the OS based on /etc/system-release-cpe
 


-- 
To view, visit http://gerrit.ovirt.org/26182
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I280f18235374da5604747499f2491669d75b9970
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-node
Gerrit-Branch: master
Gerrit-Owner: Fabian Deutsch <fabiand at fedoraproject.org>



More information about the node-patches mailing list