-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathcheck-bazel-src-files.sh
More file actions
executable file
·187 lines (160 loc) · 5.19 KB
/
check-bazel-src-files.sh
File metadata and controls
executable file
·187 lines (160 loc) · 5.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#!/bin/bash
set -euo pipefail
# Script to check if all source files are included in Bazel targets
# Usage: ./check-bazel-src-files.sh <language> [--fix]
#
# Supported languages: go, py, java, cc, rust
#
# Options:
# --fix Show suggested BUILD.bazel fixes for missing files
SUPPORTED_LANGS="go, py, java, cc, rust"
usage() {
echo "Usage: $0 <language> [--fix]"
echo ""
echo "Supported languages: $SUPPORTED_LANGS"
echo ""
echo "Options:"
echo " --fix Show suggested BUILD.bazel fixes for missing files"
exit 1
}
# Get language-specific configuration
# EXCLUDE_PATS is a space-separated list of patterns to exclude
get_config() {
local lang="$1"
case "$lang" in
go)
EXT="*.go"
RULE_PREFIX="go_"
EXCLUDE_PATS="test_*.go node_modules"
DISPLAY_NAME="Go"
;;
py)
EXT="*.py"
RULE_PREFIX="py_"
EXCLUDE_PATS="test_*.py *_pb2.py *_pb2_grpc.py"
DISPLAY_NAME="Python"
;;
java)
EXT="*.java"
RULE_PREFIX="java_"
EXCLUDE_PATS=""
DISPLAY_NAME="Java"
;;
cc)
EXT="*.cc"
RULE_PREFIX="cc_"
EXCLUDE_PATS=""
DISPLAY_NAME="C++"
;;
rust)
EXT="*.rs"
RULE_PREFIX="rust_"
EXCLUDE_PATS=""
DISPLAY_NAME="Rust"
;;
*)
echo "❌ Unsupported language: $lang"
echo "Supported languages: $SUPPORTED_LANGS"
exit 1
;;
esac
}
# Parse arguments
if [[ $# -lt 1 ]]; then
usage
fi
LANG="$1"
shift
SHOW_FIXES=false
if [[ "${1:-}" == "--fix" ]]; then
SHOW_FIXES=true
fi
# Get language-specific settings
get_config "$LANG"
TEMP_DIR=$(mktemp -d)
trap 'rm -rf "$TEMP_DIR"' EXIT
FILESYSTEM_FILES="$TEMP_DIR/filesystem_files.txt"
BAZEL_FILES="$TEMP_DIR/bazel_files.txt"
echo "🔍 Checking if all $DISPLAY_NAME files are included in Bazel targets..."
echo
# Build find command with optional exclusion patterns
echo "📂 Finding all $DISPLAY_NAME files in filesystem..."
FIND_EXCLUDES=""
for pat in $EXCLUDE_PATS; do
FIND_EXCLUDES="$FIND_EXCLUDES -not -name $pat"
done
# shellcheck disable=SC2086
find . -name "$EXT" \
-not -path "./.git/*" \
-not -path "./bazel-*" \
-not -path "./.bazel-*" \
-not -path "./vendor/*" \
-not -path "./.cache/*" \
-not -path "*/node_modules/*" \
$FIND_EXCLUDES \
| sed 's|^\./||' | sort > "$FILESYSTEM_FILES"
FILESYSTEM_COUNT=$(wc -l < "$FILESYSTEM_FILES")
echo "Found $FILESYSTEM_COUNT $DISPLAY_NAME files in filesystem"
# Extract files from Bazel targets (remove duplicates)
# Use the file extension without the leading *
FILE_EXT="${EXT#\*}"
echo "🏗️ Extracting $DISPLAY_NAME files from Bazel targets..."
bazel query "kind(${RULE_PREFIX}.*, //...)" --output=streamed_jsonproto 2>/dev/null | \
jq -r --arg ext "$FILE_EXT" 'select(.type == "RULE") | select(.rule.ruleClass | startswith("'"$RULE_PREFIX"'")) | (.rule.attribute[] | select(.name == "srcs" and has("stringListValue")) | .stringListValue[]) | select(endswith($ext))' | \
sed 's|^//||' | \
sed 's|:|/|' | \
sort -u > "$BAZEL_FILES"
BAZEL_COUNT=$(wc -l < "$BAZEL_FILES")
echo "Found $BAZEL_COUNT $DISPLAY_NAME files in Bazel targets"
echo
# Compare the files
MISSING_FROM_BAZEL="$TEMP_DIR/missing_from_bazel.txt"
EXTRA_IN_BAZEL="$TEMP_DIR/extra_in_bazel.txt"
comm -23 "$FILESYSTEM_FILES" "$BAZEL_FILES" > "$MISSING_FROM_BAZEL"
comm -13 "$FILESYSTEM_FILES" "$BAZEL_FILES" > "$EXTRA_IN_BAZEL"
MISSING_COUNT=$(wc -l < "$MISSING_FROM_BAZEL")
EXTRA_COUNT=$(wc -l < "$EXTRA_IN_BAZEL")
# Report results
if [[ $MISSING_COUNT -eq 0 && $EXTRA_COUNT -eq 0 ]]; then
echo "✅ All $DISPLAY_NAME files are properly included in Bazel targets!"
exit 0
fi
echo "❌ Found differences between filesystem and Bazel targets:"
echo
if [[ $MISSING_COUNT -gt 0 ]]; then
echo "🚨 $DISPLAY_NAME files NOT included in Bazel targets ($MISSING_COUNT files):"
while IFS= read -r file; do
echo " - $file"
done < "$MISSING_FROM_BAZEL"
echo
if [[ "$SHOW_FIXES" == true ]]; then
echo "🔧 Suggested fixes:"
while IFS= read -r file; do
dir=$(dirname "$file")
build_file="$dir/BUILD.bazel"
if [[ -f "$build_file" ]]; then
echo " Add '$file' to srcs in $build_file"
else
echo " Create $build_file and add ${RULE_PREFIX}library/${RULE_PREFIX}binary rule for '$file'"
fi
done < "$MISSING_FROM_BAZEL"
echo
fi
fi
if [[ $EXTRA_COUNT -gt 0 ]]; then
echo "⚠️ $DISPLAY_NAME files in Bazel targets but NOT found in filesystem ($EXTRA_COUNT files):"
echo " (These might be generated files or moved/deleted files)"
while IFS= read -r file; do
echo " - $file"
done < "$EXTRA_IN_BAZEL"
echo
fi
# Summary
echo "📊 Summary:"
echo " Filesystem $DISPLAY_NAME files: $FILESYSTEM_COUNT"
echo " Bazel target $DISPLAY_NAME files: $BAZEL_COUNT"
echo " Missing from Bazel: $MISSING_COUNT"
echo " Extra in Bazel: $EXTRA_COUNT"
if [[ $MISSING_COUNT -gt 0 ]]; then
exit 1
fi