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