| # Lint as: python3 |
| # Copyright 2020 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import os |
| import re |
| from typing import List |
| |
| import owners_data |
| |
| _IGNORED_FOLDERS = ('out', 'third_party', 'clank', 'build/linux', |
| 'native_client') |
| _KNOWN_FOLDERS = [ |
| r'^chrome\/browser\/(.*)\/android$', r'^chrome\/browser\/android\/(.*)$', |
| r'^chrome\/android\/(.*)$', |
| r'^chrome\/android\/java\/src\/org\/chromium\/chrome\/browser\/(.*)$', |
| r'^chrome\/android\/features\/(.*)$', |
| r'^chrome\/android\/javatests\/src\/org\/chromium\/chrome\/browser\/(.*)$', |
| r'^chrome\/android\/native_java_unittests\/src\/org\/chromium\/chrome\/browser\/(.*)$', |
| r'^chrome\/android\/junit\/src\/org\/chromium\/chrome\/browser\/(.*)$', |
| r'^components\/(.*)\/android$', |
| r'^content\/public\/android\/java\/src\/org\/chromium\/content\/browser\/(.*)$' |
| ] |
| |
| |
| def get_android_folders(chromium_root: str, |
| limit_to_dir: str) -> List[owners_data.RequestedPath]: |
| '''Get all directories containing `android/` in their path. |
| |
| Use _IGNORED_FOLDERS to exclude commonly returned folders that |
| need to be excluded from the resultset. Use _KNOWN_FOLDERS to propose |
| feature names to the folders based on their patterns. |
| |
| If limit_to_dir is non-empty, only traverse that dir and its subdirectories. |
| ''' |
| |
| android_folders = [] |
| android_folders_found = set() |
| |
| for full_root, dirs, _ in os.walk(chromium_root): |
| assert full_root.startswith(chromium_root) |
| root = full_root[len(chromium_root) + 1:] |
| if root.startswith(_IGNORED_FOLDERS): |
| continue |
| if limit_to_dir and not root.startswith(limit_to_dir): |
| continue |
| |
| for name in dirs: |
| fullpath = os.path.join(root, name) |
| |
| for folder_token in _KNOWN_FOLDERS: |
| found = False |
| re_search = re.match(folder_token, fullpath, re.IGNORECASE) |
| if re_search: |
| feature = re_search.group(1) |
| if folder_token.endswith('(.*)$'): |
| if '/' not in feature: |
| android_folders.append( |
| owners_data.RequestedPath(fullpath, feature)) |
| found = True |
| else: |
| feature = feature.split('/')[0] if '/' in feature else feature |
| android_folders.append(owners_data.RequestedPath(fullpath, feature)) |
| found = True |
| if found: |
| android_folders_found.add(fullpath) |
| break |
| |
| if fullpath.endswith('/android') \ |
| and fullpath not in android_folders_found: |
| feature = fullpath.split('/')[0] if '/' in fullpath\ |
| and not fullpath.startswith('chrome/') else fullpath |
| android_folders.append(owners_data.RequestedPath(fullpath, feature)) |
| android_folders_found.add(fullpath) |
| |
| return android_folders |