[yocto] [opkg-utils PATCH] opkg.py/opkg-make-index: Add option to include all fields

Jeffrey Pautler jeffrey.pautler at ni.com
Thu Oct 5 10:03:04 PDT 2017


If the -f option is enabled, opkg-make-index will include user-defined
fields in the package index rather than discarding them. This change is
motivated by the fact that opkg now has support for user-defined fields
in the package index.

Signed-off-by: Jeffrey Pautler <jeffrey.pautler at ni.com>
---
opkg-make-index | 11 +++++++----
opkg.py         | 28 ++++++++++++++++++----------
2 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/opkg-make-index b/opkg-make-index
index 3f757f6..3227fc0 100755
--- a/opkg-make-index
+++ b/opkg-make-index
@@ -11,7 +11,7 @@ import re
verbose = 0
 def usage():
-     sys.stderr.write("%s [-h] [-s] [-m] [-a] [-l Packages.filelist] [-p Packages] [-r Packages.old] [-L localesdir] [-v] packagesdir\n" % (sys.argv[0],))
+     sys.stderr.write("%s [-h] [-s] [-m] [-a] [-f] [-l Packages.filelist] [-p Packages] [-r Packages.old] [-L localesdir] [-v] packagesdir\n" % (sys.argv[0],))
      sys.exit(-1)
 def to_morgue(filename):
@@ -43,7 +43,8 @@ stamplist_filename = "Packages.stamps"
opt_s = 0
opt_m = 0
opt_a = 0
-(opts, remaining_args) = getopt.getopt(sys.argv[1:], "hl:p:vsmr:L:a")
+opt_f = 0
+(opts, remaining_args) = getopt.getopt(sys.argv[1:], "hl:p:vsmr:L:af")
for (optkey, optval) in opts:
      if optkey == '-h':
           usage()
@@ -64,6 +65,8 @@ for (optkey, optval) in opts:
           locales_dir = optval
      if optkey == '-a':
           opt_a = 1
+     if optkey == '-f':
+          opt_f = 1
 if ( not remaining_args ):
      usage()
@@ -81,7 +84,7 @@ if old_filename:
      if (verbose):
           sys.stderr.write("Reading package list from " + old_filename + "\n")
      old_packages = opkg.Packages()
-     old_packages.read_packages_file(old_filename)
+     old_packages.read_packages_file(old_filename, opt_f)
      for k in list(old_packages.packages.keys()):
           p = old_packages.packages[k]
           old_pkg_hash[p.filename] = p
@@ -122,7 +125,7 @@ for abspath in files:
      if not pkg:
           if (verbose):
                sys.stderr.write("Reading info for package %s\n" % (filename,))
-          pkg = opkg.Package(abspath, relpath=pkg_dir)
+          pkg = opkg.Package(abspath, relpath=pkg_dir, all_fields=opt_f)
      if opt_a:
           pkg_key = ("%s:%s:%s" % (pkg.package, pkg.architecture, pkg.version))
diff --git a/opkg.py b/opkg.py
index 9131755..cdadcab 100644
--- a/opkg.py
+++ b/opkg.py
@@ -45,6 +45,7 @@ from stat import ST_SIZE
import arfile
import tarfile
import textwrap
+import collections
 class Version(object):
     """A class for holding parsed package version information."""
@@ -123,7 +124,7 @@ class Package(object):
     # relpath: If this argument is set, the file path is given relative to this
     #   path when a string representation of the Package object is created. If
     #   this argument is not set, the basename of the file path is given.
-    def __init__(self, fn=None, relpath=None):
+    def __init__(self, fn=None, relpath=None, all_fields=None):
         self.package = None
         self.version = 'none'
         self.parsed_version = None
@@ -153,6 +154,7 @@ class Package(object):
         self.fn = fn
         self.license = None
+        self.user_defined_fields = collections.OrderedDict()
         if fn:
             # see if it is deb format
             f = open(fn, "rb")
@@ -176,7 +178,7 @@ class Package(object):
             except KeyError:
                 control = tarf.extractfile("./control")
             try:
-                self.read_control(control)
+                self.read_control(control, all_fields)
             except TypeError as e:
                 sys.stderr.write("Cannot read control file '%s' - %s\n" % (fn, e))
             control.close()
@@ -215,7 +217,7 @@ class Package(object):
             self.size = stat[ST_SIZE]
         return int(self.size)
-    def read_control(self, control):
+    def read_control(self, control, all_fields=None):
         import os
         line = control.readline()
@@ -227,19 +229,22 @@ class Package(object):
             line = line.rstrip()
             lineparts = re.match(r'([\w-]*?):\s*(.*)', line)
             if lineparts:
-                name = lineparts.group(1).lower()
+                name = lineparts.group(1)
+                name_lowercase = name.lower()
                 value = lineparts.group(2)
                 while 1:
                     line = control.readline()
                     if not line: break
                     if line[0] != ' ': break
                     value = value + '\n' + line
-                if name == 'size':
+                if name_lowercase == 'size':
                     self.size = int(value)
-                elif name == 'md5sum':
+                elif name_lowercase == 'md5sum':
                     self.md5 = value
-                elif name in self.__dict__:
-                    self.__dict__[name] = value
+                elif name_lowercase in self.__dict__:
+                    self.__dict__[name_lowercase] = value
+                elif all_fields:
+                    self.user_defined_fields[name] = value
                 else:
                     print("Lost field %s, %s" % (name,value))
                     pass
@@ -490,6 +495,9 @@ class Package(object):
         if self.license: out = out + "License: %s\n" % (self.license)
         if self.priority: out = out + "Priority: %s\n" % (self.priority)
         if self.tags: out = out + "Tags: %s\n" % (self.tags)
+        if self.user_defined_fields:
+            for k, v in self.user_defined_fields.items():
+                out = out + "%s: %s\n" % (k, v)
         out = out + "\n"
         return out
@@ -523,12 +531,12 @@ class Packages(object):
         else:
             return 1
-    def read_packages_file(self, fn):
+    def read_packages_file(self, fn, all_fields=None):
         f = open(fn, "r")
         while True:
             pkg = Package()
             try:
-                pkg.read_control(f)
+                pkg.read_control(f, all_fields)
             except TypeError as e:
                 sys.stderr.write("Cannot read control file '%s' - %s\n" % (fn, e))
                 continue
--
2.7.4
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.yoctoproject.org/pipermail/yocto/attachments/20171005/5a6a8a6d/attachment.html>


More information about the yocto mailing list