[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