summaryrefslogtreecommitdiff
path: root/recipes/ipkg-utils
diff options
context:
space:
mode:
authorDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
committerDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
commit709c4d66e0b107ca606941b988bad717c0b45d9b (patch)
tree37ee08b1eb308f3b2b6426d5793545c38396b838 /recipes/ipkg-utils
parentfa6cd5a3b993f16c27de4ff82b42684516d433ba (diff)
rename packages/ to recipes/ per earlier agreement
See links below for more details: http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326 http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816 Signed-off-by: Denys Dmytriyenko <denis@denix.org> Acked-by: Mike Westerhof <mwester@dls.net> Acked-by: Philip Balister <philip@balister.org> Acked-by: Khem Raj <raj.khem@gmail.com> Acked-by: Marcin Juszkiewicz <hrw@openembedded.org> Acked-by: Koen Kooi <koen@openembedded.org> Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'recipes/ipkg-utils')
-rw-r--r--recipes/ipkg-utils/ipkg-link/link-vfat-libs.patch34
-rw-r--r--recipes/ipkg-utils/ipkg-link_1.6+cvs20050404.bb20
-rw-r--r--recipes/ipkg-utils/ipkg-utils-native_1.6+cvs20050404.bb17
-rw-r--r--recipes/ipkg-utils/ipkg-utils/arfile_even_alignment.patch11
-rw-r--r--recipes/ipkg-utils/ipkg-utils/fields_tweaks.patch70
-rw-r--r--recipes/ipkg-utils/ipkg-utils/ipkg-env.patch54
-rw-r--r--recipes/ipkg-utils/ipkg-utils/ipkg-make-index-track-stamps.patch88
-rw-r--r--recipes/ipkg-utils/ipkg-utils/ipkg-py-sane-vercompare.patch51
-rw-r--r--recipes/ipkg-utils/ipkg-utils/ipkg-py-tarfile.patch316
-rw-r--r--recipes/ipkg-utils/ipkg-utils/ipkg-utils-fix.patch20
-rw-r--r--recipes/ipkg-utils/ipkg-utils_1.6+cvs20050404.bb35
11 files changed, 716 insertions, 0 deletions
diff --git a/recipes/ipkg-utils/ipkg-link/link-vfat-libs.patch b/recipes/ipkg-utils/ipkg-link/link-vfat-libs.patch
new file mode 100644
index 0000000000..7f495f9f4c
--- /dev/null
+++ b/recipes/ipkg-utils/ipkg-link/link-vfat-libs.patch
@@ -0,0 +1,34 @@
+--- ipkg-utils/ipkg-link.orig 2006-04-05 00:08:28.518992136 +0200
++++ ipkg-utils/ipkg-link 2006-04-05 00:08:40.399186072 +0200
+@@ -58,6 +58,31 @@
+ `ln -s "$PREFIX$line" "$line"`
+ fi
+ fi
++
++ # The next function checks whether the _source_ file (ie: /media/card/something)
++ # does actually exist. If it doesn't, it could by a library symlink (ie: libsomething.0.1 -> libsomething.0)
++ # Since VFAT & friends do not support symlinks, these library links would not exist after installation
++ # and trying to symlink them into the rootfs with ipkg-link results in unconnected symlinks in the rootfs.
++ # So we use the real lib file in /media/card/whatever and create all needed symlinks in the rootfs
++ # using the real file as source.
++
++ if [ ! -e "$PREFIX$line" ]; then
++ if ( echo "$line" | grep -q "lib" ) ; then
++ libsearchfile=$(echo $line | sed -e "s#[a-z0-9/.]*/##g")
++ libfoundfiles=$(find $PREFIX -name "$libsearchfile*")
++
++ for liblinkfile in $libfoundfiles; do
++ echo "Linking $line to $liblinkfile"
++ # link will be pointing to nowhere
++ if test -L $line; then
++ rm -f $line
++ fi
++ ln -s $liblinkfile $line
++ done
++ else
++ echo "WARNING: Source file [$PREFIX$line] is missing!"
++ fi
++ fi
+ done
+ }
+
diff --git a/recipes/ipkg-utils/ipkg-link_1.6+cvs20050404.bb b/recipes/ipkg-utils/ipkg-link_1.6+cvs20050404.bb
new file mode 100644
index 0000000000..35e5ba1086
--- /dev/null
+++ b/recipes/ipkg-utils/ipkg-link_1.6+cvs20050404.bb
@@ -0,0 +1,20 @@
+SECTION = "base"
+DESCRIPTION = "Itsy Package Manager utilities link script"
+LICENSE = "GPL"
+CONFLICTS = "ipkg-utils"
+SRCDATE = "20050404"
+PR = "r4"
+
+SRC_URI = "${HANDHELDS_CVS};module=ipkg-utils \
+ file://link-vfat-libs.patch;patch=1"
+
+S = "${WORKDIR}/ipkg-utils"
+
+do_compile() {
+ :
+}
+
+do_install() {
+ install -d ${D}${bindir}
+ install -m 0755 ipkg-link ${D}${bindir}
+}
diff --git a/recipes/ipkg-utils/ipkg-utils-native_1.6+cvs20050404.bb b/recipes/ipkg-utils/ipkg-utils-native_1.6+cvs20050404.bb
new file mode 100644
index 0000000000..758814fa04
--- /dev/null
+++ b/recipes/ipkg-utils/ipkg-utils-native_1.6+cvs20050404.bb
@@ -0,0 +1,17 @@
+require ipkg-utils_${PV}.bb
+
+RDEPENDS = ""
+PR = "r21"
+
+inherit native
+
+# Avoid circular dependencies from package_ipk.bbclass
+PACKAGES = ""
+FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/ipkg-utils"
+INSTALL += "arfile.py"
+
+do_stage() {
+ for i in ${INSTALL}; do
+ install -m 0755 $i ${STAGING_BINDIR}
+ done
+}
diff --git a/recipes/ipkg-utils/ipkg-utils/arfile_even_alignment.patch b/recipes/ipkg-utils/ipkg-utils/arfile_even_alignment.patch
new file mode 100644
index 0000000000..3ab133fb15
--- /dev/null
+++ b/recipes/ipkg-utils/ipkg-utils/arfile_even_alignment.patch
@@ -0,0 +1,11 @@
+--- ipkg-utils/arfile.py.orig 2008-06-11 21:07:01.000000000 -0500
++++ ipkg-utils/arfile.py 2008-06-14 19:56:04.000000000 -0500
+@@ -86,6 +86,8 @@
+ return FileSection(self.f, self.f.tell(), size)
+
+ # Skip data and loop
++ if size % 2:
++ size = size + 1
+ data = self.f.seek(size, 1)
+ # print hex(f.tell())
+
diff --git a/recipes/ipkg-utils/ipkg-utils/fields_tweaks.patch b/recipes/ipkg-utils/ipkg-utils/fields_tweaks.patch
new file mode 100644
index 0000000000..2b08e47ad0
--- /dev/null
+++ b/recipes/ipkg-utils/ipkg-utils/fields_tweaks.patch
@@ -0,0 +1,70 @@
+---
+ Makefile | 2 ++
+ ipkg-list-fields | 13 +++++++++++++
+ ipkg.py | 8 +++++++-
+ 3 files changed, 22 insertions(+), 1 deletion(-)
+
+Index: ipkg-utils/Makefile
+===================================================================
+--- ipkg-utils.orig/Makefile 2007-06-13 22:45:47.000000000 +0100
++++ ipkg-utils/Makefile 2007-06-13 22:46:50.000000000 +0100
+@@ -15,6 +15,8 @@ install: ${UTILS}
+ python setup.py install
+ chmod agu+rx ipkg-make-index
+ cp -f ipkg-make-index $(PREFIX)/bin
++ chmod agu+rx ipkg-list-fields
++ cp -f ipkg-list-fields $(PREFIX)/bin
+
+ binary: build
+ mkdir -p ipkg-build-binary/usr/bin
+Index: ipkg-utils/ipkg-list-fields
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ ipkg-utils/ipkg-list-fields 2007-06-13 22:43:32.000000000 +0100
+@@ -0,0 +1,13 @@
++#!/usr/bin/python
++
++import sys, ipkg
++
++def usage():
++ sys.stderr.write("%s ipk\n" % (sys.argv[0],))
++ sys.exit(-1)
++
++if (len(sys.argv) < 2):
++ usage()
++
++print ipkg.Package(sys.argv[1])
++
+Index: ipkg-utils/ipkg.py
+===================================================================
+--- ipkg-utils.orig/ipkg.py 2007-06-13 22:44:50.000000000 +0100
++++ ipkg-utils/ipkg.py 2007-06-13 22:39:44.000000000 +0100
+@@ -139,6 +139,9 @@ class Package:
+ self.installed_size = None
+ self.filename = None
+ self.isdeb = 0
++ self.homepage = None
++ self.oe = None
++ self.priority = None
+ self.fn = fn
+
+ if fn:
+@@ -211,7 +214,7 @@ class Package:
+ elif self.__dict__.has_key(name):
+ self.__dict__[name] = value
+ else:
+- #print "Lost field %s, %s" % (name,value)
++ print "Lost field %s, %s" % (name,value)
+ pass
+
+ if line and line[0] == '\n':
+@@ -402,6 +405,9 @@ class Package:
+ if self.filename: out = out + "Filename: %s\n" % (self.filename)
+ if self.source: out = out + "Source: %s\n" % (self.source)
+ if self.description: out = out + "Description: %s\n" % (self.description)
++ if self.oe: out = out + "OE: %s\n" % (self.oe)
++ if self.homepage: out = out + "HomePage: %s\n" % (self.homepage)
++ if self.priority: out = out + "Priority: %s\n" % (self.priority)
+ out = out + "\n"
+
+ return out
diff --git a/recipes/ipkg-utils/ipkg-utils/ipkg-env.patch b/recipes/ipkg-utils/ipkg-utils/ipkg-env.patch
new file mode 100644
index 0000000000..7d3025dc6f
--- /dev/null
+++ b/recipes/ipkg-utils/ipkg-utils/ipkg-env.patch
@@ -0,0 +1,54 @@
+diff -Nur ipkg-utils.orig/ipkg-list-fields ipkg-utils/ipkg-list-fields
+--- ipkg-utils.orig/ipkg-list-fields 2009-01-17 21:52:36.000000000 +0100
++++ ipkg-utils/ipkg-list-fields 2009-01-17 21:55:08.000000000 +0100
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/bin/env python
+
+ import sys, ipkg
+
+diff -Nur ipkg-utils.orig/ipkg-make-index ipkg-utils/ipkg-make-index
+--- ipkg-utils.orig/ipkg-make-index 2009-01-17 21:52:36.000000000 +0100
++++ ipkg-utils/ipkg-make-index 2009-01-17 21:55:13.000000000 +0100
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/bin/env python
+ # $Id: ipkg-make-index,v 1.22 2005/03/03 16:39:04 jamey Exp $
+
+ import sys, os, posixpath
+diff -Nur ipkg-utils.orig/ipkg-show-deps ipkg-utils/ipkg-show-deps
+--- ipkg-utils.orig/ipkg-show-deps 2009-01-17 21:52:36.000000000 +0100
++++ ipkg-utils/ipkg-show-deps 2009-01-17 21:55:21.000000000 +0100
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/bin/env python
+ # $Id: ipkg-show-deps,v 1.2 2004/03/06 13:08:33 pb Exp $
+
+ import sys, os, posixpath
+diff -Nur ipkg-utils.orig/ipkg-unbuild ipkg-utils/ipkg-unbuild
+--- ipkg-utils.orig/ipkg-unbuild 2009-01-17 21:52:35.000000000 +0100
++++ ipkg-utils/ipkg-unbuild 2009-01-17 21:55:24.000000000 +0100
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/bin/env python
+
+ import sys, os, re
+
+diff -Nur ipkg-utils.orig/ipkg-update-index ipkg-utils/ipkg-update-index
+--- ipkg-utils.orig/ipkg-update-index 2009-01-17 21:52:36.000000000 +0100
++++ ipkg-utils/ipkg-update-index 2009-01-17 21:55:29.000000000 +0100
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python2.1
++#!/usr/bin/env python
+
+ import sys, os
+ from glob import glob
+diff -Nur ipkg-utils.orig/ipkg-upload ipkg-utils/ipkg-upload
+--- ipkg-utils.orig/ipkg-upload 2009-01-17 21:52:36.000000000 +0100
++++ ipkg-utils/ipkg-upload 2009-01-17 21:55:33.000000000 +0100
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/bin/env python
+
+ import sys, os, os.path, re
+
diff --git a/recipes/ipkg-utils/ipkg-utils/ipkg-make-index-track-stamps.patch b/recipes/ipkg-utils/ipkg-utils/ipkg-make-index-track-stamps.patch
new file mode 100644
index 0000000000..ad6df4f2e9
--- /dev/null
+++ b/recipes/ipkg-utils/ipkg-utils/ipkg-make-index-track-stamps.patch
@@ -0,0 +1,88 @@
+---
+ ipkg-make-index | 31 +++++++++++++++++++++++++++----
+ 1 file changed, 27 insertions(+), 4 deletions(-)
+
+Index: ipkg-utils/ipkg-make-index
+===================================================================
+--- ipkg-utils.orig/ipkg-make-index 2007-05-26 23:45:56.000000000 +0100
++++ ipkg-utils/ipkg-make-index 2007-05-26 23:47:25.000000000 +0100
+@@ -40,6 +40,7 @@ def to_locale(filename, locale):
+ 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:")
+@@ -50,6 +51,7 @@ for (optkey, optval) in opts:
+ opt_s = 1
+ if optkey == '-p':
+ packages_filename = optval
++ stamplist_filename = optval + ".stamps"
+ if optkey == '-l':
+ filelist_filename = optval
+ if optkey == '-v':
+@@ -72,6 +74,7 @@ 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")
+@@ -80,6 +83,14 @@ if old_filename:
+ for k in 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, ))
+@@ -87,11 +98,17 @@ files=glob(pkg_dir + '/*.ipk') + glob(pk
+ files.sort()
+ for filename in files:
+ basename = os.path.basename(filename)
++ pkg = None
++ fnameStat = os.stat(filename)
+ if old_pkg_hash.has_key(basename):
+- if (verbose):
++ if pkgsStamps.has_key(basename) and fnameStat.st_mtime == pkgsStamps[basename]:
++ if (verbose):
+ sys.stderr.write("Found %s in Packages\n" % (filename,))
+- pkg = old_pkg_hash[basename]
+- else:
++ 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 = ipkg.Package(filename)
+@@ -101,6 +118,7 @@ for filename in files:
+ 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
+@@ -114,6 +132,11 @@ for filename in files:
+ if opt_s:
+ print filename
+
++pkgsStampsFile = open(stamplist_filename, "w")
++for f in pkgsStamps.keys():
++ pkgsStampsFile.write("%d %s\n" % (pkgsStamps[f], f))
++pkgsStampsFile.close()
++
+ if opt_s:
+ sys.exit(0)
+
diff --git a/recipes/ipkg-utils/ipkg-utils/ipkg-py-sane-vercompare.patch b/recipes/ipkg-utils/ipkg-utils/ipkg-py-sane-vercompare.patch
new file mode 100644
index 0000000000..00ee391405
--- /dev/null
+++ b/recipes/ipkg-utils/ipkg-utils/ipkg-py-sane-vercompare.patch
@@ -0,0 +1,51 @@
+Only in ipkg-utils: ipkg-py-sane-vercompare.patch
+diff -ur ipkg-utils.org/ipkg.py ipkg-utils/ipkg.py
+--- ipkg-utils.org/ipkg.py 2005-01-08 18:08:52.000000000 +0000
++++ ipkg-utils/ipkg.py 2007-04-04 11:52:46.000000000 +0000
+@@ -48,9 +48,9 @@
+ self.epoch = epoch
+ self.version = version
+
+- def _versioncompare(self, ref):
+- selfversion = self.version
+- refversion = ref.version
++ def _versioncompare(self, selfversion, refversion):
++ if not selfversion: selfversion = ""
++ if not refversion: refversion = ""
+ while 1:
+ ## first look for non-numeric version component
+ selfm = re.match('([^0-9]*)(.*)', selfversion)
+@@ -89,7 +89,18 @@
+ elif (self.epoch < ref.epoch):
+ return -1
+ else:
+- return self._versioncompare(ref)
++ self_ver_comps = re.match(r"(.+?)(-r.+)?$", self.version)
++ ref_ver_comps = re.match(r"(.+?)(-r.+)?$", ref.version)
++ #print (self_ver_comps.group(1), self_ver_comps.group(2))
++ #print (ref_ver_comps.group(1), ref_ver_comps.group(2))
++ r = self._versioncompare(self_ver_comps.group(1), ref_ver_comps.group(1))
++ if r == 0:
++ r = self._versioncompare(self_ver_comps.group(2), ref_ver_comps.group(2))
++ #print "compare: %s vs %s = %d" % (self, ref, r)
++ return r
++
++ def __str__(self):
++ return str(self.epoch) + ":" + self.version
+
+ def parse_version(versionstr):
+ epoch = 0
+@@ -445,6 +456,13 @@
+ return self.packages[key]
+
+ if __name__ == "__main__":
++
++ assert Version(0, "1.2.2-r1").compare(Version(0, "1.2.3-r0")) == -1
++ assert Version(0, "1.2.2-r0").compare(Version(0, "1.2.2+cvs20070308-r0")) == -1
++ assert Version(0, "1.2.2+cvs20070308").compare(Version(0, "1.2.2-r0")) == 1
++ assert Version(0, "1.2.2-r0").compare(Version(0, "1.2.2-r0")) == 0
++ assert Version(0, "1.2.2-r5").compare(Version(0, "1.2.2-r0")) == 1
++
+ package = Package()
+
+ package.set_package("FooBar")
diff --git a/recipes/ipkg-utils/ipkg-utils/ipkg-py-tarfile.patch b/recipes/ipkg-utils/ipkg-utils/ipkg-py-tarfile.patch
new file mode 100644
index 0000000000..10fdbe3901
--- /dev/null
+++ b/recipes/ipkg-utils/ipkg-utils/ipkg-py-tarfile.patch
@@ -0,0 +1,316 @@
+Index: ipkg-utils/arfile.py
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ ipkg-utils/arfile.py 2008-05-30 15:33:49.000000000 +0100
+@@ -0,0 +1,124 @@
++"""
++arfile - A module to parse GNU ar archives.
++
++Copyright (c) 2006-7 Paul Sokolovsky
++This file is released under the terms
++of GNU General Public License v2 or later.
++"""
++import sys
++import os
++import tarfile
++
++
++class FileSection:
++ "A class which allows to treat portion of file as separate file object."
++
++ def __init__(self, f, offset, size):
++ self.f = f
++ self.offset = offset
++ self.size = size
++ self.seek(0, 0)
++
++ def seek(self, offset, whence = 0):
++# print "seek(%x, %d)" % (offset, whence)
++ if whence == 0:
++ return self.f.seek(offset + self.offset, whence)
++ elif whence == 1:
++ return self.f.seek(offset, whence)
++ elif whence == 2:
++ return self.f.seek(self.offset + self.size + offset, 0)
++ else:
++ assert False
++
++ def tell(self):
++# print "tell()"
++ return self.f.tell() - self.offset
++
++ def read(self, size = -1):
++# print "read(%d)" % size
++ return self.f.read(size)
++
++class ArFile:
++
++ def __init__(self, f):
++ self.f = f
++ self.directory = {}
++ self.directoryRead = False
++
++ signature = self.f.readline()
++ assert signature == "!<arch>\n"
++ self.directoryOffset = self.f.tell()
++
++ def open(self, fname):
++ if self.directory.has_key(fname):
++ return FileSection(self.f, self.directory[fname][-1], int(self.directory[fname][5]))
++
++ if self.directoryRead:
++ raise IOError, (2, "AR member not found: " + fname)
++
++ f = self._scan(fname)
++ if f == None:
++ raise IOError, (2, "AR member not found: " + fname)
++ return f
++
++
++ def _scan(self, fname):
++ self.f.seek(self.directoryOffset, 0)
++
++ while True:
++ l = self.f.readline()
++ if not l:
++ self.directoryRead = True
++ return None
++
++ if l == "\n":
++ l = self.f.readline()
++ if not l: break
++ descriptor = l.split()
++# print descriptor
++ size = int(descriptor[5])
++ memberName = descriptor[0][:-1]
++ self.directory[memberName] = descriptor + [self.f.tell()]
++# print "read:", memberName
++ if memberName == fname or (memberName.startswith("`") and memberName[1:] == fname):
++ # Record directory offset to start from next time
++ self.directoryOffset = self.f.tell() + size
++ return FileSection(self.f, self.f.tell(), size)
++
++ # Skip data and loop
++ data = self.f.seek(size, 1)
++# print hex(f.tell())
++
++
++if __name__ == "__main__":
++ if None:
++ f = open(sys.argv[1], "rb")
++
++ ar = ArFile(f)
++ tarStream = ar.open("data.tar.gz")
++ print "--------"
++ tarStream = ar.open("data.tar.gz")
++ print "--------"
++ tarStream = ar.open("control.tar.gz")
++ print "--------"
++ tarStream = ar.open("control.tar.gz2")
++
++ sys.exit(0)
++
++
++ dir = "."
++ if len(sys.argv) > 1:
++ dir = sys.argv[1]
++ for f in os.listdir(dir):
++ if not f.endswith(".ipk"): continue
++
++ print "=== %s ===" % f
++ f = open(dir + "/" + f, "rb")
++
++ ar = ArFile(f)
++ tarStream = ar.open("control.tar.gz")
++ tarf = tarfile.open("control.tar.gz", "r", tarStream)
++ #tarf.list()
++
++ f2 = tarf.extractfile("control")
++ print f2.read()
+Index: ipkg-utils/ipkg.py
+===================================================================
+--- ipkg-utils.orig/ipkg.py 2008-05-30 15:33:49.000000000 +0100
++++ ipkg-utils/ipkg.py 2008-05-30 15:35:58.000000000 +0100
+@@ -41,6 +41,8 @@
+ import string
+ import commands
+ from stat import ST_SIZE
++import arfile
++import tarfile
+
+ class Version:
+ """A class for holding parsed package version information."""
+@@ -131,78 +133,63 @@
+ self.section = None
+ self.filename_header = None
+ self.file_list = []
+- self.md5 = None
++ # md5 is lazy attribute, computed on demand
++ #self.md5 = None
+ self.size = None
+ self.installed_size = None
+ self.filename = None
+ self.isdeb = 0
++ self.fn = fn
+
+ if fn:
+ # see if it is deb format
+- f = open(fn, "r")
++ f = open(fn, "rb")
+ magic = f.read(4)
+- f.close()
++ f.seek(0, 0)
+ if (magic == "!<ar"):
+ self.isdeb = 1
+
+- # compute the MD5.
+- f = open(fn, "r")
+- sum = md5.new()
+- while 1:
+- data = f.read(1024)
+- if not data: break
+- sum.update(data)
+- f.close()
+- if sys.version[:1] > '2':
+- # when using Python 2.0 or newer
+- self.md5 = sum.hexdigest()
+- else:
+- self.md5 = string.join(map((lambda x:"%02x" % ord(x)),sum.digest()),'')
+ stat = os.stat(fn)
+- self.size = stat[ST_SIZE]
++ self.size = stat[ST_SIZE]
+ self.filename = os.path.basename(fn)
+ ## sys.stderr.write(" extracting control.tar.gz from %s\n"% (fn,))
+- if self.isdeb:
+- control = os.popen("ar p "+fn+" control.tar.gz | tar xfzO - './control'","r")
+- else:
+- control = os.popen("tar xfzO "+fn+" 'control.tar.gz' | tar xfzO - './control'","r")
+- line = control.readline()
+- while 1:
+- if not line: break
+- line = string.rstrip(line)
+- lineparts = re.match(r'([\w-]*?):\s*(.*)', line)
+- if lineparts:
+- name = string.lower(lineparts.group(1))
+- value = lineparts.group(2)
+- while 1:
+- line = control.readline()
+- if not line: break
+- if line[0] != ' ': break
+- line = string.rstrip(line)
+- value = value + '\n' + line
+- # don't allow package to override its own filename
+- if name == "filename":
+- self.filename_header = value
+- else:
+- if self.__dict__.has_key(name):
+- self.__dict__[name] = value
+- else:
+- line = control.readline()
++ if self.isdeb:
++ ar = arfile.ArFile(f)
++ tarStream = ar.open("control.tar.gz")
++ tarf = tarfile.open("control.tar.gz", "r", tarStream)
++
++ try:
++ control = tarf.extractfile("control")
++ except KeyError:
++ control = tarf.extractfile("./control")
++ else:
++ control = os.popen("tar --wildcards -xzO -f " + fn + " '*control.tar.gz' | tar xfzO - './control'", "r")
++
++ self.read_control(control)
+ control.close()
+- if self.isdeb:
+- data = os.popen("ar p "+fn+" data.tar.gz | tar tfz -","r")
+- else:
+- data = os.popen("tar xfzO "+fn+" '*data.tar.gz' | tar tfz -","r")
+- while 1:
+- line = data.readline()
+- if not line: break
+- self.file_list.append(string.rstrip(line))
+- data.close()
+
+ self.scratch_dir = None
+ self.file_dir = None
+ self.meta_dir = None
+
++ def __getattr__(self, name):
++ if name == "md5":
++ self._computeFileMD5()
++ return self.md5
++ else:
++ raise AttributeError, name
++
++ def _computeFileMD5(self):
++ # compute the MD5.
++ f = open(self.fn, "rb")
++ sum = md5.new()
++ while 1:
++ data = f.read(1024)
++ if not data: break
++ sum.update(data)
++ f.close()
++ self.md5 = sum.hexdigest()
++
+ def read_control(self, control):
+ import os
+
+@@ -221,9 +208,15 @@
+ value = value + '\n' + line
+ if name == 'size':
+ self.size = int(value)
++ elif name == 'md5sum':
++ self.md5 = value
+ elif self.__dict__.has_key(name):
+ self.__dict__[name] = value
+- if line[0] == '\n':
++ else:
++ #print "Lost field %s, %s" % (name,value)
++ pass
++
++ if line and line[0] == '\n':
+ return # consumes one blank line at end of package descriptoin
+ else:
+ line = control.readline()
+@@ -314,7 +307,27 @@
+ return self.section
+
+ def get_file_list(self):
+- return self.file_list
++ if not self.fn:
++ return []
++
++ if self.isdeb:
++ f = open(self.fn, "rb")
++ ar = arfile.ArFile(f)
++ tarStream = ar.open("data.tar.gz")
++ tarf = tarfile.open("data.tar.gz", "r", tarStream)
++ self.file_list = tarf.getnames()
++ f.close()
++ else:
++ f = os.popen("tar xfzO " + self.fn + " '*data.tar.gz' | tar tfz -","r")
++ while 1:
++ line = f.readline()
++ if not line: break
++ self.file_list.append(string.rstrip(line))
++ f.close()
++
++ # Make sure that filelist has consistent format regardless of tar version
++ self.file_list = map(lambda a: ["./", ""][a.startswith("./")] + a, self.file_list)
++ return self.file_list
+
+ def write_package(self, dirname):
+ buf = self.render_control()
+Index: ipkg-utils/setup.py
+===================================================================
+--- ipkg-utils.orig/setup.py 2005-03-03 16:40:17.000000000 +0000
++++ ipkg-utils/setup.py 2008-05-30 15:33:49.000000000 +0100
+@@ -16,6 +16,6 @@
+ platforms = 'POSIX',
+ keywords = 'ipkg familiar',
+ url = 'http://www.handhelds.org/sources.html/',
+- py_modules = [ 'ipkg' ],
++ py_modules = [ 'ipkg', 'arfile' ],
+ scripts = ['ipkg-compare-indexes', 'ipkg-make-index', 'ipkg-update-index', 'ipkg-build', 'ipkg-unbuild', 'ipkg-upload']
+ )
diff --git a/recipes/ipkg-utils/ipkg-utils/ipkg-utils-fix.patch b/recipes/ipkg-utils/ipkg-utils/ipkg-utils-fix.patch
new file mode 100644
index 0000000000..b3e0d62cd9
--- /dev/null
+++ b/recipes/ipkg-utils/ipkg-utils/ipkg-utils-fix.patch
@@ -0,0 +1,20 @@
+---
+ ipkg.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+Index: ipkg-utils/ipkg.py
+===================================================================
+--- ipkg-utils.orig/ipkg.py 2007-05-26 23:49:05.000000000 +0100
++++ ipkg-utils/ipkg.py 2007-05-26 23:49:23.000000000 +0100
+@@ -152,9 +152,9 @@ class Package:
+ self.filename = os.path.basename(fn)
+ ## sys.stderr.write(" extracting control.tar.gz from %s\n"% (fn,))
+ if self.isdeb:
+- control = os.popen("ar p "+fn+" control.tar.gz | tar xfzO - '*control'","r")
++ control = os.popen("ar p "+fn+" control.tar.gz | tar xfzO - './control'","r")
+ else:
+- control = os.popen("tar xfzO "+fn+" '*control.tar.gz' | tar xfzO - '*control'","r")
++ control = os.popen("tar xfzO "+fn+" 'control.tar.gz' | tar xfzO - './control'","r")
+ line = control.readline()
+ while 1:
+ if not line: break
diff --git a/recipes/ipkg-utils/ipkg-utils_1.6+cvs20050404.bb b/recipes/ipkg-utils/ipkg-utils_1.6+cvs20050404.bb
new file mode 100644
index 0000000000..8baffd24c7
--- /dev/null
+++ b/recipes/ipkg-utils/ipkg-utils_1.6+cvs20050404.bb
@@ -0,0 +1,35 @@
+DESCRIPTION = "Itsy Package Manager utilities"
+SECTION = "base"
+PRIORITY = "optional"
+LICENSE = "GPL"
+CONFLICTS = "ipkg-link"
+RDEPENDS = "python"
+SRCDATE = "20050404"
+PR = "r23"
+
+SRC_URI = "${HANDHELDS_CVS};module=ipkg-utils \
+ file://ipkg-utils-fix.patch;patch=1 \
+ file://ipkg-py-sane-vercompare.patch;patch=1 \
+ file://ipkg-py-tarfile.patch;patch=1 \
+ file://arfile_even_alignment.patch;patch=1 \
+ file://ipkg-make-index-track-stamps.patch;patch=1 \
+ file://fields_tweaks.patch;patch=1 \
+ file://ipkg-env.patch;patch=1 \
+ "
+
+S = "${WORKDIR}/ipkg-utils"
+
+INSTALL = "ipkg-build ipkg-deb-unbuild ipkg-unbuild ipkg-compare-versions ipkg-upload ipkg-make-index ipkg-link ipkg.py ipkg-list-fields"
+
+do_compile() {
+ oe_runmake ipkg-compare-versions
+}
+
+do_install() {
+ install -d ${D}${bindir}
+ for i in ${INSTALL}
+ do
+ install -m 0755 $i ${D}${bindir}
+ done
+}
+