diff --git a/clang_format.py b/clang_format.py index f1043bba9..8320e6d2a 100755 --- a/clang_format.py +++ b/clang_format.py @@ -23,22 +23,14 @@ class NotFoundError(Exception): ' %s' % e) -def _FindChromiumSourceRoot(): - """Return the source root of the current chromium checkout, or die trying.""" - # The use of .gn is somewhat incongruous here, but we need a file uniquely - # existing at src/. GN does the same thing at least. - source_root = gclient_utils.FindFileUpwards('.gn') - if not source_root: - raise NotFoundError( - '.gn file not found in any parent of the current path.') - return source_root - - def FindClangFormatToolInChromiumTree(): """Return a path to the clang-format executable, or die trying.""" - tool_path = os.path.join(_FindChromiumSourceRoot(), 'third_party', - 'clang_format', 'bin', - gclient_utils.GetMacWinOrLinux(), + bin_path = gclient_utils.GetBuildtoolsPlatformBinaryPath() + if not bin_path: + raise NotFoundError( + 'Could not find checkout in any parent of the current path.') + + tool_path = os.path.join(bin_path, 'clang-format' + gclient_utils.GetExeSuffix()) if not os.path.exists(tool_path): raise NotFoundError('File does not exist: %s' % tool_path) @@ -47,8 +39,11 @@ def FindClangFormatToolInChromiumTree(): def FindClangFormatScriptInChromiumTree(script_name): """Return a path to a clang-format helper script, or die trying.""" - script_path = os.path.join(_FindChromiumSourceRoot(), 'third_party', - 'clang_format', 'script', script_name) + tools_path = gclient_utils.GetBuildtoolsPath() + if not tools_path: + raise NotFoundError( + 'Could not find checkout in any parent of the current path.') + script_path = os.path.join(tools_path, 'clang_format', 'script', script_name) if not os.path.exists(script_path): raise NotFoundError('File does not exist: %s' % script_path) return script_path diff --git a/gclient_utils.py b/gclient_utils.py index 655e5aa1b..9837cbb36 100644 --- a/gclient_utils.py +++ b/gclient_utils.py @@ -655,6 +655,19 @@ def GetBuildtoolsPath(): This is based on the root of the checkout containing the current directory.""" gclient_root = FindGclientRoot(os.getcwd()) if not gclient_root: + # Some projects might not use .gclient. Try to see whether we're in a git + # checkout. + top_dir = [os.getcwd()] + def filter_fn(line): + top_dir[0] = os.path.normpath(line.rstrip('\n')) + try: + CheckCallAndFilter(["git", "rev-parse", "--show-toplevel"], + print_stdout=False, filter_fn=filter_fn) + except Exception: + pass + top_dir = top_dir[0] + if os.path.exists(os.path.join(top_dir, 'buildtools')): + return os.path.join(top_dir, 'buildtools') return None return os.path.join(gclient_root, 'src', 'buildtools')