e0e362d700
SDK Tests / changes (push) Waiting to run
SDK Tests / Python SDK Tests (sandbox) (push) Blocked by required conditions
SDK Tests / CLI Quality (push) Blocked by required conditions
SDK Tests / CLI Tests (push) Blocked by required conditions
SDK Tests / Python SDK Quality (code-interpreter) (push) Blocked by required conditions
SDK Tests / Python SDK Quality (sandbox) (push) Blocked by required conditions
SDK Tests / Python SDK Tests (code-interpreter) (push) Blocked by required conditions
SDK Tests / JavaScript SDK Quality And Tests (code-interpreter) (push) Blocked by required conditions
SDK Tests / JavaScript SDK Quality And Tests (sandbox) (push) Blocked by required conditions
Deploy Docs Pages / build (push) Waiting to run
Deploy Docs Pages / deploy (push) Blocked by required conditions
Real E2E Tests / changes (push) Waiting to run
Real E2E Tests / Python E2E (docker bridge) (push) Blocked by required conditions
Real E2E Tests / Java E2E (docker bridge) (push) Blocked by required conditions
Real E2E Tests / JavaScript E2E (docker bridge) (push) Blocked by required conditions
Real E2E Tests / C# E2E (docker bridge) (push) Blocked by required conditions
Real E2E Tests / Go E2E (docker bridge) (push) Blocked by required conditions
Real E2E Tests / Real E2E CI (push) Blocked by required conditions
SDK Tests / Kotlin SDK Quality And Tests (sandbox) (push) Blocked by required conditions
SDK Tests / Kotlin SDK Quality And Tests (code-interpreter) (push) Blocked by required conditions
SDK Tests / C# SDK Quality And Tests (code-interpreter) (push) Blocked by required conditions
SDK Tests / C# SDK Quality And Tests (sandbox) (push) Blocked by required conditions
SDK Tests / Go SDK Quality And Tests (push) Blocked by required conditions
SDK Tests / SDK CI (push) Blocked by required conditions
148 lines
3.4 KiB
Bash
Executable File
148 lines
3.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# Copyright 2025 Alibaba Group Holding Ltd.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
# This script verifies that required files contain the Apache 2.0 license header.
|
|
# It scans tracked source files and fails with a list of violations if any header
|
|
# is missing.
|
|
|
|
set -euo pipefail
|
|
|
|
# Print CI diagnostics
|
|
echo "License verification started at: $(date -u '+%Y-%m-%dT%H:%M:%SZ')"
|
|
echo "Runner: $(hostname) ($(uname -srm))"
|
|
echo "User: $(whoami)"
|
|
echo "Working directory: $(pwd)"
|
|
|
|
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
CURRENT_YEAR="$(date +%Y)"
|
|
MIN_YEAR="2025"
|
|
LICENSE_OWNER="Alibaba Group Holding Ltd."
|
|
LICENSE_REGEX="Copyright [0-9]{4} ${LICENSE_OWNER// / }"
|
|
|
|
# File extensions that are expected to carry a license header.
|
|
LICENSE_EXTS=(
|
|
go py sh kt kts java ts tsx js jsx toml html css sql tf
|
|
)
|
|
|
|
# Explicit file basenames that should also be checked (e.g., Dockerfile)
|
|
LICENSE_BASENAMES=(
|
|
Dockerfile
|
|
)
|
|
|
|
# Paths to ignore entirely.
|
|
IGNORED_PATHS=(
|
|
"LICENSE"
|
|
"NOTICE"
|
|
"docs/"
|
|
)
|
|
|
|
is_k8s_mock_go() {
|
|
local file="${1-}"
|
|
[[ -z "$file" ]] && return 1
|
|
if [[ "$file" != kubernetes/internal/* ]]; then
|
|
return 1
|
|
fi
|
|
if [[ "$file" == *"_mock.go" ]]; then
|
|
return 0
|
|
fi
|
|
if [[ "$file" == */mock/*.go ]]; then
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
is_generated_to_skip() {
|
|
local file="$1"
|
|
if [[ "$file" == *"deepcopy.go" ]]; then
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
cd "$REPO_ROOT"
|
|
|
|
is_ignored() {
|
|
local file="$1"
|
|
for ignore in "${IGNORED_PATHS[@]}"; do
|
|
if [[ "$ignore" == */ ]]; then
|
|
if [[ "$file" == "$ignore"* ]]; then
|
|
return 0
|
|
fi
|
|
elif [[ "$file" == "$ignore" ]]; then
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
has_expected_extension() {
|
|
local file="$1"
|
|
local ext="${file##*.}"
|
|
for candidate in "${LICENSE_EXTS[@]}"; do
|
|
if [[ "$ext" == "$candidate" ]]; then
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
has_expected_basename() {
|
|
local file="$1"
|
|
local base
|
|
base="$(basename "$file")"
|
|
for candidate in "${LICENSE_BASENAMES[@]}"; do
|
|
if [[ "$base" == "$candidate" ]]; then
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
missing=()
|
|
|
|
while IFS= read -r file; do
|
|
if is_ignored "$file"; then
|
|
continue
|
|
fi
|
|
if is_k8s_mock_go "$file"; then
|
|
continue
|
|
fi
|
|
if is_generated_to_skip "$file"; then
|
|
continue
|
|
fi
|
|
|
|
if ! has_expected_extension "$file" && ! has_expected_basename "$file"; then
|
|
continue
|
|
fi
|
|
|
|
header="$(head -n 25 "$file")"
|
|
if ! echo "$header" | grep -Eq "$LICENSE_REGEX"; then
|
|
missing+=("$file")
|
|
continue
|
|
fi
|
|
found_year="$(echo "$header" | grep -Eo "$LICENSE_REGEX" | head -n1 | grep -Eo '[0-9]{4}')"
|
|
if [[ -z "$found_year" || "$found_year" -gt "$CURRENT_YEAR" || "$found_year" -lt "$MIN_YEAR" ]]; then
|
|
missing+=("$file")
|
|
fi
|
|
done < <(git -C "$REPO_ROOT" ls-files)
|
|
|
|
if ((${#missing[@]} > 0)); then
|
|
echo "Missing license header in the following files:"
|
|
printf ' - %s\n' "${missing[@]}"
|
|
exit 1
|
|
fi
|
|
|
|
echo "License headers verified."
|