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 <Martin.Jansa@gmail.com>
This commit is contained in:
Martin Jansa
2012-04-05 11:03:02 +02:00
committed by Richard Purdie
parent aa268baf4f
commit 6b62cfb4c8
2 changed files with 50 additions and 30 deletions

View File

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

16
opkg.py
View File

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