#!/bin/bash # Configuration (Customize these!) REPO_URLS="/opt/src/repository.list" REPO_LOCAL_PATH="/opt/src" BRANCH_NAME="develop" POLL_INTERVAL=60 # Seconds between checks #LOG_FILE="/var/log/git-monitor.log" # Log file for recording actions LOCK_FILE="/run/lock/git-monitor.lock" # File to prevent multiple instances IFS="|" # Functions log_message() { local level=$1 local message=$2 timestamp=$(date +'%Y-%m-%d %H:%M:%S') #echo "$timestamp [$level] $message" >> "$LOG_FILE" echo "$timestamp [$level] $message" # Also print to console (optional) } check_lock() { if [ -f "$LOCK_FILE" ]; then log_message "WARN" "Another instance is already running. Exiting." exit 1 fi } create_lock() { touch "$LOCK_FILE" } run_after() { local after_pull_script=$1 source $after_pull_script } initialize_repos() { while read -r repo_name repo_url; do if [ ! -d "$REPO_LOCAL_PATH/$repo_name" ]; then log_message "INFO" "Repository directory $REPO_LOCAL_PATH/$repo_name does not exist. Cloning..." mkdir -p "$REPO_LOCAL_PATH/$repo_name" git clone --depth 1 "$repo_url" "$REPO_LOCAL_PATH/$repo_name" if [ $? -ne 0 ]; then log_message "ERROR" "Failed to clone repository. Exiting." exit 1 fi log_message "INFO" "Repository cloned successfully." fi done <$REPO_URLS } check_for_updates() { local repo_name=$1 local last_commit_hash local current_commit_hash # Get the last known commit hash (from a file) cd "$REPO_LOCAL_PATH/$repo_name" if [ -f "$REPO_LOCAL_PATH/$repo_name/.git-monitor-last-commit" ]; then last_commit_hash=$(cat "$REPO_LOCAL_PATH/$repo_name/.git-monitor-last-commit") else last_commit_hash="" # Initialize if file doesn't exist fi # Fetch the latest commit hash from the remote repository git -C "$REPO_LOCAL_PATH/$repo_name" fetch origin $BRANCH_NAME current_commit_hash=$(git -C "$REPO_LOCAL_PATH/$repo_name" rev-parse origin $BRANCH_NAME) if [ -z "$last_commit_hash" ] || [ "$current_commit_hash" != "$last_commit_hash" ]; then log_message "INFO" "New commits detected. Pulling..." git -C "$REPO_LOCAL_PATH/$repo_name" checkout $BRANCH_NAME if [ $? -eq 0 ]; then log_message "INFO" "Pull successful." # Update the last commit hash file echo "$current_commit_hash" > "$REPO_LOCAL_PATH/$repo_name/.git-monitor-last-commit" else log_message "ERROR" "Pull failed." fi fi } # Main Execution trap 'rm -f $LOCK_FILE' EXIT check_lock create_lock log_message "INFO" "Git monitor started." initialize_repos while true; do while read -r repo_name repo_url; do check_for_updates $repo_name if [ -f "$REPO_LOCAL_PATH/$repo_name/.git-monitor_after.sh" ]; then run_after "$REPO_LOCAL_PATH/$repo_name/.git-monitor_after.sh" fi done < $REPO_URLS sleep "$POLL_INTERVAL" done