mirror of
https://git.yoctoproject.org/git/opkg-utils
synced 2026-03-21 17:21:28 +01:00
224 lines
7.3 KiB
Python
Executable File
224 lines
7.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import sys, os, posixpath
|
|
from glob import glob
|
|
import subprocess
|
|
import opkg
|
|
import getopt
|
|
import re
|
|
|
|
verbose = 0
|
|
|
|
def usage():
|
|
sys.stderr.write("%s [-h] [-s] [-m] [-l Packages.filelist] [-p Packages] [-r Packages.old] [-L localesdir] [-v] packagesdir\n" % (sys.argv[0],))
|
|
sys.exit(-1)
|
|
|
|
def to_morgue(filename):
|
|
morgue_dir = pkg_dir + "/morgue"
|
|
if verbose:
|
|
sys.stderr.write ("Moving " + filename + " to morgue\n")
|
|
if not os.path.exists(morgue_dir):
|
|
os.mkdir(morgue_dir)
|
|
if os.path.exists(pkg_dir + "/" + filename):
|
|
os.rename(pkg_dir + "/" + filename, morgue_dir + "/" + filename)
|
|
if os.path.exists(pkg_dir + "/" + filename + ".asc"):
|
|
os.rename(pkg_dir + "/" + filename + ".asc", morgue_dir + "/" + filename + ".asc")
|
|
|
|
locales_dir = None
|
|
def to_locale(filename, locale):
|
|
locale_dir = pkg_dir + '/' + locales_dir + '/' + locale + "/"
|
|
if verbose:
|
|
sys.stderr.write ("Moving " + filename + " to " + locale_dir + "\n")
|
|
if not os.path.exists(locale_dir):
|
|
os.mkdir(locale_dir)
|
|
os.rename(pkg_dir + "/" + filename, locale_dir + "/" + filename)
|
|
if os.path.exists(pkg_dir + "/" + filename + ".asc"):
|
|
os.rename(pkg_dir + "/" + filename + ".asc", locale_dir + "/" + filename + ".asc")
|
|
|
|
old_filename = None
|
|
packages_filename = None
|
|
filelist_filename = "Packages.filelist"
|
|
stamplist_filename = "Packages.stamps"
|
|
opt_s = 0
|
|
opt_m = 0
|
|
(opts, remaining_args) = getopt.getopt(sys.argv[1:], "hl:p:vsmr:L:")
|
|
for (optkey, optval) in opts:
|
|
if optkey == '-h':
|
|
usage()
|
|
if optkey == '-s':
|
|
opt_s = 1
|
|
if optkey == '-p':
|
|
packages_filename = optval
|
|
stamplist_filename = optval + ".stamps"
|
|
if optkey == '-l':
|
|
filelist_filename = optval
|
|
if optkey == '-v':
|
|
verbose = 1
|
|
if optkey == '-m':
|
|
opt_m = 1
|
|
if optkey == '-r':
|
|
old_filename = optval
|
|
if optkey == '-L':
|
|
locales_dir = optval
|
|
|
|
if ( not remaining_args ):
|
|
usage()
|
|
|
|
pkg_dir=remaining_args[0]
|
|
|
|
packages = opkg.Packages()
|
|
|
|
old_pkg_hash = {}
|
|
if packages_filename and not old_filename and os.path.exists(packages_filename):
|
|
old_filename = packages_filename
|
|
|
|
pkgsStamps = {}
|
|
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)
|
|
for k in list(old_packages.packages.keys()):
|
|
p = old_packages.packages[k]
|
|
old_pkg_hash[p.filename] = p
|
|
try:
|
|
f = open(stamplist_filename, "r")
|
|
for l in f:
|
|
l = l.strip()
|
|
s, f = l.split(" ", 1)
|
|
pkgsStamps[f] = int(s)
|
|
except IOError:
|
|
pass
|
|
|
|
if (verbose):
|
|
sys.stderr.write("Reading in all the package info from %s\n" % (pkg_dir, ))
|
|
files=glob(pkg_dir + '/*.opk') + glob(pkg_dir + '/*.deb') + glob(pkg_dir + '/*.ipk')
|
|
files.sort()
|
|
for filename in files:
|
|
try:
|
|
basename = os.path.basename(filename)
|
|
pkg = None
|
|
fnameStat = os.stat(filename)
|
|
if basename in old_pkg_hash:
|
|
if basename in pkgsStamps and int(fnameStat.st_mtime) == pkgsStamps[basename]:
|
|
if (verbose):
|
|
sys.stderr.write("Found %s in Packages\n" % (filename,))
|
|
pkg = old_pkg_hash[basename]
|
|
else:
|
|
sys.stderr.write("Found %s in Packages, but mtime differs - re-reading\n" % (filename,))
|
|
|
|
if not pkg:
|
|
if (verbose):
|
|
sys.stderr.write("Reading info for package %s\n" % (filename,))
|
|
pkg = opkg.Package(filename)
|
|
pkg_key = ("%s:%s" % (pkg.package, pkg.architecture))
|
|
if (pkg_key in packages.packages):
|
|
old_filename = packages.packages[pkg_key].filename
|
|
else:
|
|
old_filename = ""
|
|
s = packages.add_package(pkg)
|
|
pkgsStamps[basename] = fnameStat.st_mtime
|
|
if s == 0:
|
|
if old_filename:
|
|
# old package was displaced by newer
|
|
if opt_m:
|
|
to_morgue(old_filename)
|
|
if opt_s:
|
|
print(("%s/%s" % (pkg_dir, old_filename)))
|
|
else:
|
|
if opt_m:
|
|
to_morgue(basename)
|
|
if opt_s:
|
|
print(filename)
|
|
except OSError as e:
|
|
sys.stderr.write("Package %s disappeared on us!\n(%s)\n" % (filename, e))
|
|
continue
|
|
except IOError as e:
|
|
sys.stderr.write("Package %s disappeared on us!\n(%s)\n" % (filename, e))
|
|
continue
|
|
|
|
pkgsStampsFile = open(stamplist_filename, "w")
|
|
for f in list(pkgsStamps.keys()):
|
|
pkgsStampsFile.write("%d %s\n" % (pkgsStamps[f], f))
|
|
pkgsStampsFile.close()
|
|
|
|
if opt_s:
|
|
sys.exit(0)
|
|
|
|
if verbose:
|
|
sys.stderr.write("Generating Packages file\n")
|
|
if packages_filename:
|
|
tmp_packages_filename = ("%s.%d" % (packages_filename, os.getpid()))
|
|
pkgsFile = open(tmp_packages_filename, "w")
|
|
names = list(packages.packages.keys())
|
|
names.sort()
|
|
for name in names:
|
|
try:
|
|
pkg = packages.packages[name]
|
|
if locales_dir and pkg.depends:
|
|
depends = pkg.depends.split(',')
|
|
locale = None
|
|
for d in depends:
|
|
m = re.match('.*virtual-locale-([a-zA-Z]+).*', d)
|
|
mp = re.match('locale-base-([a-zA-Z]+)([-+])?.*', pkg.package)
|
|
if m:
|
|
locale = m.group(1)
|
|
if mp:
|
|
locale = mp.group(1)
|
|
if locale:
|
|
to_locale(pkg.filename, locale)
|
|
continue
|
|
if (verbose):
|
|
sys.stderr.write("Writing info for package %s\n" % (pkg.package,))
|
|
if packages_filename:
|
|
pkgsFile.write(str(pkg))
|
|
else:
|
|
print(pkg)
|
|
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
|
|
|
|
if packages_filename:
|
|
pkgsFile.close()
|
|
gzip_filename = ("%s.gz" % packages_filename)
|
|
tmp_gzip_filename = ("%s.%d" % (gzip_filename, os.getpid()))
|
|
gzip_cmd = "gzip -9c < %s > %s" % (tmp_packages_filename, tmp_gzip_filename)
|
|
rc = subprocess.check_output(gzip_cmd, shell=True)
|
|
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)
|