From 54fc45f8fae699acb7387d8d48aa59e08f12999c Mon Sep 17 00:00:00 2001 From: Anders F Bjorklund Date: Sat, 24 Apr 2010 15:06:15 +0200 Subject: [PATCH] Added PortsDistribution (for FreeBSD) --- tests/ports/zeroinstall-injector-0.41_2/+CONTENTS | 4 +++ tests/testdistro.py | 10 ++++++ zeroinstall/injector/distro.py | 42 ++++++++++++++++++++--- 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 tests/ports/zeroinstall-injector-0.41_2/+CONTENTS diff --git a/tests/ports/zeroinstall-injector-0.41_2/+CONTENTS b/tests/ports/zeroinstall-injector-0.41_2/+CONTENTS new file mode 100644 index 0000000..f36401e --- /dev/null +++ b/tests/ports/zeroinstall-injector-0.41_2/+CONTENTS @@ -0,0 +1,4 @@ +@comment PKG_FORMAT_REVISION:1.1 +@name zeroinstall-injector-0.41_2 +@comment ORIGIN:devel/zeroinstall-injector +@cwd /usr/local diff --git a/tests/testdistro.py b/tests/testdistro.py index b48dd85..c9c9953 100755 --- a/tests/testdistro.py +++ b/tests/testdistro.py @@ -152,6 +152,16 @@ class TestDistro(BaseTest): self.assertEquals('20100220', impl.get_version()) self.assertEquals('i386', impl.machine) + def testPorts(self): + pkgdir = os.path.join(os.path.dirname(__file__), 'ports') + ports = distro.PortsDistribution(pkgdir) + + ports.get_package_info('zeroinstall-injector', self.factory) + self.assertEquals(1, len(self.feed.implementations)) + impl = self.feed.implementations['package:ports:zeroinstall-injector:0.41:x86_64'] + self.assertEquals('0.41', impl.get_version()) + self.assertEquals('x86_64', impl.machine) + def testCleanVersion(self): self.assertEquals('1', distro.try_cleanup_distro_version('1:0.3.1-1')) self.assertEquals('0.3.1-1', distro.try_cleanup_distro_version('0.3.1-1ubuntu0')) diff --git a/zeroinstall/injector/distro.py b/zeroinstall/injector/distro.py index 8582e29..fcb7659 100644 --- a/zeroinstall/injector/distro.py +++ b/zeroinstall/injector/distro.py @@ -7,7 +7,7 @@ Integration with native distribution package managers. # See the README file for details, or visit http://0install.net. from zeroinstall import _ -import os, re, glob, subprocess +import os, re, glob, subprocess, sys from logging import warn, info from zeroinstall.injector import namespaces, model, arch from zeroinstall.support import basedir @@ -392,6 +392,37 @@ class GentooDistribution(Distribution): def get_score(self, disto_name): return int(disto_name == 'Gentoo') +class PortsDistribution(Distribution): + + def __init__(self, pkgdir): + self._pkgdir = pkgdir + + def get_package_info(self, package, factory): + _version_start_reqexp = '-[0-9]' + + for pkgname in os.listdir(self._pkgdir): + pkgdir = os.path.join(self._pkgdir, pkgname) + if not os.path.isdir(pkgdir): continue + + #contents = file(os.path.join(pkgdir, '+CONTENTS')).readline().strip() + + match = re.search(_version_start_reqexp, pkgname) + if match is None: + warn(_('Cannot parse version from Ports package named "%(pkgname)s"'), {'name': pkgname}) + continue + else: + name = pkgname[0:match.start()] + version = try_cleanup_distro_version(pkgname[match.start() + 1:]) + + machine = arch.canonicalize_machine(host_machine) + + impl = factory('package:ports:%s:%s:%s' % \ + (package, version, machine)) + impl.version = model.parse_version(version) + impl.machine = machine + + def get_score(self, disto_name): + return int(disto_name == 'Ports') _host_distribution = None def get_host_distribution(): @@ -403,10 +434,13 @@ def get_host_distribution(): dpkg_db_status = '/var/lib/dpkg/status' pkgcache = '/var/cache/apt/pkgcache.bin' _rpm_db = '/var/lib/rpm/Packages' - _gentoo_db = '/var/db/pkg' + _pkg_db = '/var/db/pkg' - if os.path.isdir(_gentoo_db): - _host_distribution = GentooDistribution(_gentoo_db) + if os.path.isdir(_pkg_db): + if sys.platform.startswith("linux"): + _host_distribution = GentooDistribution(_pkg_db) + elif sys.platform.startswith("freebsd"): + _host_distribution = PortsDistribution(_pkg_db) elif os.access(dpkg_db_status, os.R_OK): _host_distribution = DebianDistribution(dpkg_db_status, pkgcache) elif os.path.isfile(_rpm_db): -- 2.11.4.GIT