blob: de619387274117c612735c2a6d3ba012ea3da1fe [file] [log] [blame]
#!/bin/bash
#
# Copyright (c) 2024 Project CHIP 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.
ROOT_DIR=$(realpath "$(dirname "$0")"/../..)
cd "$ROOT_DIR"
get_repo_and_branch_info() {
# Input validation
if [ -z "$1" ]; then
echo "Please provide a path."
return 1
fi
path="$1"
repo_friendly_name="Matter SDK"
if [ "$path" != "." ]; then
title_case_path=$(echo "$path" | awk '{ for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) tolower(substr($i,2)); }1')
repo_friendly_name=$title_case_path
fi
# Check if the directory exists
if [ ! -d "$path" ]; then
echo "Directory '$path' does not exist."
return 1
fi
cd "$path"
# Get the URL of the remote origin
remote_url=$(git config --get remote.origin.url)
if [ -n "$remote_url" ]; then
# Extract the repository name from the URL
repo_name=$(basename -s .git "$remote_url")
# Calculate the necessary padding to align the end pipe
total_length=95 # Adjust this based on your frame width
text_length=${#repo_friendly_name}+${#repo_name}+4 # 4 for the ": " and two spaces around the repo name
padding_length=$((total_length - text_length))
echo '+-----------------------------------------------------------------------------------------------+'
printf "| %s: %s%*s|\n" "$repo_friendly_name" "$repo_name" "$padding_length" ""
echo '+-----------------------------------------------------------------------------------------------+'
else
# Print error message if there is no remote URL
echo "Not a Git repository or no remote set"
return 1
fi
# Get the current branch and its tracking branch
git_status=$(git status)
tracking_branch_info=$(echo "$git_status" | grep "Your branch is up to date with")
# Extract the fork owner and branch from the tracking branch info
if [[ $tracking_branch_info =~ Your\ branch\ is\ up\ to\ date\ with\ \'([^\']+)\' ]]; then
fork_owner_and_branch="${BASH_REMATCH[1]}"
else
fork_owner_and_branch="Not set or not a tracking branch"
fi
# Get the commit SHA of the current HEAD
commit_sha=$(git rev-parse HEAD)
echo "Commit SHA: $commit_sha"
# Get the commit message of the current HEAD
commit_message=$(git log -1 --pretty=format:"%B")
trimmed_commit_message=$(trim_commit_message "$commit_message")
echo "Commit Message: $trimmed_commit_message"
# Get the commit author of the current HEAD
commit_author=$(git log -1 --pretty=format:"%an")
echo "Commit Author: $commit_author"
# Get the commit date and time of the current HEAD including timezone
commit_datetime=$(git log -1 --pretty=format:"%cd" --date=format:"%Y-%m-%d %H:%M:%S %z")
echo "Commit Date: $commit_datetime"
# Attempt to find branches that contain this commit
branches=$(git branch --contains "$commit_sha" | sed 's/^/ /')
if [ -n "$branches" ]; then
echo "Contained in branches:"
echo "$branches"
else
echo "This commit is not on any known branch."
fi
echo " Tracking: $fork_owner_and_branch"
echo
# Navigate back to the original directory
cd "$ROOT_DIR"
}
trim_commit_message() {
local commit_message="$1"
# Check if the commit message contains a newline character
if [[ "$commit_message" == *$'\n'* ]]; then
# Extract the first line of the commit message
local first_line="${commit_message%%$'\n'*}"
else
# If there's no newline, use the entire commit message
local first_line="$commit_message"
fi
# Trim leading and trailing whitespace from the first line and echo it
echo "$first_line" | sed 's/^[ \t]*//;s/[ \t]*$//'
}
# Print SDK root git status
get_repo_and_branch_info "."
# Handle arguments
case "$1" in
--git-sub)
# Initialize an array to hold the directories
declare -a repo_dirs
cd "$ROOT_DIR"
# Find directories containing a .github folder and store them in the array, excluding the current directory
while IFS= read -r dir; do
# Check if the directory is not the current directory
if [[ "$dir" != "." ]]; then
repo_dirs+=("$dir")
fi
done < <(find . -type d -name .github | awk -F'/[^/]*$' '{print $1}')
# Iterate through the directories and call the function for each
for dir in "${repo_dirs[@]}"; do
get_repo_and_branch_info "$dir"
done
;;
*) ;;
esac