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 2176e41c05d982bf022f8a6bd3f0d7b931f31586 Author: Simon McVittie <[email protected]> Date: Mon Jan 25 01:11:46 2016 +0000 Use {context:value} syntax for context-specific engine or install_to In fact this generalizes slightly from what's required for that change, supporting it for anything that goes through PackagingSystem.substitute(). This makes GameDataPackage and GameData completely format- and distribution-agnostic, with all the distro-specifics happening in the PackagingTask. --- data/heretic.yaml | 12 ++------ data/hexen.yaml | 16 ++-------- data/quake3.yaml | 10 +++---- data/rott.yaml | 13 ++++----- data/spear-of-destiny.yaml | 19 ++++++------ data/strife.yaml | 8 ++--- data/wolf3d.yaml | 28 ++++++++++-------- game_data_packager/__init__.py | 50 +++++++++++++++----------------- game_data_packager/build.py | 37 +++++++++++++++++++---- game_data_packager/games/doom_common.py | 37 +++++++++++++---------- game_data_packager/games/z_code.py | 4 +-- game_data_packager/packaging/__init__.py | 11 +++++++ 12 files changed, 136 insertions(+), 109 deletions(-) diff --git a/data/heretic.yaml b/data/heretic.yaml index ad094ab..229089a 100644 --- a/data/heretic.yaml +++ b/data/heretic.yaml @@ -8,7 +8,9 @@ copyright: © 1994 Raven Software plugin: doom_common wiki: Heretic -engine: "chocolate-heretic | heretic-engine" +engine: + deb: "chocolate-heretic | heretic-engine" + generic: chocolate-doom help_text: | Please provide HERETIC.WAD from Heretic v1.3, and/or HERETIC1.WAD @@ -27,10 +29,6 @@ packages: steam: id: 2390 path: "common/Heretic Shadow of the Serpent Riders" - fedora: - engine: chocolate-doom - suse: - engine: chocolate-doom install: - heretic.wad @@ -39,10 +37,6 @@ packages: demo_for: heretic-wad component: non-free replaces: heretic-shareware-data - fedora: - engine: chocolate-doom - suse: - engine: chocolate-doom install: - heretic1.wad license: diff --git a/data/hexen.yaml b/data/hexen.yaml index 60a9de3..63c2d9e 100644 --- a/data/hexen.yaml +++ b/data/hexen.yaml @@ -20,7 +20,9 @@ help_text: | plugin: doom_common wiki: Hexen -engine: "chocolate-hexen | hexen-engine" +engine: + deb: "chocolate-hexen | hexen-engine" + generic: chocolate-doom packages: hexen-wad: @@ -29,10 +31,6 @@ packages: steam: id: 2360 path: "common/Hexen" - fedora: - engine: chocolate-doom - suse: - engine: chocolate-doom install: - hexen.wad @@ -42,10 +40,6 @@ packages: breaks: - deb: chocolate-doom (<< 2) replaces: hexen-deathkings-data - fedora: - engine: chocolate-doom - suse: - engine: chocolate-doom steam: id: 2370 path: "common/Hexen Deathkings of the Dark Citadel" @@ -58,10 +52,6 @@ packages: replaces: hexen-demo-data breaks: - deb: chocolate-doom (<< 2.2.0) - fedora: - engine: chocolate-doom - suse: - engine: chocolate-doom demo_for: hexen-wad install: - hexendemo.wad diff --git a/data/quake3.yaml b/data/quake3.yaml index bd5e57a..1df8e57 100644 --- a/data/quake3.yaml +++ b/data/quake3.yaml @@ -2,7 +2,9 @@ longname: Quake III Arena franchise: Quake copyright: © 1999 id Software -engine: quake3 | quake3-server +engine: + deb: quake3 | quake3-server + generic: ioquake3 genre: First-person shooter wikibase: http://quake.wikia.com/wiki/ wiki: Quake_III_Arena @@ -42,10 +44,8 @@ packages: steam: id: 2200 path: "common/Quake 3 Arena" - rpm: - engine: ioquake3 - mageia: - install_to: usr/share/ioquake3 + install_to: + mageia: usr/share/ioquake3 gog: url: quake_iii_gold # We deliberately only put baseq3 in the search path, not diff --git a/data/rott.yaml b/data/rott.yaml index fab0657..ecfbbb3 100644 --- a/data/rott.yaml +++ b/data/rott.yaml @@ -1,7 +1,9 @@ --- longname: Rise of the Triad copyright: © 1995 Apogee Software -engine: rott +engine: + fedora: rott-registered + generic: rott genre: First-person shooter help_text: | @@ -27,8 +29,9 @@ packages: description: | Use the 'rott-shareware' command to play this game. suggests: rott-registered-data - fedora: - engine: rott-shareware + engine: + fedora: rott-shareware + generic: rott install: - DEMO1_3.DMO - DEMO2_3.DMO @@ -48,8 +51,6 @@ packages: Use the 'rott-commercial' command to play this game. depends: rott-data - fedora: - engine: rott-registered url_misc: https://3drealms.com/catalog/rise-triad-dark-war_44/ install_to: $assets/rott install: @@ -66,8 +67,6 @@ packages: longname: "Extreme Rise of the Triad" description: | Use the 'rott-commercial -filertl extreme.rtl' command to play this game. - fedora: - engine: rott-registered install_to: $assets/rott install: - EXTREME.RTL diff --git a/data/spear-of-destiny.yaml b/data/spear-of-destiny.yaml index bf526b7..d6d3116 100644 --- a/data/spear-of-destiny.yaml +++ b/data/spear-of-destiny.yaml @@ -64,9 +64,10 @@ packages: deb: spear-of-destiny-mission1-data | spear-of-destiny-mission2-data | spear-of-destiny-mission3-data generic: spear-of-destiny-mission-pack install_to: usr/share/games/wolf3d - fedora: - engine: wolf4sdl-spear - install_to: usr/share/spear/full + engine: + fedora: wolf4sdl-spear + install_to: + fedora: usr/share/spear/full install: - audiohed.sod - audiot.sod @@ -82,8 +83,8 @@ packages: Each mission consists of 21 levels. install_to: usr/share/games/wolf3d - fedora: - install_to: usr/share/spear/full + install_to: + fedora: usr/share/spear/full provides: spear-of-destiny-mission-pack install: - gamemaps.sd1 @@ -100,8 +101,8 @@ packages: description: "Each mission pack provides 21 levels." wiki: Return_to_Danger install_to: usr/share/games/wolf3d - fedora: - install_to: usr/share/spear/full + install_to: + fedora: usr/share/spear/full provides: spear-of-destiny-mission-pack install: - gamemaps.sd2 @@ -114,8 +115,8 @@ packages: description: "Each mission pack provides 21 levels." wiki: Ultimate_Challenge install_to: usr/share/games/wolf3d - fedora: - install_to: usr/share/spear/full + install_to: + fedora: usr/share/spear/full provides: spear-of-destiny-mission-pack install: - gamemaps.sd3 diff --git a/data/strife.yaml b/data/strife.yaml index 03d5f1b..4ca6d16 100644 --- a/data/strife.yaml +++ b/data/strife.yaml @@ -9,7 +9,9 @@ copyright: © 1996 Rogue Entertainment plugin: doom_common wiki: Strife genre: Role Playing -engine: "chocolate-strife | strife-engine" +engine: + deb: "chocolate-strife | strife-engine" + generic: chocolate-doom help_text: | Please provide the STRIFE1.WAD and VOICES.WAD from @@ -27,10 +29,6 @@ packages: id: 317040 path: common/Strife native: true - fedora: - engine: chocolate-doom - suse: - engine: chocolate-doom install: - strife1.wad - voices.wad diff --git a/data/wolf3d.yaml b/data/wolf3d.yaml index 3d5decf..c25c460 100644 --- a/data/wolf3d.yaml +++ b/data/wolf3d.yaml @@ -75,9 +75,11 @@ packages: * Episode 6: Confrontation provides: wolf3d-data mutually_exclusive: True - fedora: - engine: wolf4sdl-registered-id - install_to: usr/share/wolf3d/registered-id + engine: + fedora: wolf4sdl-registered-id + install_to: + fedora: usr/share/wolf3d/registered-id + generic: usr/share/games/wolf3d steam: id: 2270 path: common/Wolfenstein 3D @@ -85,7 +87,6 @@ packages: url: wolfenstein_3d_and_spear_of_destiny game: wolfenstein_3d url_misc: https://3drealms.com/catalog/wolfenstein-3d_25/ - install_to: usr/share/games/wolf3d install: - audiohed.wl6 - audiot.wl6 @@ -110,10 +111,12 @@ packages: * Episode 6: Confrontation provides: wolf3d-data mutually_exclusive: True - fedora: - engine: wolf4sdl-registered-id - install_to: usr/share/wolf3d/registered-id - install_to: usr/share/games/wolf3d + engine: + fedora: + wolf4sdl-registered-id + install_to: + fedora: usr/share/wolf3d/registered-id + generic: usr/share/games/wolf3d install: - audiohed.wl6 - audiot.wl6 @@ -138,10 +141,11 @@ packages: * Episode 6: Confrontation provides: wolf3d-data conflicts: wolf3d-data - fedora: - engine: wolf4sdl-registered-apogee - install_to: usr/share/wolf3d/registered-apogee - install_to: usr/share/games/wolf3d + engine: + fedora: wolf4sdl-registered-apogee + install_to: + fedora: usr/share/wolf3d/registered-apogee + generic: usr/share/games/wolf3d install: - audiohed.wl6 - audiot.wl6 diff --git a/game_data_packager/__init__.py b/game_data_packager/__init__.py index 7786a46..0839105 100644 --- a/game_data_packager/__init__.py +++ b/game_data_packager/__init__.py @@ -34,7 +34,7 @@ from .build import (PackagingTask) from .data import (PackageRelation, WantedFile) from .paths import (DATADIR, USE_VFS) from .util import ascii_safe -from .version import (DISTRO, FORMAT, GAME_PACKAGE_VERSION) +from .version import (GAME_PACKAGE_VERSION) logging.basicConfig() logger = logging.getLogger(__name__) @@ -102,9 +102,11 @@ class GameDataPackage(object): # put 'usr/share/games/quake3/baseq3/pak1.pk3' in the .deb. # The default is 'usr/share/games/' plus the binary package's name. if name.endswith('-data'): - self.install_to = '$assets/' + name[:len(name) - 5] + self.default_install_to = '$assets/' + name[:len(name) - 5] else: - self.install_to = '$assets/' + name + self.default_install_to = '$assets/' + name + + self.install_to = self.default_install_to # If true, this package is allowed to be empty self.empty = False @@ -388,6 +390,9 @@ class GameData(object): if k in self.data: setattr(self, k, self.data[k]) + if isinstance(self.engine, dict) and 'generic' not in self.engine: + self.engine['generic'] = None + assert type(self.missing_langs) is list if 'aliases' in self.data: @@ -669,6 +674,17 @@ class GameData(object): if k in d: setattr(package, k, d[k]) + if isinstance(package.engine, dict): + if isinstance(self.engine, dict): + for k in self.engine: + package.engine.setdefault(k, self.engine[k]) + else: + package.engine.setdefault('generic', self.engine) + + if isinstance(package.install_to, dict): + package.install_to.setdefault('generic', + package.default_install_to) + if 'better_version' in d: assert 'better_versions' not in d package.better_versions = set([d['better_version']]) @@ -701,26 +717,8 @@ class GameData(object): package.relations[rel].append(pr) - for port in ( - # packaging formats (we treat "debian" as "any dpkg-based" - # for historical reasons) - 'debian', 'rpm', - # specific distributions - 'arch', 'fedora', 'mageia', 'suse', - ): - - for k in d.get(port, {}): - if k in ('engine', 'install_to', 'description'): - # FIXME: this object's contents should be 1:1 mapped - # from the YAML, and not format- or distribution-specific. - # Distribution-specific stuff should be done in the - # PackagingTask or PackagingSystem - if port in d and (FORMAT == port or DISTRO == port or - (FORMAT == 'deb' and port == 'debian')): - setattr(package, k, d[port][k]) - else: - raise AssertionError('%s: unknown key %r in port %r' % - (package.name, k, port)) + for port in ('debian', 'rpm', 'arch', 'fedora', 'mageia', 'suse'): + assert port not in d assert self.copyright or package.copyright, package.name assert package.component in ('main', 'contrib', 'non-free', 'local') @@ -743,9 +741,9 @@ class GameData(object): assert package.name not in packages, \ "%s should not be in its own %s set" % (package.name, rel) - if 'install_to' in d: - assert '$assets/' + package.name != d['install_to'] + '-data', \ - "install_to %s is extraneous" % package.name + if 'install_to' in d and isinstance(d['install_to'], str): + assert d['install_to'] != package.default_install_to, \ + "install_to for %s is extraneous" % package.name if 'demo_for' in d: if package.disks is None: diff --git a/game_data_packager/build.py b/game_data_packager/build.py index 63ec622..fc9853d 100644 --- a/game_data_packager/build.py +++ b/game_data_packager/build.py @@ -1304,7 +1304,10 @@ class PackagingTask(object): if package.expansion_for: pkginfo.write('depend = %s\n' % package.expansion_for) else: - engine = package.engine or self.game.engine + engine = self.packaging.substitute( + package.engine or self.game.engine, + package.name) + if engine and len(engine.split()) == 1: pkginfo.write('depend = %s\n' % engine) @@ -1397,7 +1400,9 @@ class PackagingTask(object): if package.expansion_for: spec.write('Requires: %s\n' % package.expansion_for) else: - engine = package.engine or self.game.engine + engine = self.packaging.substitute( + package.engine or self.game.engine, + package.name) if engine and len(engine.split()) == 1: spec.write('Requires: %s\n' % engine) @@ -1665,7 +1670,10 @@ class PackagingTask(object): if package.mutually_exclusive: dep['replaces'] |= dep['provides'] - engine = package.engine or self.game.engine + engine = self.packaging.substitute( + package.engine or self.game.engine, + package.name) + if engine and '>=' in engine: dep['breaks'].add(engine.replace('>=', '<<')) engine = engine.split()[0] @@ -1772,7 +1780,10 @@ class PackagingTask(object): copyright = package.copyright or self.game.copyright long_desc += ' Published by: ' + copyright.split(' ', 2)[2] - engine = package.engine or self.game.engine + engine = self.packaging.substitute( + package.engine or self.game.engine, + package.name) + if engine and package.section == 'games': long_desc += '\n .\n' if '|' in engine: @@ -1798,8 +1809,14 @@ class PackagingTask(object): return os.path.join(DATADIR, package.name + '.control.in') def look_for_engines(self, packages, force=False): - engines = set(p.engine or self.game.engine for p in packages) + engines = set() + + for p in packages: + engines.add(self.packaging.substitute(p.engine or self.game.engine, + p.name)) + engines.discard(None) + if not engines: return @@ -2029,9 +2046,16 @@ class PackagingTask(object): self.packaging.install_packages(debs, method=args.install_method, gain_root=args.gain_root_command) - engines_alt = set((p.engine or self.game.engine) for p in ready) + + engines_alt = set() + + for p in ready: + engines_alt.add(self.packaging.substitute(p.engine or self.game.engine, + p.name)) + engines_alt.discard(None) engines = set() + for engine_alt in engines_alt: for engine in reversed(engine_alt.split('|')): engine = engine.split('(')[0].strip() @@ -2039,6 +2063,7 @@ class PackagingTask(object): break else: engines.add(engine) + if engines: print('it is recommended to also install this game engine: %s' % ', '.join(engines)) diff --git a/game_data_packager/games/doom_common.py b/game_data_packager/games/doom_common.py index d0cff19..7b95c7a 100644 --- a/game_data_packager/games/doom_common.py +++ b/game_data_packager/games/doom_common.py @@ -64,23 +64,17 @@ class DoomGameData(GameData): assert self.wiki if self.engine is None: - self.engine = "chocolate-doom | doom-engine" + self.engine = { + 'deb': "chocolate-doom | doom-engine", + 'generic': 'chocolate-doom' + } + if self.genre is None: self.genre = 'First-person shooter' - package_map = { - 'doom-engine': 'doom', - 'boom-engine': 'boom', - 'heretic-engine': 'heretic', - 'hexen-engine': 'hexen', - 'doomsday': 'doomsday-compat', - } - for package in self.packages.values(): package.install_to = '$assets/doom' - engine = package.engine or self.engine - engine = engine.split('|')[-1].strip() - package.program = package_map.get(engine, engine) + if 'main_wads' in self.data['packages'][package.name]: package.main_wads = self.data['packages'][package.name]['main_wads'] else: @@ -104,6 +98,19 @@ class DoomTask(PackagingTask): super(DoomTask, self).fill_extra_files(package, destdir) for main_wad, quirks in package.main_wads.items(): + package_map = { + 'doom-engine': 'doom', + 'boom-engine': 'boom', + 'heretic-engine': 'heretic', + 'hexen-engine': 'hexen', + 'doomsday': 'doomsday-compat', + } + + engine = self.packaging.substitute(package.engine or self.game.engine, + package.name) + engine = engine.split('|')[-1].strip() + program = package_map.get(engine, engine) + wad_base = os.path.splitext(main_wad)[0] pixdir = os.path.join(destdir, 'usr/share/pixmaps') @@ -144,7 +151,7 @@ class DoomTask(PackagingTask): if 'name' in quirks: entry['Name'] += ' - ' + quirks['name'] entry['GenericName'] = self.game.genre + ' game' - entry['TryExec'] = package.program + entry['TryExec'] = program install_to = self.packaging.substitute(package.install_to, package.name).lstrip('/') @@ -158,7 +165,7 @@ class DoomTask(PackagingTask): + ' -file /' + install_to + '/' + main_wad) else: args = '-iwad /' + install_to + '/' + main_wad - entry['Exec'] = package.program + ' ' + args + entry['Exec'] = program + ' ' + args entry['Icon'] = desktop_file entry['Terminal'] = 'false' entry['Type'] = 'Application' @@ -172,7 +179,7 @@ class DoomTask(PackagingTask): self.packaging.override_lintian(destdir, package.name, 'desktop-command-not-in-package', 'usr/share/applications/%s.desktop %s' % - (desktop_file, package.program)) + (desktop_file, program)) if FORMAT == 'deb': debdir = os.path.join(destdir, 'DEBIAN') diff --git a/game_data_packager/games/z_code.py b/game_data_packager/games/z_code.py index 61eae9b..c20c71f 100644 --- a/game_data_packager/games/z_code.py +++ b/game_data_packager/games/z_code.py @@ -43,8 +43,8 @@ class ZCodeGameData(GameData): assert package.z_file if self.engine is None: - # RPM format can't handle alternatives and will ignore this - self.engine = 'gargoyle-free | zcode-interpreter' + self.engine = { 'deb': 'gargoyle-free | zcode-interpreter' } + if self.genre is None: self.genre = 'Adventure' diff --git a/game_data_packager/packaging/__init__.py b/game_data_packager/packaging/__init__.py index eb16b49..df07f88 100644 --- a/game_data_packager/packaging/__init__.py +++ b/game_data_packager/packaging/__init__.py @@ -120,6 +120,17 @@ class PackagingSystem(metaclass=ABCMeta): raise NotImplementedError def substitute(self, template, package, **kwargs): + if isinstance(template, dict): + for c in self._contexts: + if c in template: + template = template[c] + break + else: + return None + + if template is None: + return template + if '$' not in template: return template -- 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

