blob: 57b5dd87c50c7927d3d2694e3cf42163f1c93a2f [file] [log] [blame] [edit]
#!/bin/bash
#
# Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
# Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
#
# Script to convert Space CODEOWNERS to matching GitHub CODEOWNERS
# 1. Copies CODEOWNERS file to .github
# 2. Replaces team owners such as "Kotlin Build Infrastructure" with their GitHub team equivalent for GitHub CODEOWNERS
# 3. If given Space team is in "codeowners-virtual-team-mapping.json", "virtualMembers" field is used instead of the GitHub team
# Make the script execution relative to project root
PARENT_PATH=$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1 ; pwd -P )
cd "$PARENT_PATH" || exit 1
# Path to the input and output files
GITHUB_CODEOWNERS_FILE="../.github/CODEOWNERS"
SPACE_CODEOWNERS_FILE="../.space/CODEOWNERS"
TEAM_MAPPING_FILE="../.space/codeowners-virtual-team-mapping.json"
# Check if jq is installed
if ! command -v jq &> /dev/null; then
echo "Error: jq is not installed. Please install jq to run this script."
exit 1
fi
# Check if the required files exist
if [ ! -f "$SPACE_CODEOWNERS_FILE" ]; then
echo "Error: $SPACE_CODEOWNERS_FILE does not exist"
exit 1
fi
if [ ! -f "$TEAM_MAPPING_FILE" ]; then
echo "Error: $TEAM_MAPPING_FILE does not exist"
exit 1
fi
# Create a temporary file for GitHub CODEOWNERS file
GITHUB_TMP_FILE=$(mktemp)
# Header text for generated files
HEADER="# Auto-generated file. DO NOT EDIT!
# Generated by '.space/generate-github-codeowners.sh' script
# This file is checked by org.jetbrains.kotlin.code.GitHubOwnersTest
# Correctness can be also verified by opening it on your branch/commit on GitHub where a banner with information \`This CODEOWNERS file is valid.\` should be displayed
"
# Process the OWNERS file line by line
while IFS= read -r line; do
# Skip comment lines from Space CODEOWNERS as they are not relevant for the GitHub file
if [[ "$line" == \#* ]]; then
continue
fi
# Skip empty lines but preserve them in the output
if [[ -z "$line" ]]; then
echo "$line" >> "$GITHUB_TMP_FILE"
continue
fi
# Start with the original line
processed_line="$line"
# Extract all team names in quotes and process them
while [[ "$processed_line" =~ \"([^\"]*)\" ]]; do
team_pattern="\"${BASH_REMATCH[1]}\""
team_name="${BASH_REMATCH[1]}"
# Use jq to check if the team has virtual members and extract them
virtual_members=$(jq -r --arg team "$team_name" '.[] | select(.spaceTeam == $team) | .virtualMembers | join(" ")' "$TEAM_MAPPING_FILE")
# If team has virtual members, use them, otherwise use GitHub team name
if [[ -n "$virtual_members" ]]; then
# Replace the team name with its virtual members
processed_line="${processed_line//$team_pattern/$virtual_members}"
else
# Construct GitHub team name from team_name (lowercase, replace whitespaces with dash, prepend "@JetBrains/")
github_team="@JetBrains/$(echo "$team_name" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')"
# Replace the team name with its GitHub team equivalent
processed_line="${processed_line//$team_pattern/$github_team}"
fi
done
echo "$processed_line" >> "$GITHUB_TMP_FILE"
done < "$SPACE_CODEOWNERS_FILE"
# Copy the processed file to the GitHub destination with header
printf "$HEADER" > "$GITHUB_CODEOWNERS_FILE"
cat "$GITHUB_TMP_FILE" >> "$GITHUB_CODEOWNERS_FILE"
# Clean up
rm "$GITHUB_TMP_FILE"
echo "Conversion completed. CODEOWNERS file created at $GITHUB_CODEOWNERS_FILE"