blob: 9c2573036b929d6d999e3ba1d661bf4edc82254c [file] [log] [blame]
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Presubmit script to verify that XIB changes are done with the right version.
See http://dev.chromium.org/developers/design-documents/mac-xib-files for more
information.
"""
import re
# Minimum is Mac OS X 10.9.5 (13F34).
HUMAN_DARWIN_VERSION = '10.9.5'
ALLOWED_DARWIN_VERSION = 13 # Darwin 13 = 10.9.
MINIMUM_DARWIN_RELEASE = 'F' # Release F = 10.9.5.
MINIMUM_IB_VERSION = 5053 # Xcode 5.1.
MAXIMUM_IB_VERSION = 5056 # Xcode 5.1.1.
HUMAN_IB_VERSION = '>= 5.1, <= 5.1.1'
SYSTEM_VERSION_RE = r'<document .* systemVersion="([0-9]{,2})([A-Z])([0-9]+)"'
IB_VERSION_RE = \
r'<plugIn identifier="com\.apple\.InterfaceBuilder\.CocoaPlugin" ' + \
'version="([0-9]+)"/>'
def _CheckXIBSystemAndXcodeVersions(input_api, output_api, error_type):
affected_xibs = [x for x in input_api.AffectedFiles()
if x.LocalPath().endswith('.xib')]
incorrect_system_versions = []
incorrect_ib_versions = []
for xib in affected_xibs:
if len(xib.NewContents()) == 0:
continue
system_version = None
ib_version = None
new_contents = xib.NewContents()
if not new_contents:
# Deleting files is always fine.
continue
for line in new_contents:
m = re.search(SYSTEM_VERSION_RE, line)
if m:
system_version = (m.group(1), m.group(2), m.group(3))
m = re.search(IB_VERSION_RE, line)
if m:
ib_version = m.group(1)
if system_version is not None and ib_version is not None:
break
if system_version is None:
incorrect_system_versions.append(xib.LocalPath())
continue
if int(system_version[0]) != ALLOWED_DARWIN_VERSION:
incorrect_system_versions.append(xib.LocalPath())
continue
if system_version[1] < MINIMUM_DARWIN_RELEASE:
incorrect_system_versions.append(xib.LocalPath())
continue
if ib_version is None or int(ib_version) < MINIMUM_IB_VERSION or \
int(ib_version) > MAXIMUM_IB_VERSION:
incorrect_ib_versions.append(xib.LocalPath())
continue
problems = []
if incorrect_system_versions:
problems.append(error_type(
'XIB files need to be saved on Mac OS X ' + HUMAN_DARWIN_VERSION,
items=incorrect_system_versions))
if incorrect_ib_versions:
problems.append(error_type(
'XIB files need to be saved using Xcode version ' + HUMAN_IB_VERSION,
items=incorrect_ib_versions))
return problems
def CheckChangeOnUpload(input_api, output_api):
# Allow uploads to happen even if the presubmit fails, so that contributors
# can ask their reviewer or another person to re-save the XIBs for them.
return _CheckXIBSystemAndXcodeVersions(input_api, output_api,
error_type=output_api.PresubmitPromptWarning)
def CheckChangeOnCommit(input_api, output_api):
return _CheckXIBSystemAndXcodeVersions(input_api, output_api,
error_type=output_api.PresubmitError)