gecko-dev/testing/mozharness/scripts/b2g_desktop_multilocale.py

209 строки
8.8 KiB
Python
Executable File

#!/usr/bin/env python
# ***** BEGIN LICENSE BLOCK *****
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
# ***** END LICENSE BLOCK *****
import sys
import os
# load modules from parent dir
sys.path.insert(1, os.path.dirname(sys.path[0]))
# import the guts
from mozharness.base.config import parse_config_file
from mozharness.base.errors import MakefileErrorList
from mozharness.base.log import ERROR, FATAL
from mozharness.base.script import BaseScript
from mozharness.base.vcs.vcsbase import VCSMixin
from mozharness.mozilla.l10n.locales import GaiaLocalesMixin, LocalesMixin
class B2gMultilocale(LocalesMixin, BaseScript, VCSMixin, GaiaLocalesMixin):
""" This is a helper script that requires MercurialBuildFactory
logic to work. We may eventually make this a standalone
script.
We could inherit MercurialScript instead of BaseScript + VCSMixin
"""
config_options = [
[["--locale"], {
"action": "extend",
"dest": "locales",
"type": "string",
"help": "Specify the locale(s) to repack"
}],
[["--gaia-languages-file"], {
"dest": "gaia_languages_file",
"help": "languages file for gaia multilocale profile",
}],
[["--gecko-languages-file"], {
"dest": "locales_file",
"help": "languages file for gecko multilocale",
}],
[["--gecko-l10n-root"], {
"dest": "hg_l10n_base",
"help": "root location for gecko l10n repos",
}],
[["--gecko-l10n-base-dir"], {
"dest": "l10n_dir",
"help": "dir to clone gecko l10n repos into, relative to the work directory",
}],
[["--merge-locales"], {
"dest": "merge_locales",
"help": "Dummy option to keep from burning. We now always merge",
}],
[["--gaia-l10n-root"], {
"dest": "gaia_l10n_root",
"help": "root location for gaia l10n repos",
}],
[["--gaia-l10n-base-dir"], {
"dest": "gaia_l10n_base_dir",
"default": "build-gaia-l10n",
"help": "dir to clone l10n repos into, relative to the work directory",
}],
[["--gaia-l10n-vcs"], {
"dest": "gaia_l10n_vcs",
"help": "vcs to use for gaia l10n",
}],
]
def __init__(self, require_config_file=False):
LocalesMixin.__init__(self)
BaseScript.__init__(self,
config_options=self.config_options,
all_actions=[
'pull',
'build',
'summary',
],
require_config_file=require_config_file,
# Default configuration
config={
'gaia_l10n_vcs': 'hg',
'vcs_share_base': os.environ.get('HG_SHARE_BASE_DIR'),
'locales_dir': 'b2g/locales',
'l10n_dir': 'gecko-l10n',
# I forget what this was for. Copied from the Android multilocale stuff
'ignore_locales': ["en-US", "multi"],
# This only has 2 locales in it. We probably need files that mirror gaia's locale lists
# We need 2 sets of locales files because the locale names in gaia are different than gecko, e.g. 'es' vs 'es-ES'
# We'll need to override this for localizer buidls
'locales_file': 'build/b2g/locales/all-locales',
'mozilla_dir': 'build',
'objdir': 'obj-firefox',
'merge_locales': True,
'work_dir': '.',
'vcs_output_timeout': 600, # 10 minutes should be enough for anyone!
},
)
def _pre_config_lock(self, rw_config):
super(B2gMultilocale, self)._pre_config_lock(rw_config)
if 'pull' in self.actions:
message = ""
if 'gaia_languages_file' not in self.config:
message += 'Must specify --gaia-languages-file!\n'
if 'gaia_l10n_root' not in self.config:
message += 'Must specify --gaia-l10n-root!\n'
if 'locales_file' not in self.config:
message += 'Must specify --gecko-languages-file!\n'
if 'hg_l10n_base' not in self.config:
message += 'Must specify --gecko-l10n-root!\n'
if message:
self.fatal(message)
def query_abs_dirs(self):
if self.abs_dirs:
return self.abs_dirs
abs_dirs = LocalesMixin.query_abs_dirs(self)
c = self.config
dirs = {
'src': os.path.join(c['work_dir'], 'gecko'),
'work_dir': abs_dirs['abs_work_dir'],
'gaia_l10n_base_dir': os.path.join(abs_dirs['abs_work_dir'], self.config['gaia_l10n_base_dir']),
'abs_compare_locales_dir': os.path.join(abs_dirs['base_work_dir'], 'compare-locales'),
}
abs_dirs.update(dirs)
self.abs_dirs = abs_dirs
return self.abs_dirs
# Actions {{{2
def pull(self):
""" Clone gaia and gecko locale repos
"""
languages_file = self.config['gaia_languages_file']
l10n_base_dir = self.query_abs_dirs()['gaia_l10n_base_dir']
l10n_config = {
'root': self.config['gaia_l10n_root'],
'vcs': self.config['gaia_l10n_vcs'],
}
self.pull_gaia_locale_source(l10n_config, parse_config_file(languages_file).keys(), l10n_base_dir)
self.pull_locale_source()
gecko_locales = self.query_locales()
# populate b2g/overrides, which isn't in gecko atm
dirs = self.query_abs_dirs()
for locale in gecko_locales:
self.mkdir_p(os.path.join(dirs['abs_l10n_dir'], locale, 'b2g', 'chrome', 'overrides'))
self.copytree(os.path.join(dirs['abs_l10n_dir'], locale, 'mobile', 'overrides'),
os.path.join(dirs['abs_l10n_dir'], locale, 'b2g', 'chrome', 'overrides'),
error_level=FATAL)
def build(self):
""" Do the multilocale portion of the build + packaging.
"""
dirs = self.query_abs_dirs()
gecko_locales = self.query_locales()
make = self.query_exe('make', return_type='string')
env = self.query_env(
partial_env={
'LOCALE_MERGEDIR': dirs['abs_merge_dir'],
'MOZ_CHROME_MULTILOCALE': 'en-US ' + ' '.join(gecko_locales),
}
)
merge_env = self.query_env(
partial_env={
'PATH': '%(PATH)s' + os.pathsep + os.path.join(dirs['abs_compare_locales_dir'], 'scripts'),
'PYTHONPATH': os.path.join(dirs['abs_compare_locales_dir'],
'lib'),
}
)
for locale in gecko_locales:
command = make + ' merge-%s L10NBASEDIR=%s LOCALE_MERGEDIR=%s' % (locale, dirs['abs_l10n_dir'], dirs['abs_merge_dir'])
status = self.run_command(command,
cwd=dirs['abs_locales_dir'],
error_list=MakefileErrorList,
env=merge_env)
command = make + ' chrome-%s L10NBASEDIR=%s LOCALE_MERGEDIR=%s' % (locale, dirs['abs_l10n_dir'], dirs['abs_merge_dir'])
status = self.run_command(command,
cwd=dirs['abs_locales_dir'],
error_list=MakefileErrorList)
if status:
self.add_summary("Failed to add locale %s!" % locale, level=ERROR)
command = make + ' -C app'
self.run_command(command,
cwd=os.path.join(dirs['abs_objdir'], 'b2g'),
error_list=MakefileErrorList,
halt_on_failure=True)
command = make + ' package AB_CD=multi'
self.run_command(command, cwd=dirs['abs_objdir'],
error_list=MakefileErrorList, env=env,
halt_on_failure=True)
command = make + ' package-tests AB_CD=multi'
self.run_command(command, cwd=dirs['abs_objdir'],
error_list=MakefileErrorList, env=env,
halt_on_failure=True)
# main {{{1
if __name__ == '__main__':
myScript = B2gMultilocale()
myScript.run_and_exit()