1+ # Copyright (c) Microsoft Corporation.
2+ # Licensed under the MIT License.
3+
4+ name : Check Disallowed Files
5+
6+ on :
7+ push :
8+ branches : [main, 2.0*, 3.0*, fasttrack/*]
9+ pull_request :
10+ branches : [main, 2.0*, 3.0*, fasttrack/*]
11+
12+ jobs :
13+
14+ build :
15+ name : Check Disallowed Files
16+ runs-on : ubuntu-latest
17+ steps :
18+
19+ - name : Check out code
20+ uses : actions/checkout@v4
21+
22+ - name : Get base commit for PRs
23+ if : ${{ github.event_name == 'pull_request' }}
24+ run : |
25+ git fetch origin ${{ github.base_ref }}
26+ echo "base_sha=$(git rev-parse origin/${{ github.base_ref }})" >> $GITHUB_ENV
27+ echo "Merging ${{ github.sha }} into ${{ github.base_ref }}"
28+
29+ - name : Get base commit for Pushes
30+ if : ${{ github.event_name == 'push' }}
31+ run : |
32+ git fetch origin ${{ github.event.before }}
33+ echo "base_sha=${{ github.event.before }}" >> $GITHUB_ENV
34+ echo "Merging ${{ github.sha }} into ${{ github.event.before }}"
35+
36+ - name : Get the changed files
37+ run : |
38+ echo "Files changed: '$(git diff-tree --no-commit-id --name-only -r ${{ env.base_sha }} ${{ github.sha }})'"
39+ changed_files=$(git diff-tree --diff-filter=AM --no-commit-id --name-only -r ${{ env.base_sha }} ${{ github.sha }})
40+ echo "Files to validate: '${changed_files}'"
41+ echo "changed-files<<EOF" >> $GITHUB_ENV
42+ echo "${changed_files}" >> $GITHUB_ENV
43+ echo "EOF" >> $GITHUB_ENV
44+
45+ - name : Check for disallowed file types
46+ run : |
47+ if [[ -z "${{ env.changed-files }}" ]]; then
48+ echo "No files to validate. Exiting."
49+ exit 0
50+ fi
51+
52+ echo "Checking files..."
53+ error_found=0
54+
55+ # Read disallowed extensions from the configuration file
56+ if [[ ! -f ".github/workflows/disallowed-extensions.txt" ]]; then
57+ echo "Configuration file '.github/workflows/disallowed-extensions.txt' not found. Skipping check."
58+ exit 0
59+ fi
60+
61+ # Create array of disallowed extensions
62+ mapfile -t disallowed_extensions < .github/workflows/disallowed-extensions.txt
63+ if [[ $? -ne 0 ]]; then
64+ echo "Error occurred while reading disallowed extensions. Exiting."
65+ exit 1
66+ fi
67+
68+ # Check each changed file
69+ while IFS= read -r file; do
70+ if [[ -z "$file" ]]; then
71+ continue
72+ fi
73+
74+ echo "Checking file: $file"
75+
76+ # Get file extension (convert to lowercase for comparison)
77+ extension=$(echo "${file##*.}" | tr '[:upper:]' '[:lower:]')
78+ filename=$(basename "$file")
79+
80+ # Check if file should be in blob store
81+ should_be_in_blob_store=false
82+
83+ # Check against disallowed extensions
84+ for disallowed_ext in "${disallowed_extensions[@]}"; do
85+ # Remove any whitespace and comments
86+ clean_ext=$(echo "$disallowed_ext" | sed 's/#.*//' | xargs)
87+ if [[ -z "$clean_ext" ]]; then
88+ continue
89+ fi
90+
91+ if [[ "$extension" == "$clean_ext" ]]; then
92+ should_be_in_blob_store=true
93+ break
94+ fi
95+ done
96+
97+ # Additional checks for binary files and large files
98+ if [[ -f "$file" ]]; then
99+ # Check if file is binary
100+ if file "$file" | grep -q "binary\|executable\|archive\|compressed"; then
101+ should_be_in_blob_store=true
102+ fi
103+
104+ # Check file size (files > 1MB should be in blob store)
105+ file_size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null || echo 0)
106+ if [[ $file_size -gt 1048576 ]]; then # 1MB
107+ should_be_in_blob_store=true
108+ fi
109+ fi
110+
111+ if [[ "$should_be_in_blob_store" == "true" ]]; then
112+ 1>&2 echo "**** ERROR ****"
113+ 1>&2 echo "File '$file' should be stored in blob store, not in git repository."
114+ 1>&2 echo "Reason: Images, Large files, binaries, tarballs, and non-text files slow down git operations"
115+ 1>&2 echo "and cannot be efficiently diffed. Please upload to blob store instead."
116+ 1>&2 echo "**** ERROR ****"
117+ error_found=1
118+ fi
119+ done <<< "${{ env.changed-files }}"
120+
121+ if [[ $error_found -eq 1 ]]; then
122+ echo ""
123+ echo "=========================================="
124+ echo "FILES THAT SHOULD BE IN BLOB STORE DETECTED"
125+ echo "=========================================="
126+ echo "The following file types should be stored in blob store:"
127+ echo "- Source tarballs (.tar.gz, .tar.xz, .zip, etc.)"
128+ echo "- Binary files (.bin, .exe, .so, .dll, etc.)"
129+ echo "- Images (.gif, .bmp, etc.)"
130+ echo "- Archives (.rar, .7z, .tar, etc.)"
131+ echo "- Large files (> 1MB)"
132+ echo "- Any non-text files that cannot be efficiently diffed"
133+ echo ""
134+ echo "Please upload these files to the blob store and reference them"
135+ echo "in your spec files or configuration instead of checking them into git."
136+ echo "=========================================="
137+ exit 1
138+ fi
139+
140+ echo "All files are appropriate for git storage."
0 commit comments