This is an automated email from the git hooks/post-receive script. smcv pushed a commit to branch master in repository game-data-packager.
commit e2de410da4979ad5dd390d282a6491ad0a06372c Author: Simon McVittie <[email protected]> Date: Thu Apr 30 09:12:12 2015 +0100 Cache apt and dpkg data rather than repeatedly running the tools This also stops is_installed() from relying on /usr/share/doc, which it is meant to be valid to delete. --- game_data_packager/__init__.py | 9 +++--- game_data_packager/games/z_code.py | 5 +-- game_data_packager/util.py | 65 ++++++++++++++++++++++++-------------- 3 files changed, 50 insertions(+), 29 deletions(-) diff --git a/game_data_packager/__init__.py b/game_data_packager/__init__.py index d3d408e..85149f2 100644 --- a/game_data_packager/__init__.py +++ b/game_data_packager/__init__.py @@ -50,7 +50,7 @@ from .util import (MEBIBYTE, mkdir_p, rm_rf, human_size, - is_installed, + PACKAGE_CACHE, lang_score, which) from .version import GAME_PACKAGE_VERSION @@ -2244,7 +2244,7 @@ class GameData(object): for engine_alt in engines_alt: for engine in reversed(engine_alt.split('|')): engine = engine.split('(')[0].strip() - if is_installed(engine): + if PACKAGE_CACHE.is_installed(engine): break else: engines.add(engine) @@ -2388,7 +2388,7 @@ class GameData(object): if (package.expansion_for and self.packages[package.expansion_for] not in possible - and not is_installed(package.expansion_for)): + and not PACKAGE_CACHE.is_installed(package.expansion_for)): for fullgame in possible: if fullgame.type == 'full': logger.warning("won't generate '%s' expansion, because " @@ -2622,7 +2622,8 @@ class GameData(object): return True # unace-nonfree package diverts /usr/bin/unace from unace package - if fmt == 'unace-nonfree' and is_installed('unace-nonfree'): + if (fmt == 'unace-nonfree' and + PACKAGE_CACHE.is_installed('unace-nonfree')): return True logger.warning('cannot unpack "%s": tool "%s" is not ' + diff --git a/game_data_packager/games/z_code.py b/game_data_packager/games/z_code.py index e5420e7..9ab3deb 100644 --- a/game_data_packager/games/z_code.py +++ b/game_data_packager/games/z_code.py @@ -22,7 +22,7 @@ import os from .. import GameData from ..paths import DATADIR -from ..util import (TemporaryUmask, is_installed, mkdir_p) +from ..util import (TemporaryUmask, PACKAGE_CACHE, mkdir_p) logger = logging.getLogger('game-data-packager.games.z_code') @@ -49,7 +49,8 @@ class ZCodeGameData(GameData): entry = desktop['Desktop Entry'] entry['Name'] = package.longname or self.longname - if is_installed('frotz') and not is_installed('gargoyle-free'): + if (PACKAGE_CACHE.is_installed('frotz') and + not PACKAGE_CACHE.is_installed('gargoyle-free')): engine = 'frotz' entry['Terminal'] = 'true' else: diff --git a/game_data_packager/util.py b/game_data_packager/util.py index 4e2c292..3179d2f 100644 --- a/game_data_packager/util.py +++ b/game_data_packager/util.py @@ -78,29 +78,48 @@ def copy_with_substitutions(from_, to, **kwargs): line = line.replace(k, v) to.write(line) -def is_installed(package): - # FIXME: this shouldn't be hard-coded - if package == 'doom-engine': - return (is_installed('chocolate-doom') - or is_installed('prboom-plus') - or is_installed('doomsday')) - if package == 'boom-engine': - return (is_installed('prboom-plus') - or is_installed('doomsday')) - if package in ('heretic-engine', 'hexen-engine'): - return (is_installed('chocolate-doom') - or is_installed('doomsday')) - - return os.path.isdir(os.path.join('/usr/share/doc', package)) - -def is_available(package): - proc = subprocess.Popen(['apt-cache', 'pkgnames', package], - universal_newlines=True, - stdout=subprocess.PIPE) - for line in proc.stdout: - if line.rstrip() == package: - return True - return False +class PackageCache: + installed = None + available = None + + def is_installed(self, package): + if self.installed is None: + cache = set() + proc = subprocess.Popen(['dpkg-query', '--show', + '--showformat', '${Package}\\n'], + universal_newlines=True, + stdout=subprocess.PIPE) + for line in proc.stdout: + cache.add(line.rstrip()) + self.installed = cache + + # FIXME: this shouldn't be hard-coded + if package == 'doom-engine': + return (self.is_installed('chocolate-doom') + or self.is_installed('prboom-plus') + or self.is_installed('doomsday')) + if package == 'boom-engine': + return (self.is_installed('prboom-plus') + or self.is_installed('doomsday')) + if package in ('heretic-engine', 'hexen-engine'): + return (self.is_installed('chocolate-doom') + or self.is_installed('doomsday')) + + return package in self.installed + + def is_available(self, package): + if self.available is None: + cache = set() + proc = subprocess.Popen(['apt-cache', 'pkgnames'], + universal_newlines=True, + stdout=subprocess.PIPE) + for line in proc.stdout: + cache.add(line.rstrip()) + self.available = cache + + return package in self.available + +PACKAGE_CACHE = PackageCache() def prefered_lang(): lang_raw = [] -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/game-data-packager.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

