bug 1361037, part 2: compare-locales uses project config under the hood, r=flod, stas
authorAxel Hecht <axel@pike.org>
Fri, 12 May 2017 19:24:15 +0200
changeset 233 8ed0fa3e420b5417e0ddb926b5193d3854c32c4e
parent 232 a6ac3254f7dccb89ebc695b553f3a64271df0c30
child 234 1a9277b5b40cf434d6b85ccd546b7fbb91fcad05
push id48
push useraxel@mozilla.com
push dateFri, 26 May 2017 11:10:47 +0000
reviewersflod, stas
bugs1361037
bug 1361037, part 2: compare-locales uses project config under the hood, r=flod, stas MozReview-Commit-ID: 3deM7zMMdLS
compare_locales/commands.py
compare_locales/compare.py
--- 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