opkg.py/opkg-make-index: Add option to include all fields

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@ni.com>
Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
This commit is contained in:
Jeffrey Pautler
2017-10-05 11:39:32 -05:00
committed by Alejandro del Castillo
parent 6cd5925cf7
commit 13f6281d24
2 changed files with 25 additions and 14 deletions

View File

@@ -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))

28
opkg.py
View File

@@ -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().rstrip()
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
@@ -486,6 +491,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
@@ -519,12 +527,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