scripts/hooks/add-license-header.sh
#!/bin/bash

# License header content
APACHE_LICENSE_HEADER="/*
 * Copyright 2025 coze-plus Authors
 *
 * 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.
 */"

SHELL_LICENSE_HEADER="#
# Copyright 2025 coze-plus Authors  
#
# 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.
#"

# File extensions that require license headers
declare -a FILE_EXTENSIONS=("go" "ts" "tsx" "js" "jsx" "sh")

# Function to check if file already has license header
has_license_header() {
    local file="$1"
    local ext="${file##*.}"
    
    case "$ext" in
        "go"|"ts"|"tsx"|"js"|"jsx")
            # Check for /* Copyright pattern within first 5 lines
            head -n 5 "$file" | grep -q "Copyright.*coze-plus Authors"
            ;;
        "sh")
            # Check for # Copyright pattern within first 10 lines (accounting for shebang)
            head -n 10 "$file" | grep -q "Copyright.*coze-plus Authors"
            ;;
        *)
            return 1
            ;;
    esac
}

# Function to add license header to file
add_license_header() {
    local file="$1"
    local ext="${file##*.}"
    local temp_file=$(mktemp)
    
    case "$ext" in
        "go"|"ts"|"tsx"|"js"|"jsx")
            # Add C-style comment header
            echo "$APACHE_LICENSE_HEADER" > "$temp_file"
            echo "" >> "$temp_file"
            cat "$file" >> "$temp_file"
            ;;
        "sh")
            # Handle shell files with potential shebang
            if head -n 1 "$file" | grep -q "^#!"; then
                # Preserve shebang
                head -n 1 "$file" > "$temp_file"
                echo "$SHELL_LICENSE_HEADER" >> "$temp_file"
                echo "" >> "$temp_file"
                tail -n +2 "$file" >> "$temp_file"
            else
                # No shebang
                echo "$SHELL_LICENSE_HEADER" > "$temp_file"
                echo "" >> "$temp_file"
                cat "$file" >> "$temp_file"
            fi
            ;;
        *)
            echo "Unsupported file extension: $ext"
            rm "$temp_file"
            return 1
            ;;
    esac
    
    # Replace original file with modified version
    mv "$temp_file" "$file"
    return 0
}

# Function to check if file is a text file and should be processed
should_process_file() {
    local file="$1"
    local ext="${file##*.}"
    
    # Check if extension is in our list
    for supported_ext in "${FILE_EXTENSIONS[@]}"; do
        if [[ "$ext" == "$supported_ext" ]]; then
            return 0
        fi
    done
    return 1
}

# Main function
main() {
    local files_modified=0
    
    # Get list of staged files
    staged_files=$(git diff --cached --name-only --diff-filter=ACM)
    
    if [[ -z "$staged_files" ]]; then
        echo "No staged files to process"
        exit 0
    fi
    
    echo "Checking license headers for staged files..."
    
    while IFS= read -r file; do
        # Skip if file doesn't exist (might be deleted)
        [[ ! -f "$file" ]] && continue
        
        # Skip if file shouldn't be processed
        if ! should_process_file "$file"; then
            continue
        fi
        
        echo "Checking: $file"
        
        # Check if file already has license header
        if has_license_header "$file"; then
            echo "  ✓ License header present"
        else
            echo "  + Adding license header"
            if add_license_header "$file"; then
                # Add the modified file back to staging
                git add "$file"
                files_modified=$((files_modified + 1))
                echo "  ✓ License header added and file re-staged"
            else
                echo "  ✗ Failed to add license header"
                exit 1
            fi
        fi
    done <<< "$staged_files"
    
    if [[ $files_modified -gt 0 ]]; then
        echo ""
        echo "Added license headers to $files_modified file(s) and re-staged them for commit."
    else
        echo ""
        echo "All staged files already have proper license headers."
    fi
}

# Run main function
main "$@"