Initial commit
This commit is contained in:
157
skills/get-git-diff/scripts/commit_info.sh
Executable file
157
skills/get-git-diff/scripts/commit_info.sh
Executable file
@@ -0,0 +1,157 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Git Commit Information Functions
|
||||
#
|
||||
# Functions for retrieving commit metadata and relationships.
|
||||
#
|
||||
# Author: Claude Code get-git-diff skill
|
||||
# Version: 1.0.0
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
#######################################
|
||||
# Get detailed information about a commit
|
||||
# Arguments:
|
||||
# $1 - commit reference
|
||||
# Outputs:
|
||||
# Pipe-separated: full_hash|short_hash|author_name|author_email|date|message
|
||||
#######################################
|
||||
get_commit_info() {
|
||||
local commit_ref="$1"
|
||||
local format="%H|%h|%an|%ae|%ad|%s"
|
||||
|
||||
git log -1 --format="${format}" "${commit_ref}" 2>/dev/null
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Get short hash from commit reference
|
||||
# Arguments:
|
||||
# $1 - commit reference
|
||||
# $2 - length (optional, default: 7)
|
||||
# Outputs:
|
||||
# Short hash
|
||||
#######################################
|
||||
get_short_hash() {
|
||||
local commit_ref="$1"
|
||||
local length="${2:-7}"
|
||||
|
||||
git rev-parse --short="${length}" "${commit_ref}" 2>/dev/null
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Check if a commit is a merge commit
|
||||
# Arguments:
|
||||
# $1 - commit reference
|
||||
# Returns:
|
||||
# 0 if merge commit, 1 if not
|
||||
# Outputs:
|
||||
# Parent hashes separated by spaces
|
||||
#######################################
|
||||
is_merge_commit() {
|
||||
local commit_ref="$1"
|
||||
local parents
|
||||
|
||||
if parents=$(git log -1 --format="%P" "${commit_ref}" 2>/dev/null); then
|
||||
local parent_count=$(echo "${parents}" | wc -w)
|
||||
if [[ ${parent_count} -gt 1 ]]; then
|
||||
echo "${parents}"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Get number of commits between two refs
|
||||
# Arguments:
|
||||
# $1 - first commit (older)
|
||||
# $2 - second commit (newer)
|
||||
# Outputs:
|
||||
# Number of commits between them
|
||||
#######################################
|
||||
get_commits_between() {
|
||||
local commit1="$1"
|
||||
local commit2="$2"
|
||||
|
||||
git rev-list --count "${commit1}..${commit2}" 2>/dev/null || echo "0"
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Get commit message (first line)
|
||||
# Arguments:
|
||||
# $1 - commit reference
|
||||
# Outputs:
|
||||
# Commit message subject line
|
||||
#######################################
|
||||
get_commit_message() {
|
||||
local commit_ref="$1"
|
||||
|
||||
git log -1 --format="%s" "${commit_ref}" 2>/dev/null
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Get commit author
|
||||
# Arguments:
|
||||
# $1 - commit reference
|
||||
# Outputs:
|
||||
# Author name and email
|
||||
#######################################
|
||||
get_commit_author() {
|
||||
local commit_ref="$1"
|
||||
|
||||
git log -1 --format="%an <%ae>" "${commit_ref}" 2>/dev/null
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Get commit date
|
||||
# Arguments:
|
||||
# $1 - commit reference
|
||||
# Outputs:
|
||||
# Commit date
|
||||
#######################################
|
||||
get_commit_date() {
|
||||
local commit_ref="$1"
|
||||
|
||||
git log -1 --format="%ad" "${commit_ref}" 2>/dev/null
|
||||
}
|
||||
|
||||
# Allow script to be sourced or run directly
|
||||
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||
# Example usage
|
||||
if [[ $# -eq 0 ]]; then
|
||||
echo "Usage: $0 <commit-ref> [<commit-ref2>]"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " $0 HEAD"
|
||||
echo " $0 HEAD HEAD^"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
commit1="$1"
|
||||
commit2="${2:-}"
|
||||
|
||||
echo "=== Commit Info for ${commit1} ==="
|
||||
info=$(get_commit_info "${commit1}")
|
||||
IFS='|' read -r full short author email date message <<< "${info}"
|
||||
echo "Full hash: ${full}"
|
||||
echo "Short hash: ${short}"
|
||||
echo "Author: ${author} <${email}>"
|
||||
echo "Date: ${date}"
|
||||
echo "Message: ${message}"
|
||||
|
||||
if is_merge_commit "${commit1}"; then
|
||||
parents=$(is_merge_commit "${commit1}")
|
||||
echo "Merge commit: yes"
|
||||
echo "Parents: ${parents}"
|
||||
else
|
||||
echo "Merge commit: no"
|
||||
fi
|
||||
|
||||
if [[ -n "${commit2}" ]]; then
|
||||
echo ""
|
||||
echo "=== Comparison: ${commit1} to ${commit2} ==="
|
||||
count=$(get_commits_between "${commit1}" "${commit2}")
|
||||
echo "Commits between: ${count}"
|
||||
fi
|
||||
fi
|
||||
Reference in New Issue
Block a user