config/check_js_msg_encoding.py
author Gregory Szorc <gps@mozilla.com>
Thu, 18 May 2017 16:06:49 -0700
changeset 394118 b6057c990bd73e39eb5e7c2c1774dbd9264f64d2
parent 358366 cf12f9b2f41c143b30e267f6750864a63d8fd204
child 426214 18d89d8ab860835f3a380658d2606b68a19ce94c
permissions -rw-r--r--
Bug 1361172 - Rewrite code for finding files in VCS checkout. r=glandium, a=release We're getting an intermittent failure running `hg manifest` in CI. I have no clue why. What I do know is that we now have the mozversioncontrol Python package for containing utility code for interacting with version control. It is slightly more robust and I'm willing to support it more than I am check_utils.py. This commit adds a new API to our abstract repository class to obtain the files in the working directory by querying version control. Since I suspect cwd was coming into play in automation, I've also added a utility function to mozversioncontrol to attempt to find a version control checkout from the current working directory. It simply traces ancestor paths looking for a .hg or .git directory. Finally, I've ported all callers of the now-deleted API to the new one. The old code had some "../.." paths in it, meaning it only worked when cwd was just right. Since we resolve the absolute path to the checkout and store it on the repo object, I've updated the code so it should work no matter what cwd is as long as a repo can be found. I'm not 100% confident I found all consumers assuming cwd. But it's a start. I'm not 100% confident this will fix the intermittent issues in CI. But at least we should get a better error message and at least we'll be running less hacky code. MozReview-Commit-ID: AmCraHXcTEX

# vim: set ts=8 sts=4 et sw=4 tw=99:
# 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/.

#----------------------------------------------------------------------------
# This script checks encoding of the files that define JSErrorFormatStrings.
#
# JSErrorFormatString.format member should be in ASCII encoding.
#----------------------------------------------------------------------------

from __future__ import print_function

import os
import sys

from mozversioncontrol import get_repository_from_env


scriptname = os.path.basename(__file__);
expected_encoding = 'ascii'

# The following files don't define JSErrorFormatString.
ignore_files = [
    'dom/base/domerr.msg',
    'js/xpconnect/src/xpc.msg',
]

def log_pass(filename, text):
    print('TEST-PASS | {} | {} | {}'.format(scriptname, filename, text))

def log_fail(filename, text):
    print('TEST-UNEXPECTED-FAIL | {} | {} | {}'.format(scriptname, filename,
                                                       text))

def check_single_file(filename):
    with open(filename, 'rb') as f:
        data = f.read()
        try:
            data.decode(expected_encoding)
        except:
            log_fail(filename, 'not in {} encoding'.format(expected_encoding))

    log_pass(filename, 'ok')
    return True

def check_files():
    result = True

    repo = get_repository_from_env()
    root = repo.path

    for filename in repo.get_files_in_working_directory():
        if filename.endswith('.msg'):
            if filename not in ignore_files:
                if not check_single_file(os.path.join(root, filename)):
                    result = False

    return result

def main():
    if not check_files():
        sys.exit(1)

    sys.exit(0)

if __name__ == '__main__':
    main()