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 19af5c468c3343764ee98982209c1f70ff285415 Author: Simon McVittie <[email protected]> Date: Sat Jan 17 00:54:40 2015 +0000 Check for external tools before using them Unlike the shell scripts, we don't need unzip or tar, but we might still need lha (which is only a Suggests) and dynamite (which is a Depends but probably shouldn't be). --- lib/game_data_packager/__init__.py | 60 +++++++++++++++++++++++++++++++++++++- lib/game_data_packager/util.py | 13 +++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/lib/game_data_packager/__init__.py b/lib/game_data_packager/__init__.py index b5f5a45..a0c5875 100644 --- a/lib/game_data_packager/__init__.py +++ b/lib/game_data_packager/__init__.py @@ -44,7 +44,12 @@ from debian.deb822 import Deb822 import yaml from .paths import DATADIR, ETCDIR -from .util import TemporaryUmask, mkdir_p, rm_rf, human_size, MEBIBYTE +from .util import (MEBIBYTE, + TemporaryUmask, + mkdir_p, + rm_rf, + human_size, + which) from .version import GAME_PACKAGE_VERSION logging.basicConfig() @@ -478,6 +483,12 @@ class GameData(object): # Map from GameDataPackage name to whether we can do it self.package_status = defaultdict(lambda: FillResult.UNDETERMINED) + # Set of executables we wanted but don't have + self.missing_tools = set() + + # Set of filenames we couldn't unpack + self.unpack_failed = set() + self._populate_files(self.yaml.get('files')) assert 'packages' in self.yaml @@ -1195,6 +1206,10 @@ class GameData(object): for provider_name in providers: provider = self.files[provider_name] + # don't bother if we wouldn't be able to unpack it anyway + if not self.check_unpacker(provider): + continue + # recurse to unpack or (see whether we can) download the provider provider_status = self.fill_gap(package, provider, download=download, log=log) @@ -1528,6 +1543,11 @@ class GameData(object): build_demos=args.demo) except NoPackagesPossible: logger.error('Unable to complete any packages.') + if self.unpack_failed and self.missing_tools: + # we already logged warnings about the files as they came up + self.log_missing_tools() + raise SystemExit(1) + # probably not enough files supplied? # print the help text, maybe that helps the user to determine # what they should have added @@ -1715,6 +1735,44 @@ class GameData(object): rm_rf(destdir) return outfile + def check_unpacker(self, wanted): + if not wanted.unpack: + return True + + if wanted.name in self.unpack_failed: + return False + + fmt = wanted.unpack['format'] + + if fmt in ('id-shr-extract', 'lha'): + if which(fmt) is None: + logger.warning('cannot unpack "%s": tool "%s" is not ' + + 'installed', wanted.name, fmt) + self.missing_tools.add(fmt) + self.unpack_failed.add(wanted.name) + return False + + return True + + def log_missing_tools(self): + if not self.missing_tools: + return False + + package_map = { + 'id-shr-extract': 'dynamite', + 'lha': 'lhasa', + } + packages = set() + + for t in self.missing_tools: + p = package_map.get(t) + if p is not None: + packages.add(p) + + logger.warning('installing these packages might help:\n' + + 'apt-get install %s', + ' '.join(sorted(packages))) + def load_yaml_games(workdir=None): games = {} diff --git a/lib/game_data_packager/util.py b/lib/game_data_packager/util.py index 16553a7..f31b320 100644 --- a/lib/game_data_packager/util.py +++ b/lib/game_data_packager/util.py @@ -17,6 +17,7 @@ import os import shutil +import stat KIBIBYTE = 1024 MEBIBYTE = KIBIBYTE * KIBIBYTE @@ -49,6 +50,18 @@ def rm_rf(path): if os.path.exists(path): shutil.rmtree(path) +def which(exe): + for path in os.environ.get('PATH', '/usr/bin:/bin').split(os.pathsep): + try: + abspath = os.path.join(path, exe) + statbuf = os.stat(abspath) + except: + continue + if stat.S_IMODE(statbuf.st_mode) & 0o111: + return abspath + + return None + def human_size(size): # 0.0 KiB up to 1024.0 KiB if size < MEBIBYTE: -- 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

