summaryrefslogtreecommitdiffstats
path: root/testing/mozharness/mozharness/mozilla/l10n/multi_locale_build.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/mozharness/mozharness/mozilla/l10n/multi_locale_build.py')
-rwxr-xr-xtesting/mozharness/mozharness/mozilla/l10n/multi_locale_build.py254
1 files changed, 254 insertions, 0 deletions
diff --git a/testing/mozharness/mozharness/mozilla/l10n/multi_locale_build.py b/testing/mozharness/mozharness/mozilla/l10n/multi_locale_build.py
new file mode 100755
index 000000000..5bdbc8011
--- /dev/null
+++ b/testing/mozharness/mozharness/mozilla/l10n/multi_locale_build.py
@@ -0,0 +1,254 @@
+#!/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 *****
+"""multi_locale_build.py
+
+This should be a mostly generic multilocale build script.
+"""
+
+from copy import deepcopy
+import os
+import sys
+
+sys.path.insert(1, os.path.dirname(os.path.dirname(sys.path[0])))
+
+from mozharness.base.errors import MakefileErrorList, SSHErrorList
+from mozharness.base.log import FATAL
+from mozharness.base.vcs.vcsbase import MercurialScript
+from mozharness.mozilla.l10n.locales import LocalesMixin
+
+
+# MultiLocaleBuild {{{1
+class MultiLocaleBuild(LocalesMixin, MercurialScript):
+ """ This class targets Fennec multilocale builds.
+ We were considering this for potential Firefox desktop multilocale.
+ Now that we have a different approach for B2G multilocale,
+ it's most likely misnamed. """
+ config_options = [[
+ ["--locale"],
+ {"action": "extend",
+ "dest": "locales",
+ "type": "string",
+ "help": "Specify the locale(s) to repack"
+ }
+ ], [
+ ["--merge-locales"],
+ {"action": "store_true",
+ "dest": "merge_locales",
+ "default": False,
+ "help": "Use default [en-US] if there are missing strings"
+ }
+ ], [
+ ["--no-merge-locales"],
+ {"action": "store_false",
+ "dest": "merge_locales",
+ "help": "Do not allow missing strings"
+ }
+ ], [
+ ["--objdir"],
+ {"action": "store",
+ "dest": "objdir",
+ "type": "string",
+ "default": "objdir",
+ "help": "Specify the objdir"
+ }
+ ], [
+ ["--l10n-base"],
+ {"action": "store",
+ "dest": "hg_l10n_base",
+ "type": "string",
+ "help": "Specify the L10n repo base directory"
+ }
+ ], [
+ ["--l10n-tag"],
+ {"action": "store",
+ "dest": "hg_l10n_tag",
+ "type": "string",
+ "help": "Specify the L10n tag"
+ }
+ ], [
+ ["--tag-override"],
+ {"action": "store",
+ "dest": "tag_override",
+ "type": "string",
+ "help": "Override the tags set for all repos"
+ }
+ ], [
+ ["--user-repo-override"],
+ {"action": "store",
+ "dest": "user_repo_override",
+ "type": "string",
+ "help": "Override the user repo path for all repos"
+ }
+ ], [
+ ["--l10n-dir"],
+ {"action": "store",
+ "dest": "l10n_dir",
+ "type": "string",
+ "default": "l10n",
+ "help": "Specify the l10n dir name"
+ }
+ ]]
+
+ def __init__(self, require_config_file=True):
+ LocalesMixin.__init__(self)
+ MercurialScript.__init__(self, config_options=self.config_options,
+ all_actions=['clobber', 'pull-build-source',
+ 'pull-locale-source',
+ 'build', 'package-en-US',
+ 'upload-en-US',
+ 'backup-objdir',
+ 'restore-objdir',
+ 'add-locales', 'package-multi',
+ 'upload-multi', 'summary'],
+ require_config_file=require_config_file)
+
+ def query_l10n_env(self):
+ return self.query_env()
+
+ def clobber(self):
+ c = self.config
+ if c['work_dir'] != '.':
+ path = os.path.join(c['base_work_dir'], c['work_dir'])
+ if os.path.exists(path):
+ self.rmtree(path, error_level=FATAL)
+ else:
+ self.info("work_dir is '.'; skipping for now.")
+
+ def pull_build_source(self):
+ c = self.config
+ repos = []
+ replace_dict = {}
+ # Replace %(user_repo_override)s with c['user_repo_override']
+ if c.get("user_repo_override"):
+ replace_dict['user_repo_override'] = c['user_repo_override']
+ for repo_dict in deepcopy(c['repos']):
+ repo_dict['repo'] = repo_dict['repo'] % replace_dict
+ repos.append(repo_dict)
+ else:
+ repos = c['repos']
+ self.vcs_checkout_repos(repos, tag_override=c.get('tag_override'))
+
+ # pull_locale_source() defined in LocalesMixin.
+
+ def build(self):
+ c = self.config
+ dirs = self.query_abs_dirs()
+ self.copyfile(os.path.join(dirs['abs_work_dir'], c['mozconfig']),
+ os.path.join(dirs['abs_mozilla_dir'], 'mozconfig'),
+ error_level=FATAL)
+ command = "make -f client.mk build"
+ env = self.query_env()
+ if self._process_command(command=command,
+ cwd=dirs['abs_mozilla_dir'],
+ env=env, error_list=MakefileErrorList):
+ self.fatal("Erroring out after the build failed.")
+
+ def add_locales(self):
+ c = self.config
+ dirs = self.query_abs_dirs()
+ locales = self.query_locales()
+
+ for locale in locales:
+ self.run_compare_locales(locale, halt_on_failure=True)
+ command = 'make chrome-%s L10NBASEDIR=%s' % (locale, dirs['abs_l10n_dir'])
+ if c['merge_locales']:
+ command += " LOCALE_MERGEDIR=%s" % dirs['abs_merge_dir'].replace(os.sep, '/')
+ status = self._process_command(command=command,
+ cwd=dirs['abs_locales_dir'],
+ error_list=MakefileErrorList)
+ if status:
+ self.return_code += 1
+ self.add_summary("Failed to add locale %s!" % locale,
+ level="error")
+ else:
+ self.add_summary("Added locale %s successfully." % locale)
+
+ def package_en_US(self):
+ self.package(package_type='en-US')
+
+ def preflight_package_multi(self):
+ dirs = self.query_abs_dirs()
+ self.run_command("rm -rfv dist/fennec*", cwd=dirs['abs_objdir'])
+ # bug 933290
+ self.run_command(["touch", "mobile/android/installer/Makefile"], cwd=dirs['abs_objdir'])
+
+ def package_multi(self):
+ self.package(package_type='multi')
+
+ def additional_packaging(self, package_type='en-US', env=None):
+ dirs = self.query_abs_dirs()
+ command = "make package-tests"
+ if package_type == 'multi':
+ command += " AB_CD=multi"
+ self.run_command(command, cwd=dirs['abs_objdir'], env=env,
+ error_list=MakefileErrorList,
+ halt_on_failure=True)
+ # TODO deal with buildsymbols
+
+ def package(self, package_type='en-US'):
+ dirs = self.query_abs_dirs()
+
+ command = "make package"
+ env = self.query_env()
+ if env is None:
+ # This is for Maemo, where we don't want an env for builds
+ # but we do for packaging. self.query_env() will return None.
+ env = os.environ.copy()
+ if package_type == 'multi':
+ command += " AB_CD=multi"
+ env['MOZ_CHROME_MULTILOCALE'] = "en-US " + \
+ ' '.join(self.query_locales())
+ self.info("MOZ_CHROME_MULTILOCALE is %s" % env['MOZ_CHROME_MULTILOCALE'])
+ self._process_command(command=command, cwd=dirs['abs_objdir'],
+ env=env, error_list=MakefileErrorList,
+ halt_on_failure=True)
+ self.additional_packaging(package_type=package_type, env=env)
+
+ def upload_en_US(self):
+ # TODO
+ self.info("Not written yet.")
+
+ def backup_objdir(self):
+ dirs = self.query_abs_dirs()
+ if not os.path.isdir(dirs['abs_objdir']):
+ self.warning("%s doesn't exist! Skipping..." % dirs['abs_objdir'])
+ return
+ rsync = self.query_exe('rsync')
+ backup_dir = '%s-bak' % dirs['abs_objdir']
+ self.rmtree(backup_dir)
+ self.mkdir_p(backup_dir)
+ self.run_command([rsync, '-a', '--delete', '--partial',
+ '%s/' % dirs['abs_objdir'],
+ '%s/' % backup_dir],
+ error_list=SSHErrorList)
+
+ def restore_objdir(self):
+ dirs = self.query_abs_dirs()
+ rsync = self.query_exe('rsync')
+ backup_dir = '%s-bak' % dirs['abs_objdir']
+ if not os.path.isdir(dirs['abs_objdir']) or not os.path.isdir(backup_dir):
+ self.warning("Both %s and %s need to exist to restore the objdir! Skipping..." % (dirs['abs_objdir'], backup_dir))
+ return
+ self.run_command([rsync, '-a', '--delete', '--partial',
+ '%s/' % backup_dir,
+ '%s/' % dirs['abs_objdir']],
+ error_list=SSHErrorList)
+
+ def upload_multi(self):
+ # TODO
+ self.info("Not written yet.")
+
+ def _process_command(self, **kwargs):
+ """Stub wrapper function that allows us to call scratchbox in
+ MaemoMultiLocaleBuild.
+
+ """
+ return self.run_command(**kwargs)
+
+# __main__ {{{1
+if __name__ == '__main__':
+ pass