OLD | NEW |
1 # This Source Code Form is subject to the terms of the Mozilla Public | 1 # This Source Code Form is subject to the terms of the Mozilla Public |
2 # License, v. 2.0. If a copy of the MPL was not distributed with this | 2 # License, v. 2.0. If a copy of the MPL was not distributed with this |
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. | 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
4 | 4 |
5 import os | 5 import os |
6 import shutil | 6 import shutil |
7 from StringIO import StringIO | 7 from StringIO import StringIO |
8 import subprocess | 8 import subprocess |
9 import tempfile | 9 import tempfile |
10 from xml.etree import ElementTree | 10 from xml.etree import ElementTree |
(...skipping 19 matching lines...) Expand all Loading... |
30 fp, events=['start-ns'])]) | 30 fp, events=['start-ns'])]) |
31 for prefix, uri in ns.items(): | 31 for prefix, uri in ns.items(): |
32 ElementTree.register_namespace(prefix, uri) | 32 ElementTree.register_namespace(prefix, uri) |
33 | 33 |
34 # Make the default namespace available in an xpath expression | 34 # Make the default namespace available in an xpath expression |
35 ns['_d'] = ns[''] | 35 ns['_d'] = ns[''] |
36 | 36 |
37 return ns | 37 return ns |
38 | 38 |
39 | 39 |
| 40 def get_appx_version(metadata, build_num): |
| 41 """Get the version number for usage in AppxManifest.xml. |
| 42 |
| 43 As required by the Windows Store, the returned version string has four |
| 44 components, where the 3rd component is replaced with the build number |
| 45 if available, and the 4th component is always zero (e.g. 1.2.1000.0). |
| 46 """ |
| 47 components = metadata.get('general', 'version').split('.')[:3] |
| 48 components.extend(['0'] * (4 - len(components))) |
| 49 if build_num: |
| 50 components[2] = build_num |
| 51 return '.'.join(components) |
| 52 |
| 53 |
40 def update_appx_manifest(manifest_path, base_dir, files, metadata, | 54 def update_appx_manifest(manifest_path, base_dir, files, metadata, |
41 release_build): | 55 release_build, build_num): |
42 namespaces = register_xml_namespaces(manifest_path) | 56 namespaces = register_xml_namespaces(manifest_path) |
43 | 57 |
44 v_min, v_max = metadata.get('compat', 'windows').split('/') | 58 v_min, v_max = metadata.get('compat', 'windows').split('/') |
45 | 59 |
46 filenames = [] | 60 filenames = [] |
47 | 61 |
48 for name, path in metadata.items('appx_assets'): | 62 for name, path in metadata.items('appx_assets'): |
49 path = os.path.join(base_dir, path) | 63 path = os.path.join(base_dir, path) |
50 icon_path = '{}/{}'.format(ASSETS_DIR, name) | 64 icon_path = '{}/{}'.format(ASSETS_DIR, name) |
51 | 65 |
52 files.read(path, icon_path) | 66 files.read(path, icon_path) |
53 filenames.append(icon_path) | 67 filenames.append(icon_path) |
54 | 68 |
55 assets = packagerChrome.makeIcons(files, filenames) | 69 assets = packagerChrome.makeIcons(files, filenames) |
56 | 70 |
57 author = metadata.get('general', 'author') | 71 author = metadata.get('general', 'author') |
58 | 72 |
59 overrides = [ | 73 overrides = [ |
60 ('_d:Identity', None, [ | 74 ('_d:Identity', None, [ |
61 ('Name', packager.get_app_id(release_build, metadata)), | 75 ('Name', packager.get_app_id(release_build, metadata)), |
62 ('Publisher', metadata.get('general', 'publisher_id')), | 76 ('Publisher', metadata.get('general', 'publisher_id')), |
| 77 ('Version', get_appx_version(metadata, build_num)), |
63 ]), | 78 ]), |
64 ('_d:Properties/_d:PublisherDisplayName', author, []), | 79 ('_d:Properties/_d:PublisherDisplayName', author, []), |
65 ('_d:Properties/_d:Logo', assets[50], []), | 80 ('_d:Properties/_d:Logo', assets[50], []), |
66 ('_d:Dependencies/_d:TargetDeviceFamily', None, [ | 81 ('_d:Dependencies/_d:TargetDeviceFamily', None, [ |
67 ('MaxVersionTested', v_max), | 82 ('MaxVersionTested', v_max), |
68 ('MinVersion', v_min), | 83 ('MinVersion', v_min), |
69 ]), | 84 ]), |
70 ('_d:Applications/_d:Application/uap:VisualElements', None, [ | 85 ('_d:Applications/_d:Application/uap:VisualElements', None, [ |
71 ('Square150x150Logo', assets[150]), | 86 ('Square150x150Logo', assets[150]), |
72 ('Square44x44Logo', assets[44]), | 87 ('Square44x44Logo', assets[44]), |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 manifest_folder = os.path.join(manifold_folder, 'manifest') | 178 manifest_folder = os.path.join(manifold_folder, 'manifest') |
164 asset_folder = os.path.join(manifest_folder, ASSETS_DIR) | 179 asset_folder = os.path.join(manifest_folder, ASSETS_DIR) |
165 | 180 |
166 # prepare the extension with manifoldjs | 181 # prepare the extension with manifoldjs |
167 cmd = ['npm', 'run', '--silent', 'build-edge'] | 182 cmd = ['npm', 'run', '--silent', 'build-edge'] |
168 subprocess.check_call(cmd, env=cmd_env, cwd=os.path.dirname(__file__)) | 183 subprocess.check_call(cmd, env=cmd_env, cwd=os.path.dirname(__file__)) |
169 | 184 |
170 # update incomplete appxmanifest | 185 # update incomplete appxmanifest |
171 intermediate_manifest = os.path.join(manifest_folder, MANIFEST) | 186 intermediate_manifest = os.path.join(manifest_folder, MANIFEST) |
172 update_appx_manifest(intermediate_manifest, baseDir, files, metadata, | 187 update_appx_manifest(intermediate_manifest, baseDir, files, metadata, |
173 releaseBuild) | 188 releaseBuild, buildNum) |
174 | 189 |
175 # cleanup placeholders, copy actual images | 190 # cleanup placeholders, copy actual images |
176 shutil.rmtree(asset_folder) | 191 shutil.rmtree(asset_folder) |
177 os.mkdir(asset_folder) | 192 os.mkdir(asset_folder) |
178 if metadata.has_section('appx_assets'): | 193 if metadata.has_section('appx_assets'): |
179 for name, path in metadata.items('appx_assets'): | 194 for name, path in metadata.items('appx_assets'): |
180 path = os.path.join(baseDir, path) | 195 path = os.path.join(baseDir, path) |
181 target = os.path.join(asset_folder, name) | 196 target = os.path.join(asset_folder, name) |
182 shutil.copyfile(path, target) | 197 shutil.copyfile(path, target) |
183 | 198 |
184 # package app with manifoldjs | 199 # package app with manifoldjs |
185 cmd = ['npm', 'run', '--silent', 'package-edge'] | 200 cmd = ['npm', 'run', '--silent', 'package-edge'] |
186 | 201 |
187 subprocess.check_call(cmd, env=cmd_env, cwd=os.path.dirname(__file__)) | 202 subprocess.check_call(cmd, env=cmd_env, cwd=os.path.dirname(__file__)) |
188 | 203 |
189 package = os.path.join(manifold_folder, 'package', | 204 package = os.path.join(manifold_folder, 'package', |
190 'edgeExtension.appx') | 205 'edgeExtension.appx') |
191 | 206 |
192 shutil.copyfile(package, outfile) | 207 shutil.copyfile(package, outfile) |
193 finally: | 208 finally: |
194 shutil.rmtree(tmp_dir, ignore_errors=True) | 209 shutil.rmtree(tmp_dir, ignore_errors=True) |
OLD | NEW |