chiark / gitweb /
Merge branch 'master' into 'master'
[fdroidserver.git] / tests / dump_internal_metadata_format.py
1 #!/usr/bin/env python3
2 #
3 # This is for running manual tests when changing the metadata format.
4 # The idea is to test changes using all of the files in
5 # fdroiddata.git.  To run it, do:
6 #
7 #   cd fdroidserver/tests
8 #   cp dump_internal_metadata_format.py dump.py # since this isn't in old commits
9 #   git checkout 0.7.0  # or any old commit of your choosing
10 #   cd ../../fdroiddata
11 #   ../fdroidserver/tests/dump.py
12 #   mv metadata/dump metadata/dump_0.7.0
13 #   cd ../fdroidserver
14 #   git checkout master
15 #   cd ../fdroiddata
16 #   ../fdroidserver/tests/dump.py
17 #   meld metadata/dump_0.7.0 metadata/dump_0.7.0-179-ge85486a/
18
19 import git
20 import inspect
21 import optparse
22 import os
23 import sys
24 import yaml
25
26 localmodule = os.path.realpath(
27     os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..'))
28 if localmodule not in sys.path:
29     sys.path.insert(0, localmodule)
30
31 import fdroidserver.common  # noqa
32 import fdroidserver.metadata  # noqa
33
34
35 def _build_yaml_representer(dumper, data):
36     '''Creates a YAML representation of a Build instance'''
37     if hasattr(data, 'append_flag'):
38         # for 0.7.0 and earlier, before https://gitlab.com/fdroid/fdroidserver/merge_requests/210
39         del(data._modified)
40         readdict = data.__dict__
41     else:
42         readdict = data
43
44     # these key names were all renamed in
45     # https://gitlab.com/fdroid/fdroidserver/merge_requests/210
46     output = dict()
47     for k, v in readdict.items():
48         if k == 'vercode':
49             output['versionCode'] = v
50         elif k == 'version':
51             output['versionName'] = v
52         elif k == 'update':
53             output['androidupdate'] = v
54         else:
55             output[k] = v
56
57     return dumper.represent_dict(output)
58
59
60 parser = optparse.OptionParser()
61 parser.add_option("-v", "--verbose", action="store_true", default=False,
62                   help="Spew out even more information than normal")
63 (fdroidserver.common.options, args) = parser.parse_args(['--verbose'])
64
65 if not os.path.isdir('metadata'):
66     print("This script must be run in an F-Droid data folder with a 'metadata' subdir!")
67     sys.exit(1)
68
69 # these need to be set to prevent code running on None, only
70 # 'accepted_formats' is actually used in metadata.py
71 config = dict()
72 config['sdk_path'] = os.getenv('ANDROID_HOME') or '/opt/android-sdk'
73 config['ndk_paths'] = dict()
74 config['accepted_formats'] = ['txt']
75 fdroidserver.common.config = config
76
77 repo = git.Repo(localmodule)
78 savedir = os.path.join('metadata', 'dump_' + repo.git.describe())
79 if not os.path.isdir(savedir):
80     os.mkdir(savedir)
81
82 apps = fdroidserver.metadata.read_metadata(xref=True)
83 for appid, app in apps.items():
84     savepath = os.path.join(savedir, appid + '.yaml')
85     if hasattr(app, 'attr_to_field'):
86         # for 0.7.0 and earlier, before https://gitlab.com/fdroid/fdroidserver/merge_requests/210
87         app.__dict__['lastUpdated'] = app.__dict__['lastupdated']
88         del(app.__dict__['lastupdated'])
89         del(app._modified)
90         frommeta = dict(app.__dict__)
91     else:
92         frommeta = dict(app)
93
94     with open(savepath, 'w') as f:
95         yaml.add_representer(fdroidserver.metadata.Build, _build_yaml_representer)
96         yaml.dump(frommeta, f, default_flow_style=False)
97
98     # if appid == 'at.tomtasche.reader':
99     #     import pprint
100     #     pprint.pprint(app)
101     #     sys.exit(1)