| #!/bin/bash |
| # Copyright 2024 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # Generate DEPS's missing include rules for given directory. Use this for |
| # ash-chrome only directories under chrome/browser. Files in the directory |
| # listed in `NO_DIR` array are listed separately to avoid adding dependencies |
| # that are too generic and broad. See go/ash-chrome-refactor and b/332805865 for |
| # more information. |
| # |
| # How to use: (e.g. chrome/browser/ash/foo/) |
| # 1. Add "-chrome" to the `include_rules` in chrome/browser/ash/foo/DEPS. |
| # (create it if it does not exist) |
| # 2. Run this script with the directory name. |
| # $ ./tools/chromeos/gen_deps.sh chrome/browser/ash/foo |
| # It will generate the list of directory and files like |
| # "+chrome/browser/profiles", |
| # "+chrome/browser/browser_process.h", |
| # 3. Copy the list to the `include_rules` in DEPS. |
| # 4. Run checkdeps.py without argument. |
| # $ ./buildtools/checkdeps/checkdeps.py |
| # Checking: <path-to-git-dir>/src |
| # SUCCESS |
| |
| # Usage: in_dirs <dir> <dir-array> |
| # Test if 'dir' is in 'dir-array'. |
| function in_dirs { |
| local dir=$1 |
| shift; |
| local dirs=("$@") |
| parent=$(dirname $dir) |
| parents=() |
| while [ "$parent" != "." ]; do |
| parents+=($parent) |
| parent=$(dirname $parent) |
| done |
| for d in "${dirs[@]}"; do |
| for p in "${parents[@]}"; do |
| if [ "$d" == "$p" ]; then |
| return 0 |
| fi |
| done |
| done |
| return -1 |
| } |
| |
| # use new line when echoing the array |
| IFS=$'\n' |
| |
| if [ ${#} -ne 1 ]; then |
| echo "Wrong number of arguments". |
| echo "`basename $0` <directory>" |
| exit |
| fi |
| |
| readonly TARGET=${1} |
| if ! [ -d $TARGET ]; then |
| if ! [ -f $TARGET ]; then |
| echo "${TARGET} does not exist." |
| else |
| echo "${TARGET} is not a directory." |
| fi |
| exit |
| fi |
| |
| # Directories whose files should be listed separately. |
| readonly NO_DIR=("chrome" "chrome/browser" "chrome/browser/ash" |
| "chrome/browser/extensions" "chrome/browser/ui" |
| "chrome/browser/ui/views" "chrome/browser/ui/webui" |
| "chrome/browser/web_applications" "chrome/common") |
| |
| # Check above directories exist. |
| for d in ${NO_DIR[@]}; do |
| if [ ! -d $d ]; then |
| echo "Warning: Directory $d does not exist. " \ |
| "Please update the directory list NO_DIR in $(basename $0)." |
| fi |
| done |
| |
| readonly ALL_FILES=( $(./buildtools/checkdeps/checkdeps.py ${TARGET} \ |
| | grep "Illegal include" | cut -d "\"" -f 2 | sort | uniq) ) |
| |
| # Create directory list. |
| dirs=(`echo "${ALL_FILES[*]}" | sed "s/\/[^\/]*\.h//" | sort | uniq`) |
| |
| # Remove directory where the individual files should be listed. |
| for nd in "${NO_DIR[@]}"; do |
| for i in "${!dirs[@]}"; do |
| if [ "${dirs[i]}" == "$nd" ]; then |
| unset dirs[i] |
| fi |
| done |
| done |
| |
| # List individual files in NO_DIR. |
| files=() |
| for d in "${NO_DIR[@]}"; do |
| files+=(`echo "${ALL_FILES[*]}" | grep "$d/[^\/]*\.h"`) |
| done |
| |
| # Remove sub directories. |
| for i in "${!dirs[@]}"; do |
| if in_dirs "${dirs[i]}" "${dirs[@]}" ; then |
| unset dirs[i] |
| fi |
| done |
| |
| # Combine arrays and sort alphabetically. |
| files_and_dirs=( "${dirs[@]}" "${files[@]}" ) |
| sorted=($(printf '%s\n' "${files_and_dirs[@]}" | sort)) |
| |
| # Print in DEPS format. |
| for i in "${sorted[@]}"; do |
| echo " \"+$i\"," |
| done |