bug 1361037, part 2: compare-locales uses project config under the hood, r=flod, stas
MozReview-Commit-ID: 3deM7zMMdLS
--- a/compare_locales/commands.py
+++ b/compare_locales/commands.py
@@ -4,17 +4,17 @@
'Commands exposed to commandlines'
import logging
from argparse import ArgumentParser
from compare_locales import version
from compare_locales.paths import EnumerateApp
-from compare_locales.compare import compareApp
+from compare_locales.compare import compareProjects
class BaseCommand(object):
"""Base class for compare-locales commands.
This handles command line parsing, and general sugar for setuptools
entry_points.
"""
@@ -101,16 +101,17 @@ Be careful to specify the right merge di
dest='reference',
help='Explicitly set the reference '
'localization. [default: en-US]')
self.add_data_argument(parser)
return parser
def handle(self, args):
app = EnumerateApp(args.ini_file, args.l10n_base_dir, args.locales)
- app.reference = args.reference
+ project_config = app.asConfig()
try:
- observer = compareApp(app, merge_stage=args.merge,
- clobber=args.clobber)
+ observer = compareProjects(
+ project_config,
+ merge_stage=args.merge, clobber_merge=args.clobber)
except (OSError, IOError), exc:
print "FAIL: " + str(exc)
self.parser.exit(2)
return observer
--- a/compare_locales/compare.py
+++ b/compare_locales/compare.py
@@ -431,17 +431,17 @@ class ContentComparer:
# non-filtering other_observers, ignore results
obs.notify(category, file, data)
return rv
def remove(self, obsolete):
self.notify('obsoleteFile', obsolete, None)
pass
- def compare(self, ref_file, l10n):
+ def compare(self, ref_file, l10n, extra_tests=None):
try:
p = parser.getParser(ref_file.file)
except UserWarning:
# no comparison, XXX report?
return
try:
p.readContents(ref_file.getContents())
except Exception, e:
@@ -602,8 +602,50 @@ def compareApp(app, other_observer=None,
if clobber:
# if clobber, remove the stage for the module if it exists
clobberdir = mozpath.join(locale_merge, module)
if os.path.exists(clobberdir):
shutil.rmtree(clobberdir)
print "clobbered " + clobberdir
dir_comp.compareWith(localization)
return comparer.observer
+
+
+def compareProjects(project_configs, other_observer=None,
+ merge_stage=None, clobber_merge=False):
+ assert len(project_configs) == 1 # we're not there yet for multiple
+ comparer = ContentComparer()
+ if other_observer is not None:
+ comparer.add_observer(other_observer)
+ project = project_configs[0]
+ comparer.observer.filter = project.filter
+ for locale in project.locales:
+ files = paths.ProjectFiles(locale, project)
+ if merge_stage is not None:
+ mergedir = merge_stage.format(ab_CD=locale)
+ comparer.set_merge_stage(mergedir)
+ if clobber_merge:
+ modules = set(_m.get('module') for _m in files.matchers)
+ modules.discard(None)
+ for module in modules:
+ clobberdir = mozpath.join(mergedir, module)
+ if os.path.exists(clobberdir):
+ shutil.rmtree(clobberdir)
+ print "clobbered " + clobberdir
+ for l10npath, refpath, extra_tests in files:
+ module = None
+ fpath = None
+ for _m in files.matchers:
+ if _m['l10n'].match(l10npath):
+ module = _m.get('module')
+ fpath = mozpath.relpath(l10npath, _m['l10n'].prefix)
+ break
+ reffile = paths.File(refpath, fpath or refpath, module=module)
+ l10n = paths.File(l10npath, fpath or l10npath,
+ module=module, locale=locale)
+ if not os.path.exists(l10npath):
+ comparer.add(reffile, l10n)
+ continue
+ if not os.path.exists(refpath):
+ comparer.remove(l10n)
+ continue
+ comparer.compare(reffile, l10n, extra_tests)
+ return comparer.observer