Untitled
unknown
plain_text
8 months ago
4.2 kB
8
Indexable
#!/usr/bin/env bash
set -euo pipefail
GITHUB_API_HEADER="Accept: application/vnd.github.v3+json"
# ... (other functions remain unchanged) ...
github::calculate_total_modifications() {
# ... existing code ...
}
github::has_label() {
# ... existing code ...
}
github::add_label_to_pr() {
local -r pr_number="${1}"
shift
# All new labels (size and language) are passed as additional arguments.
local -a new_labels=("$@")
# Fetch current labels from the issue (pull request).
local current_labels
current_labels=$(curl -sSL \
-H "Authorization: token $GITHUB_TOKEN" \
-H "$GITHUB_API_HEADER" \
"$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/issues/$pr_number" | jq -r '.labels[].name')
# Remove any existing size labels from current labels.
local filtered_current_labels
filtered_current_labels=$(echo "$current_labels" | grep -vwE "^(size/xs|size/s|size/m|size/l|size/xl)$" || true)
# Combine filtered current labels with the new labels.
local all_labels
all_labels=$(printf "%s\n%s" "$filtered_current_labels" "$(printf "%s\n" "${new_labels[@]}")")
# Remove empty lines.
all_labels=$(echo "$all_labels" | sed '/^\s*$/d')
# Remove duplicates.
local unique_labels
unique_labels=$(echo "$all_labels" | sort -u)
local -r comma_separated_labels
comma_separated_labels=$(github::format_labels "$unique_labels")
log::message "Final labels: $comma_separated_labels"
curl -sSL \
-H "Authorization: token $GITHUB_TOKEN" \
-H "$GITHUB_API_HEADER" \
-X PATCH \
-H "Content-Type: application/json" \
-d "{\"labels\":[$comma_separated_labels]}" \
"$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/issues/$pr_number" >/dev/null
}
github::format_labels() {
SAVEIFS=$IFS
IFS=$'\n'
local -r labels=($@)
IFS=$SAVEIFS
quoted_labels=()
for ((i = 0; i < ${#labels[@]}; i++)); do
label="${labels[$i]}"
quoted_labels+=("$(str::quote "$label")")
done
coll::join_by "," "${quoted_labels[@]/#/}"
}
github::comment() {
local -r comment="$1"
curl -sSL \
-H "Authorization: token $GITHUB_TOKEN" \
-H "$GITHUB_API_HEADER" \
-X POST \
-H "Content-Type: application/json" \
-d "{\"body\":\"$comment\"}" \
"$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/issues/$pr_number/comments"
}
# --- New Function for Language Labeling using Linguist ---
labeler::add_language_labels() {
local pr_number="$1"
# Create a temporary directory for the changed files.
local tmp_dir
tmp_dir=$(mktemp -d)
# Determine changed files. You may adjust this diff range as needed.
# This example uses 'origin/main' as the base.
local changed_files
changed_files=$(git diff --name-only origin/main...HEAD)
# Copy each changed file into the temporary directory preserving structure.
for file in $changed_files; do
if [ -f "$file" ]; then
mkdir -p "$tmp_dir/$(dirname "$file")"
cp "$file" "$tmp_dir/$file"
fi
done
# Run Linguist on the temporary directory. Ensure that Ruby and the github-linguist gem are installed.
local linguist_output
linguist_output=$(linguist --breakdown "$tmp_dir")
# Debug: Output the linguist breakdown.
log::message "Linguist output:"
log::message "$linguist_output"
# Parse Linguist output to get language names.
# Expected output lines: "LanguageName xx.xx%"
local -a languages=()
while IFS= read -r line; do
# Skip empty lines.
[ -z "$line" ] && continue
# Extract the language name (first column)
local lang
lang=$(echo "$line" | awk '{print $1}')
# Optionally, skip a generic "Other" language.
if [ "$lang" = "Other" ]; then
continue
fi
# Build a label and convert to lowercase.
languages+=("pr: lang/$(echo "$lang" | tr '[:upper:]' '[:lower:]')")
done <<< "$linguist_output"
# Clean up temporary directory.
rm -rf "$tmp_dir"
# Add each detected language label to the PR.
for lang_label in "${languages[@]}"; do
log::message "Adding language label: ${lang_label}"
github::add_label "$pr_number" "$lang_label"
done
}
Editor is loading...
Leave a Comment