| Index: tools/findit/findit_for_clusterfuzz.py
|
| diff --git a/tools/findit/findit_for_clusterfuzz.py b/tools/findit/findit_for_clusterfuzz.py
|
| index 086ba9943073528ac3020f5534382cc16d32a984..219947fbffb7784227016f24ff3410ba856194dd 100644
|
| --- a/tools/findit/findit_for_clusterfuzz.py
|
| +++ b/tools/findit/findit_for_clusterfuzz.py
|
| @@ -1,10 +1,9 @@
|
| -# Copyright 2014 The Chromium Authors. All rights reserved.
|
| +# Copyright (c) 2014 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.
|
|
|
| -import logging
|
| -
|
| import chromium_deps
|
| +from common import utils
|
| import crash_utils
|
| import findit_for_crash as findit
|
| import stacktrace
|
| @@ -33,7 +32,7 @@ def SplitStacktrace(stacktrace_string):
|
| line = line.strip()
|
|
|
| # If the line starts with +, it signifies the start of new stacktrace.
|
| - if line.startswith('+'):
|
| + if line.startswith('+-') and line.endswith('-+'):
|
| if 'Release Build Stacktrace' in line:
|
| in_release_or_debug_stacktrace = True
|
| current_stacktrace_lines = []
|
| @@ -63,9 +62,15 @@ def FindCulpritCLs(stacktrace_string,
|
| component_regression=None,
|
| chrome_crash_revision=None,
|
| component_crash_revision=None,
|
| - crashing_component=None):
|
| + crashing_component_path=None,
|
| + crashing_component_name=None,
|
| + crashing_component_repo_url=None):
|
| """Returns the result, a list of result.Result objects and message.
|
|
|
| + If either or both of component_regression and component_crash_revision is not
|
| + None, is is assumed that crashing_component_path and
|
| + crashing_component_repo_url are not None.
|
| +
|
| Args:
|
| stacktrace_string: A string representing stacktrace.
|
| build_type: The type of the job.
|
| @@ -75,27 +80,23 @@ def FindCulpritCLs(stacktrace_string,
|
| chrome_crash_revision: A crash revision of chrome, in string.
|
| component_crash_revision: A crash revision of the component,
|
| if component build.
|
| - crashing_component: Yet to be decided.
|
| + crashing_component_path: A relative path of the crashing component, as in
|
| + DEPS file. For example, it would be 'src/v8' for
|
| + v8 and 'src/third_party/WebKit' for blink.
|
| + crashing_component_name: A name of the crashing component, such as v8.
|
| + crashing_component_repo_url: The URL of the crashing component's repo, as
|
| + shown in DEPS file. For example,
|
| + 'https://chromium.googlesource.com/skia.git'
|
| + for skia.
|
|
|
| Returns:
|
| A list of result objects, along with the short description on where the
|
| result is from.
|
| """
|
| build_type = build_type.lower()
|
| - if 'syzyasan' in build_type:
|
| - return ('This build type is currently not supported.', [])
|
| -
|
| - logging.basicConfig(filename='errors.log', level=logging.WARNING,
|
| - filemode='w')
|
| -
|
| component_to_crash_revision_dict = {}
|
| component_to_regression_dict = {}
|
|
|
| - # TODO(jeun): Come up with a good way to connect crashing component name to
|
| - # its path.
|
| - if component_regression or component_crash_revision:
|
| - return ('Component builds are not supported yet.', [])
|
| -
|
| # If chrome regression is available, parse DEPS file.
|
| chrome_regression = crash_utils.SplitRange(chrome_regression)
|
| if chrome_regression:
|
| @@ -113,6 +114,65 @@ def FindCulpritCLs(stacktrace_string,
|
| component_to_crash_revision_dict = chromium_deps.GetChromiumComponents(
|
| chrome_crash_revision)
|
|
|
| + # Check if component regression information is available.
|
| + component_regression = crash_utils.SplitRange(component_regression)
|
| + if component_regression:
|
| + component_regression_start = component_regression[0]
|
| + component_regression_end = component_regression[1]
|
| +
|
| + # If this component already has an entry in parsed DEPS file, overwrite
|
| + # regression range and url.
|
| + if crashing_component_path in component_to_regression_dict:
|
| + component_regression_info = \
|
| + component_to_regression_dict[crashing_component_path]
|
| + component_regression_info['old_revision'] = component_regression_start
|
| + component_regression_info['new_revision'] = component_regression_end
|
| + component_regression_info['repository'] = crashing_component_repo_url
|
| +
|
| + # if this component does not have an entry, add the entry to the parsed
|
| + # DEPS file.
|
| + else:
|
| + repository_type = crash_utils.GetRepositoryType(
|
| + component_regression_start)
|
| + component_regression_info = {
|
| + 'path': crashing_component_path,
|
| + 'rolled': True,
|
| + 'name': crashing_component_name,
|
| + 'old_revision': component_regression_start,
|
| + 'new_revision': component_regression_end,
|
| + 'repository': crashing_component_repo_url,
|
| + 'repository_type': repository_type
|
| + }
|
| + component_to_regression_dict[crashing_component_path] = \
|
| + component_regression_info
|
| +
|
| + # If component crash revision is available, add it to the parsed crash
|
| + # revisions.
|
| + if component_crash_revision:
|
| +
|
| + # If this component has already a crash revision info, overwrite it.
|
| + if crashing_component_path in component_to_crash_revision_dict:
|
| + component_crash_revision_info = \
|
| + component_to_crash_revision_dict[crashing_component_path]
|
| + component_crash_revision_info['revision'] = component_crash_revision
|
| + component_crash_revision_info['repository'] = crashing_component_repo_url
|
| +
|
| + # If not, add it to the parsed DEPS.
|
| + else:
|
| + if utils.IsGitHash(component_crash_revision):
|
| + repository_type = 'git'
|
| + else:
|
| + repository_type = 'svn'
|
| + component_crash_revision_info = {
|
| + 'path': crashing_component_path,
|
| + 'name': crashing_component_name,
|
| + 'repository': crashing_component_repo_url,
|
| + 'repository_type': repository_type,
|
| + 'revision': component_crash_revision
|
| + }
|
| + component_to_crash_revision_dict[crashing_component_path] = \
|
| + component_crash_revision_info
|
| +
|
| # Parsed DEPS is used to normalize the stacktrace. Since parsed regression
|
| # and parsed crash state essentially contain same information, use either.
|
| if component_to_regression_dict:
|
| @@ -126,8 +186,13 @@ def FindCulpritCLs(stacktrace_string,
|
| # Split stacktrace into release build/debug build and parse them.
|
| (release_build_stacktrace, debug_build_stacktrace) = SplitStacktrace(
|
| stacktrace_string)
|
| - parsed_release_build_stacktrace = stacktrace.Stacktrace(
|
| - release_build_stacktrace, build_type, parsed_deps)
|
| + if not (release_build_stacktrace or debug_build_stacktrace):
|
| + parsed_release_build_stacktrace = stacktrace.Stacktrace(
|
| + stacktrace_string.splitlines(), build_type, parsed_deps)
|
| + else:
|
| + parsed_release_build_stacktrace = stacktrace.Stacktrace(
|
| + release_build_stacktrace, build_type, parsed_deps)
|
| +
|
| parsed_debug_build_stacktrace = stacktrace.Stacktrace(
|
| debug_build_stacktrace, build_type, parsed_deps)
|
|
|
| @@ -139,6 +204,9 @@ def FindCulpritCLs(stacktrace_string,
|
| elif parsed_debug_build_stacktrace.stack_list:
|
| main_stack = parsed_debug_build_stacktrace.GetCrashStack()
|
| else:
|
| + if 'mac_' in build_type:
|
| + return ('No line information available in stacktrace.', [])
|
| +
|
| return ('Stacktrace is malformed.', [])
|
|
|
| # Run the algorithm on the parsed stacktrace, and return the result.
|
|
|