You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
depot_tools/lib/utils.py

96 lines
2.9 KiB
Python

# Copyright 2022 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.
""" A collection of commonly used functions across depot_tools.
"""
import logging
import os
import re
import subprocess
def depot_tools_version():
depot_tools_root = os.path.dirname(os.path.abspath(__file__))
try:
commit_hash = subprocess.check_output(['git', 'rev-parse', 'HEAD'],
cwd=depot_tools_root).decode(
'utf-8', 'ignore')
return 'git-%s' % commit_hash
except Exception:
pass
# git check failed, let's check last modification of frequently checked file
try:
mtime = os.path.getmtime(
os.path.join(depot_tools_root, 'infra', 'config', 'recipes.cfg'))
return 'recipes.cfg-%d' % (mtime)
except Exception:
return 'unknown'
def normpath(path):
'''Version of os.path.normpath that also changes backward slashes to
forward slashes when not running on Windows.
'''
# This is safe to always do because the Windows version of os.path.normpath
# will replace forward slashes with backward slashes.
path = path.replace(os.sep, '/')
return os.path.normpath(path)
def ListRelevantFilesInSourceCheckout(files, root, match_re, exclude_re):
"""Finds all files that apply to a given set of source files, e.g. PRESUBMIT.
If inherit-review-settings-ok is present right under root, looks for matches
in directories enclosing root.
Args:
files: An iterable container containing file paths.
root: Path where to stop searching.
match_re: regex to match filename
exclude_re: regex to exclude filename
Return:
List of absolute paths of the existing PRESUBMIT.py scripts.
"""
files = [normpath(os.path.join(root, f)) for f in files]
# List all the individual directories containing files.
directories = {os.path.dirname(f) for f in files}
# Ignore root if inherit-review-settings-ok is present.
if os.path.isfile(os.path.join(root, 'inherit-review-settings-ok')):
root = None
# Collect all unique directories that may contain PRESUBMIT.py.
candidates = set()
for directory in directories:
while True:
if directory in candidates:
break
candidates.add(directory)
if directory == root:
break
parent_dir = os.path.dirname(directory)
if parent_dir == directory:
# We hit the system root directory.
break
directory = parent_dir
# Look for PRESUBMIT.py in all candidate directories.
results = []
for directory in sorted(list(candidates)):
try:
for f in os.listdir(directory):
p = os.path.join(directory, f)
if os.path.isfile(p) and re.match(match_re,
f) and not re.match(exclude_re, f):
results.append(p)
except OSError:
pass
logging.debug('Presubmit files: %s', ','.join(results))
return results