Prepare-commit-msg hook implementation Automate commit message generation to ensure consistency and include necessary metadata:
#!/usr/bin/env bash
# Automated commit message enhancement with Azure DevOps integration
enhance_commit_message() {
local commit_msg_file="$1"
local commit_source="$2"
local sha="$3"
# Skip automation for merge commits, amend commits, etc.
if [ -n "$commit_source" ]; then
return 0
fi
# Get current branch information
local current_branch=$(git branch --show-current)
local branch_prefix=""
# Extract work item ID from branch name if present
if [[ "$current_branch" =~ ^(feature|bugfix|hotfix)/([0-9]+) ]]; then
local work_item_id="${BASH_REMATCH[2]}"
branch_prefix="AB#$work_item_id: "
elif [[ "$current_branch" =~ ^(feature|bugfix|hotfix)/(.+)$ ]]; then
local feature_name="${BASH_REMATCH[2]}"
branch_prefix="[$feature_name] "
fi
# Read existing commit message
local existing_message=$(cat "$commit_msg_file")
# Only add prefix if not already present
if [ ! -z "$branch_prefix" ] && ! echo "$existing_message" | grep -q "^$branch_prefix"; then
# Create enhanced commit message
echo "${branch_prefix}${existing_message}" > "$commit_msg_file"
fi
# Add commit template if message is empty
if [ -z "$existing_message" ] || [ "$existing_message" = "" ]; then
cat >> "$commit_msg_file" << EOF
${branch_prefix}Brief description of changes
# Detailed explanation of what and why changes were made
#
# Include:
# - What problem this solves
# - Why this approach was chosen
# - Any breaking changes or migration notes
#
# Link to work items: AB#1234
EOF
fi
}
enhance_commit_message "$@"git@github.com:Vane-Enterprise/demo-repository.git
Ensure commit messages meet organizational standards:
#!/usr/bin/env bash
# Comprehensive commit message validation
validate_commit_message() {
local commit_msg_file="$1"
local commit_message=$(cat "$commit_msg_file")
# Remove comment lines for validation
local clean_message=$(echo "$commit_message" | grep -v '^#' | sed '/^$/d')
# Check minimum length
if [ ${#clean_message} -lt 10 ]; then
echo "Commit message too short (minimum 10 characters)"
return 1
fi
# Check maximum length for first line
local first_line=$(echo "$clean_message" | head -n1)
if [ ${#first_line} -gt 72 ]; then
echo "Commit message first line too long (maximum 72 characters)"
echo "Current length: ${#first_line}"
return 1
fi
# Check for work item reference in enterprise environments
if ! echo "$clean_message" | grep -qE "(AB#[0-9]+|#[0-9]+|closes #[0-9]+|fixes #[0-9]+)"; then
echo "Commit message should reference a work item (e.g., AB#1234 or #1234)"
echo "Continue anyway? (y/N)"
read -r response
if [[ ! "$response" =~ ^[Yy]$ ]]; then
return 1
fi
fi
# Check for conventional commit format (optional)
if echo "$first_line" | grep -qE "^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: "; then
echo "Conventional commit format detected"
fi
echo "Commit message validation passed"
return 0
}
validate_commit_message "$@" || exit 1Server-side hook integration Use Azure DevOps service hooks for server-side automation:
#!/usr/bin/env bash
# Azure DevOps webhook integration for advanced workflows
trigger_azure_validation() {
local branch_name=$(git branch --show-current)
local commit_sha=$(git rev-parse HEAD)
# Trigger Azure Pipelines validation build
if command -v az >/dev/null 2>&1; then
echo "Triggering Azure DevOps validation pipeline..."
az pipelines build queue \
--definition-name "PR-Validation" \
--branch "$branch_name" \
--commit-id "$commit_sha" \
--output table
fi
}
# Integration with Azure Boards
update_work_item() {
local commit_message="$1"
# Extract work item ID from commit message
if [[ "$commit_message" =~ AB#([0-9]+) ]]; then
local work_item_id="${BASH_REMATCH[1]}"
echo "Updating Azure Boards work item #$work_item_id..."
# Add commit information to work item
az boards work-item update \
--id "$work_item_id" \
--discussion "Commit $(git rev-parse --short HEAD): $(echo "$commit_message" | head -n1)"
fi
}Hook performance guidelines Implement performance optimizations to maintain developer productivity:
#!/usr/bin/env bash
# Performance-optimized hook implementation
optimize_hook_performance() {
# Cache expensive operations
local cache_dir=".git/hooks-cache"
mkdir -p "$cache_dir"
# Only run expensive checks on changed files
local changed_files=$(git diff --cached --name-only)
# Implement timeout protection
timeout 30s expensive_operation || {
echo "Hook operation timed out, skipping..."
return 0
}
# Provide progress feedback for long operations
echo "Running validation (this may take a moment)..."
}
# Implement graceful degradation
fallback_validation() {
echo "Primary validation failed, running minimal checks..."
# Implement basic validation as fallback
}