[game-data-packager] 04/09: make_template: make better use of groups

Simon McVittie smcv at debian.org
Thu Dec 24 16:28:21 UTC 2015


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 59f625ab23d2e4fb19978bdfbc7d21fb0466b663
Author: Simon McVittie <smcv at debian.org>
Date:   Mon Dec 21 13:26:12 2015 +0000

    make_template: make better use of groups
    
    Each file found is now placed in one of several groups:
    "probably required", "probably optional", "probably documentation",
    "probably licenses", "probably unwanted" and "archives".
    
    As a step towards sharing code between make-template and
    the rest of g-d-p, we use the same WantedFile objects for groups
    as we do in the main g-d-p codebase.
---
 game_data_packager/make_template.py | 158 ++++++++++++++++++++----------------
 1 file changed, 87 insertions(+), 71 deletions(-)

diff --git a/game_data_packager/make_template.py b/game_data_packager/make_template.py
index bd21d74..3178f05 100644
--- a/game_data_packager/make_template.py
+++ b/game_data_packager/make_template.py
@@ -35,7 +35,7 @@ except ImportError:
     from distutils.version import LooseVersion as Version
     ON_DEBIAN = False
 
-from . import HashedFile
+from . import (HashedFile, WantedFile)
 from .gog import GOG
 from .steam import parse_acf
 from .util import (
@@ -143,12 +143,19 @@ class GameData(object):
         self.gog = dict()
 
         self.data = dict()
-        # global list of files across packages
-        self.install = set()
-        self.optional = set()
-        self.doc = set()
-        self.license = set()
-        self.loose_file = set()
+
+        self.required = WantedFile('probably required')
+        self.required.group_members = set()
+        self.optional = WantedFile('probably optional')
+        self.optional.group_members = set()
+        self.documentation = WantedFile('probably documentation')
+        self.documentation.group_members = set()
+        self.licenses = WantedFile('probably licenses')
+        self.licenses.group_members = set()
+        self.unwanted = WantedFile('probably unwanted')
+        self.unwanted.group_members = set()
+        self.archives = WantedFile('archives')
+        self.archives.group_members = set()
 
         self.file_data = {}
         self.size = {}
@@ -163,21 +170,20 @@ class GameData(object):
             return True
         return False
 
-    def add_one_file(self, name, lower, is_content=True):
+    def add_one_file(self, name, lower, group=None):
         out_name = os.path.basename(name)
         if lower:
             out_name = out_name.lower()
 
-        if not is_content:
-            pass
+        if group is not None:
+            group.group_members.add(out_name)
         elif is_license(name):
             out_name = os.path.basename(out_name)
-            self.loose_file.add(out_name)
+            self.licenses.group_members.add(out_name)
         elif is_doc(name):
-            self.loose_file.add(out_name)
-            self.file_data[out_name] = dict(install_to='$docdir')
+            self.documentation.group_members.add(out_name)
         else:
-            self.loose_file.add(out_name)
+            self.required.group_members.add(out_name)
 
         hf = HashedFile.from_file(name, open(name, 'rb'))
         self.size[out_name] = size = os.path.getsize(name)
@@ -219,10 +225,10 @@ class GameData(object):
                 self.package['lang'] = lang
             self.package['provides'] = virtual
 
-        self.package['install'] = []
-        self.package['optional'] = []
-        self.package['doc'] = []
-        self.package['license'] = []
+        self.package['install'] = [self.required.name]
+        self.package['optional'] = [self.optional.name]
+        self.package['doc'] = [self.documentation.name]
+        self.package['license'] = [self.licenses.name]
 
         if steam > 0:
             self.package['steam'] = steam_dict
@@ -244,17 +250,21 @@ class GameData(object):
 
                 if os.path.isdir(path):
                     continue
-                elif is_dosbox(path):
-                    has_dosbox = True
-                elif os.path.splitext(fn.lower())[1] in ('.exe', '.exe$0', '.ovl',
-                                                         '.dll', '.dll$0', '.bat', '.386'):
-                    logger.warning('ignoring dos/windows binary %s' % fn)
-                elif out_name.startswith('goggame-') or out_name in ('webcache.zip',
-                                                                 'gog.ico', 'gfw_high.ico'):
-                    logger.warning('ignoring GOG stuff %s' % fn)
                 elif os.path.islink(path):
                     self.package.setdefault('symlinks', {})[name] = os.path.realpath(path).lstrip('/')
                 elif os.path.isfile(path):
+                    ignorable = False
+
+                    if is_dosbox(path):
+                        has_dosbox = True
+                        ignorable = True
+                    elif os.path.splitext(fn.lower())[1] in ('.exe', '.exe$0', '.ovl',
+                                                             '.dll', '.dll$0', '.bat', '.386'):
+                        ignorable = True
+                    elif out_name.startswith('goggame-') or out_name in ('webcache.zip',
+                                                                     'gog.ico', 'gfw_high.ico'):
+                        ignorable = True
+
                     size = os.path.getsize(path)
                     hf = HashedFile.from_file(name, open(path, 'rb'))
                     # avoid that look_for: overlaps in cases where
@@ -279,20 +289,18 @@ class GameData(object):
                             else:
                                 out_name += ('?' + hf.md5[1:6])
 
-                    if is_license(fn):
+                    if ignorable:
+                        self.unwanted.group_members.add(out_name)
+                    elif is_license(fn):
                         out_name = os.path.basename(out_name)
-                        self.license.add(out_name)
-                        self.package['license'].append(out_name)
+                        self.licenses.group_members.add(out_name)
                     elif is_doc(path):
-                        self.doc.add(out_name)
-                        self.package['doc'].append(out_name)
+                        self.documentation.group_members.add(out_name)
                     # most of the times these files are not needed
                     elif fn.lower().split('.')[-1] in ('cfg', 'cmd', 'com', 'drv', 'ico', 'ini'):
-                        self.optional.add(out_name)
-                        self.package['optional'].append(out_name)
+                        self.optional.group_members.add(out_name)
                     else:
-                        self.install.add(out_name)
-                        self.package['install'].append(out_name)
+                        self.required.group_members.add(out_name)
 
                     self.size[out_name] = size
                     self.md5[out_name] = hf.md5
@@ -322,7 +330,7 @@ class GameData(object):
             del self.package['license']
 
     def add_one_zip(self,archive):
-        self.add_one_file(archive, lower=False, is_content=False)
+        self.add_one_file(archive, lower=False, group=self.archives)
         # TODO
         return
 
@@ -366,7 +374,7 @@ class GameData(object):
         self.add_one_dir(os.path.join(tmp, 'app'), True, game=game, lang=guess_lang(exe))
         os.system('rm -r ' + tmp)
 
-        self.add_one_file(exe, lower=False, is_content=False)
+        self.add_one_file(exe, lower=False, group=self.archives)
         self.file_data[os.path.basename(exe)] = dict(unpack=dict(format='innoextract'),provides=['file1','file2'])
 
     def add_one_deb(self,deb,lower):
@@ -410,9 +418,12 @@ class GameData(object):
 
         self.data = dict(packages={ control['package']: {} })
         self.package = self.data['packages'][control['package']]
-        self.package['install'] = []
-        self.package['optional'] = []
-        self.package['license'] = []
+
+        self.package['install'] = [self.required.name]
+        self.package['optional'] = [self.optional.name]
+        self.package['doc'] = [self.documentation.name]
+        self.package['license'] = [self.licenses.name]
+
         if version:
             self.package['version'] = version
 
@@ -463,21 +474,16 @@ class GameData(object):
                         basename_l = os.path.basename(name_l)
 
                         if os.path.splitext(name_l)[1] in ('.exe', '.bat'):
-                            logger.warning('ignoring dos/windows binary %s' % name)
-                            continue
+                            self.unwanted.group_members.add(name_l)
                         elif 'support/gog' in name_l or os.path.basename(name_l) in (
                                                         'start.sh', 'uninstall.sh'):
-                            logger.warning('ignoring GOG stuff %s' % name)
-                            continue
+                            self.unwanted.group_members.add(name_l)
                         elif name.startswith('opt/') and is_license(name):
                             name = basename_l
-                            self.license.add(name)
-                            self.package['license'].append(name)
+                            self.licenses.group_members.add(name)
                         elif name.startswith('opt/') and is_doc(name):
                             name = basename_l
-                            self.optional.add(name)
-                            self.package['optional'].append(name)
-                            self.file_data[name] = dict(install_to='$docdir')
+                            self.documentation.group_members.add(name)
                         elif (install_to is not None and
                             name.startswith(install_to + '/')):
                             name = name[len(install_to) + 1:]
@@ -485,10 +491,9 @@ class GameData(object):
                                 name = name.lower()
                             if self.gog and name.startswith('data/'):
                                 name = name[len('data/'):]
-                            self.install.add(name)
-                            self.package['install'].append(name)
+                            self.required.group_members.add(name)
                         else:
-                            self.optional.add(name)
+                            self.optional.group_members.add(name)
                             self.file_data[name] = dict(install_to='.')
 
                         self.size[name] = entry.size
@@ -540,35 +545,46 @@ class GameData(object):
         print('')
         yaml.safe_dump(self.data, stream=sys.stdout, default_flow_style=False)
 
-        if self.loose_file:
-            print('    XXX:')
-            for file in sorted(self.loose_file):
-                print('    - %s' % file)
-
         if self.file_data:
             yaml.safe_dump({ 'files': self.file_data }, stream=sys.stdout,
                     default_flow_style=False)
 
-        print_order = sorted(self.install | self.optional) + sorted(self.doc) + sorted(self.license)
-        print_order += sorted(set(self.size.keys()) - set(print_order))
-
         print('\ngroups:')
 
-        print('  FIXME:')
-        print('    group_members: |')
-        for filename in print_order:
-            print('    %-9s %s %s' % (self.size[filename], self.md5[filename], filename))
+        for group in (self.required, self.optional, self.documentation,
+                self.licenses, self.archives, self.unwanted):
+            if not group.group_members:
+                # skip empty group
+                continue
+
+            print('  %s:' % group.name)
+
+            if group == self.documentation:
+                print('    doc: True')
+            elif group == self.licenses:
+                print('    license: True')
+
+            print('    group_members: |')
+            for f in sorted(group.group_members):
+                print('      %-9s %s %s' % (self.size[f], self.md5[f], f))
+
         print('\nsha1sums: |')
-        for filename in print_order:
-            if filename in self.sha1:
-                print('  %s  %s' % (self.sha1[filename], filename))
+
+        for f in sorted(self.sha1.keys()):
+            if f in self.unwanted.group_members:
+                print('  #%s %s' % (self.sha1[f], f))
+            else:
+                print('  %s %s' % (self.sha1[f], f))
 
         print('\nsha256sums: |')
-        for filename in print_order:
-            if filename in self.sha256:
-                print('  %s  %s' % (self.sha256[filename], filename))
 
-        print('...')
+        for f in sorted(self.sha256.keys()):
+            if f in self.unwanted.group_members:
+                print('  #%s %s' % (self.sha256[f], f))
+            else:
+                print('  %s %s' % (self.sha256[f], f))
+
+        print('\n...')
 
 def do_one_file(name,lower):
     hf = HashedFile.from_file(name, open(name, 'rb'))

-- 
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