[game-data-packager] 45/51: make_template: Add support for augmenting an existing template
Simon McVittie
smcv at debian.org
Fri Dec 29 01:23:38 UTC 2017
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 3d2819c915d87c1d60a7e86178e0bd69bcc9af79
Author: Simon McVittie <smcv at debian.org>
Date: Thu Dec 28 22:43:57 2017 +0000
make_template: Add support for augmenting an existing template
Signed-off-by: Simon McVittie <smcv at debian.org>
---
game_data_packager/make_template.py | 85 ++++++++++++++++++++++++++++++++-----
1 file changed, 75 insertions(+), 10 deletions(-)
diff --git a/game_data_packager/make_template.py b/game_data_packager/make_template.py
index 7d18680..c290560 100644
--- a/game_data_packager/make_template.py
+++ b/game_data_packager/make_template.py
@@ -36,7 +36,7 @@ except ImportError:
ON_DEBIAN = False
from .data import (FileGroup, HashedFile, PackageRelation, WantedFile)
-from .game import (GameData, load_games)
+from .game import (GameData, load_game, load_games)
from .gog import GOG
from .steam import parse_acf
from .unpack import (DpkgDebUnpacker, TarUnpacker)
@@ -312,13 +312,9 @@ class Template:
def add_file(self, path, out_name=None, opened=None, size=None,
lang=None, parent_unpacker=None, unpack=False):
-
if out_name is None:
out_name = path
- match_path = '/' + path.lower()
- ignorable = False
-
if is_dosbox(path):
self.has_dosbox = True
ignorable = True
@@ -336,8 +332,21 @@ class Template:
is_plain_file = False
hf = HashedFile.from_file(path, opened, size=size)
+ return self.add_hashed_file(path, hf,
+ out_name=out_name, lang=lang,
+ parent_unpacker=parent_unpacker, size=size,
+ is_plain_file=is_plain_file, unpack=unpack, opened=opened)
+
+ def add_hashed_file(self, path, hf, *, out_name=None, lang=None,
+ parent_unpacker=None, size=None, unpack=False,
+ is_plain_file=False, opened=None):
+ if out_name is None:
+ out_name = path
+
result = None
existing = None
+ match_path = '/' + path.lower()
+ ignorable = False
# TODO: This resembles PackagingTask.consider_file()
# and PackagingTask.use_file()
@@ -412,10 +421,16 @@ class Template:
for lf in result.look_for:
self.game.known_filenames.setdefault(lf, set()).add(result.name)
- self.game.known_md5s.setdefault(result.md5, set()).add(result.name)
- self.game.known_sha1s.setdefault(result.sha1, set()).add(result.name)
- self.game.known_sha256s.setdefault(result.sha256, set()).add(
- result.name)
+ if result.md5 is not None:
+ self.game.known_md5s.setdefault(result.md5, set()).add(result.name)
+
+ if result.sha1 is not None:
+ self.game.known_sha1s.setdefault(result.sha1, set()).add(
+ result.name)
+
+ if result.sha256 is not None:
+ self.game.known_sha256s.setdefault(result.sha256, set()).add(
+ result.name)
unpacker = None
@@ -444,6 +459,50 @@ class Template:
return result
+ def add_template(self, template, name, lower=False):
+ template_game = load_game(
+ False, template, None, name=name, yaml_file=template)
+ template_game.load_file_data()
+ files = {}
+
+ for name, f in template_game.files.items():
+ files[name] = self.add_hashed_file(f.filename, f,
+ out_name=name, is_plain_file=False, unpack=False,
+ size=f.size)
+
+ for g in template_game.groups.values():
+ members = []
+
+ for name in g.group_members:
+ if name in files:
+ members.append(files[name])
+
+ self.reconcile_groups(members,
+ stem = 'group "' + g.name + '" in ' + os.path.basename(template))
+
+ ungrouped = []
+
+ for name, f in template_game.files.items():
+ if f.provides:
+ members = []
+
+ for member in f.provides_files:
+ members.append(files[member.name])
+
+ self.reconcile_groups(members,
+ stem='files provided by "%s" in %s' % (
+ name, os.path.basename(template)),
+ provider=f)
+
+ for g in template_game.groups.values():
+ if name in g.group_members:
+ break
+ else:
+ ungrouped.append(files[name])
+
+ self.reconcile_groups(ungrouped,
+ stem='no particular group in ' + os.path.basename(template))
+
def add_one_dir(self, destdir, lower=False, game=None, lang=None,
group_stem=None):
basename = os.path.basename(os.path.abspath(destdir))
@@ -860,12 +919,15 @@ def main():
description='Produce a template for game-data-packager YAML ' +
'based on an existing .deb file or installed directory',
prog='game-data-packager guess-contents')
- parser.add_argument('args', nargs='+', metavar='DEB|DIRECTORY|FILE')
+ parser.add_argument('args', nargs='*', metavar='DEB|DIRECTORY|FILE')
parser.add_argument(
'--strip-path', action='append', dest='strip_paths', default=[],
help='Strip a prefix from all filenames (may be repeated)')
parser.add_argument(
'--base', default=None, help='Base the template on an existing game')
+ parser.add_argument(
+ '--template', action='append', dest='templates', default=[],
+ help='Load pre-generated templates')
parser.add_argument('-l', '--lower', action='store_true', dest='lower',
help='make all files lowercase')
parser.add_argument('-e', '--execute', action='store_true', dest='execute',
@@ -901,6 +963,9 @@ def main():
game.load_file_data()
template = Template(game, strip_paths=args.strip_paths)
+ for t in args.templates:
+ template.add_template(t, lower=args.lower, name=game.shortname)
+
# "./run make-template setup_<game>.exe gog_<game>.deb"
# will merge files lists
for arg in args.args:
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/game-data-packager.git
More information about the Pkg-games-commits
mailing list