From: Martin Jansa Date: Thu, 5 Apr 2012 11:03:02 +0200 Subject: [PATCH] opkg-make-index: generate complete filelist * when '-l Packages.filelist' option is used together with '-r Packages.old', then only 'new' packages are processed to create Packages.filelist packages found in Packages.old doesn't have fn set so get_file_list() was returning empty * now added get_file_list_dir() looks for filename in pkg_dir and if it finds correct .ipk file it will use that to read its filelist, but it also means that it will always unpack *all* Packages - very slow. * it would be nice to add new param for Packages.filelist.old and then filter filelist for packages used from Packages.old and merge it together with new Packages.filelist, but that's more difficult because of files structure. Signed-off-by: Martin Jansa --- opkg-make-index | 64 ++++++++++++++++++++++++++++++--------------------------- opkg.py | 16 +++++++++++++++ 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/opkg-make-index b/opkg-make-index index 02c425f..4425107 100755 --- a/opkg-make-index +++ b/opkg-make-index @@ -190,34 +190,38 @@ if packages_filename: os.rename(tmp_packages_filename, packages_filename) os.rename(tmp_gzip_filename, gzip_filename) -if verbose: - sys.stderr.write("Generate Packages.filelist file\n") -files = {} -names = list(packages.packages.keys()) -names.sort() -for name in names: - try: - fnlist = packages[name].get_file_list() - except OSError as e: - sys.stderr.write("Package %s disappeared on us!\n(%s)\n" % (name, e)) - continue - except IOError as e: - sys.stderr.write("Package %s disappeared on us!\n(%s)\n" % (name, e)) - continue - for fn in fnlist: - (h,t) = os.path.split(fn) - if not t: continue - if t not in files: files[t] = name+':'+fn - else: files[t] = files[t] + ',' + name+':'+fn - if filelist_filename: - tmp_filelist_filename = ("%s.%d" % (filelist_filename, os.getpid())) - f = open(tmp_filelist_filename, "w") - names = list(files.keys()) - names.sort() - for name in names: - f.write("%s %s\n" % (name, files[name])) - f.close() - if posixpath.exists(filelist_filename): - os.unlink(filelist_filename) - os.rename(tmp_filelist_filename, filelist_filename) + if verbose: + sys.stderr.write("Generate Packages.filelist file\n") + files = {} + names = list(packages.packages.keys()) + names.sort() + for name in names: + try: + if verbose: + sys.stderr.write("Reading filelist for package '%s'\n" % name) +# sys.stderr.write("Package for name '%s':\n'%s'\n" % (name, packages[name])) + fnlist = packages[name].get_file_list_dir(pkg_dir) +# sys.stderr.write("Filelist for package '%s': '%s'\n" % (name, fnlist)) + except OSError as e: + sys.stderr.write("Package %s disappeared on us!\n(%s)\n" % (name, e)) + continue + except IOError as e: + sys.stderr.write("Package %s disappeared on us!\n(%s)\n" % (name, e)) + continue + for fn in fnlist: + (h,t) = os.path.split(fn) + if not t: continue + if t not in files: files[t] = name+':'+fn + else: files[t] = files[t] + ',' + name+':'+fn + + tmp_filelist_filename = ("%s.%d" % (filelist_filename, os.getpid())) + f = open(tmp_filelist_filename, "w") + names = list(files.keys()) + names.sort() + for name in names: + f.write("%s %s\n" % (name, files[name])) + f.close() + if posixpath.exists(filelist_filename): + os.unlink(filelist_filename) + os.rename(tmp_filelist_filename, filelist_filename) diff --git a/opkg.py b/opkg.py index 27cbc2a..707a882 100644 --- a/opkg.py +++ b/opkg.py @@ -325,8 +325,24 @@ class Package: def get_license(self, license): return self.license + def get_file_list_dir(self, directory): + if not self.fn: + try: + cmd = "find %s -name %s | head -n 1" % (directory, self.filename) + rc = subprocess.check_output(cmd, shell=True) + newfn = str(rc).split()[0] +# sys.stderr.write("Package '%s' with empty fn and filename is '%s' was found in '%s', updating fn\n" % (self.package, self.filename, newfn)) + self.fn = newfn + except OSError as e: + sys.stderr.write("Cannot find current fn for package '%s' filename '%s' in dir '%s'\n(%s)\n" % (self.package, self.filename, directory, e)) + except IOError as e: + sys.stderr.write("Cannot find current fn for package '%s' filename '%s' in dir '%s'\n(%s)\n" % (self.package, self.filename, directory, e)) + return self.get_file_list() + + def get_file_list(self): if not self.fn: + sys.stderr.write("Package '%s' has empty fn returning empty filelist\n" % (self.package)) return [] f = open(self.fn, "rb") ar = arfile.ArFile(f, self.fn)