diff --git a/auto_git_update.sh b/auto_git_update.sh index 038f217..6f791c2 100755 --- a/auto_git_update.sh +++ b/auto_git_update.sh @@ -12,7 +12,6 @@ fi # If the security variable is 2, continue without any conditions if [ "$security_variable" -eq 2 ]; then echo "security_variable is set to 2. Running the script without further checks." - # Continue with the rest of your script else # If the security variable is 1, check if today is Friday DAY_OF_WEEK=$(date +%A) @@ -34,15 +33,32 @@ done # Configuration TXT_FILE="/home/klein/.config/setup/autogitupdate.txt" -PHONE_NUMBER="2673479614@vtext.com" # Verizon SMS gateway -EMAIL="kleinpanic@gmail.com" -SUBJECT="G-U-R" +CREDENTIALS_FILE="$HOME/.config/setup/credentials.config" REPORT="/tmp/git_update_report.txt" # Full detailed report SMS_REPORT="/tmp/git_update_sms.txt" # Minimal SMS summary -SSH_HOST="eulerpi5" # Alias for the SSH connection -SSH_DIR="/home/klein/reports" # Remote directory to store the report SMS_CHAR_LIMIT=160 # Character limit for SMS messages +# Check for the existence of the configuration file +if [ ! -f "$TXT_FILE" ]; then + echo "Error: Configuration file '$TXT_FILE' not found. Exiting the script." + exit 1 +fi + +# Check if the credentials file exists +if [ ! -f "$CREDENTIALS_FILE" ]; then + echo "Error: Credentials file '$CREDENTIALS_FILE' not found. Exiting the script." + exit 1 +fi + +# Source the credentials from the config file +source "$CREDENTIALS_FILE" + +# Validate that required variables are set +if [ -z "$EMAIL" ] || [ -z "$SSH_HOST" ] || [ -z "$PHONE_NUMBER" ]; then + echo "Error: Missing required credentials (EMAIL, SSH_HOST, or PHONE_NUMBER) in '$CREDENTIALS_FILE'. Exiting the script." + exit 1 +fi + # Ensure the report files exist and have the correct permissions ensure_file() { local file="$1" @@ -147,6 +163,44 @@ check_github_remote() { return 0 } +# Function to check if the repository is up-to-date +is_repo_up_to_date() { + git remote update &>/dev/null + if git status -uno | grep -q "Your branch is up to date"; then + echo "Repository is up to date. No fetch needed." + return 0 + else + echo "Repository is not up to date. Fetching changes..." + return 1 + fi +} + +# Function to check if the .git folder is valid +is_valid_git_repo() { + local repo_dir="$1" + + if [ ! -d "$repo_dir/.git" ]; then + echo "Error: '.git' directory is missing in '$repo_dir'. Skipping this repository." >> "$REPORT" + return 1 + fi + + # Check for essential .git files + for file in HEAD config; do + if [ ! -f "$repo_dir/.git/$file" ]; then + echo "Error: Missing '$file' in '.git' directory of '$repo_dir'. Skipping this repository." >> "$REPORT" + return 1 + fi + done + + # Ensure the repository has at least one commit + if ! git -C "$repo_dir" rev-parse HEAD &>/dev/null; then + echo "Error: The repository in '$repo_dir' appears to be corrupt or does not have any commits." >> "$REPORT" + return 1 + fi + + return 0 +} + # Function to update, commit, and push the changes update_repo() { local repo_dir="$1" @@ -155,6 +209,12 @@ update_repo() { echo "Processing repository #$repo_number located at $repo_dir" >> "$REPORT" + # Validate .git folder before proceeding + if ! is_valid_git_repo "$repo_dir"; then + echo "Repo #$repo_number: Invalid .git folder, skipping..." >> "$SMS_REPORT" + return 1 + fi + local github_exists=true if ! check_github_remote; then echo "No valid GitHub repository found for repo #$repo_number." >> "$REPORT" @@ -168,7 +228,12 @@ update_repo() { fi if [ "$github_exists" = true ]; then - git fetch origin &>/dev/null + if is_repo_up_to_date; then + return 0 # Exit the update function early since there's nothing to fetch + else + git fetch origin &>/dev/null # Proceed with the fetch if not up-to-date + fi + if ! git merge origin/main --no-commit --no-ff; then echo "Merge conflict detected in repo #$repo_number" >> "$REPORT" echo "Repo #$repo_number: MC" >> "$SMS_REPORT" diff --git a/auto_git_update.sh.bak b/auto_git_update.sh.bak index 45cc0af..cd09f68 100755 --- a/auto_git_update.sh.bak +++ b/auto_git_update.sh.bak @@ -1,5 +1,29 @@ #!/usr/bin/env bash +# Declare the security variable +security_variable=1 # Change this value as needed (0, 1, or 2) + +# Check the value of the security variable +if [ "$security_variable" -eq 0 ]; then + echo "Error: security_variable is set to 0. Exiting the script." + exit 1 +fi + +# If the security variable is 2, continue without any conditions +if [ "$security_variable" -eq 2 ]; then + echo "security_variable is set to 2. Running the script without further checks." + # Continue with the rest of your script +else + # If the security variable is 1, check if today is Friday + DAY_OF_WEEK=$(date +%A) + if [ "$DAY_OF_WEEK" = "Friday" ]; then + echo "Today is Friday. Continuing with the script." + else + echo "Error: Today is not Friday (Today is $DAY_OF_WEEK). Exiting the script." + exit 1 + fi +fi + # Check if required commands are available for cmd in git nmcli msmtp ssh scp gh; do if ! command -v "$cmd" &>/dev/null; then @@ -39,25 +63,18 @@ check_wifi() { get_repo_dirs() { local valid_dirs=() - echo "Reading directories from $TXT_FILE..." # Debugging line - while IFS= read -r repo_dir; do # Trim whitespace and skip empty lines repo_dir=$(echo "$repo_dir" | xargs) [ -z "$repo_dir" ] && continue - echo "Processing: '$repo_dir'" # Debugging line to show each line being processed - # Check if the directory is valid and contains a .git folder if [ -d "$repo_dir" ] && [ -d "$repo_dir/.git" ]; then - echo "Valid Git repository found: '$repo_dir'" # Debugging line valid_dirs+=("$repo_dir") - else - echo "Invalid directory or not a Git repository: '$repo_dir'" # Debugging line fi done < "$TXT_FILE" - echo "Valid directories: ${valid_dirs[@]}" # Final debug line showing valid directories + # Output only the valid directories without any additional text echo "${valid_dirs[@]}" } @@ -65,16 +82,17 @@ get_repo_dirs() { create_github_repo() { local repo_name="$1" local repo_dir="$2" - echo "Attempting to create GitHub repo for repo $repo_name" >> "$REPORT" + local repo_number="$3" + echo "Attempting to create GitHub repo for repo $repo_number ($repo_name)" >> "$REPORT" # Use GitHub CLI to create the repo if gh repo create "$repo_name" --public --source="$repo_dir" --remote=origin --push; then - echo "Successfully created GitHub repository $repo_name" >> "$REPORT" - echo "Repo $repo_name: GHS (GitHub Repo Created Successfully)" >> "$SMS_REPORT" + echo "Successfully created GitHub repository #$repo_number: $repo_name" >> "$REPORT" + echo "Repo #$repo_number $repo_name: GHS (GitHub Repo Created Successfully)" >> "$SMS_REPORT" # Check if the repository has existing commits if [ -d "$repo_dir/.git" ] && [ "$(git -C "$repo_dir" rev-parse HEAD)" ]; then - echo "Repository has existing commits. Attempting to add remote and push." >> "$REPORT" + echo "Repository #$repo_number has existing commits. Attempting to add remote and push." >> "$REPORT" # Add the GitHub remote if not already added git remote add origin "git@github.com:kleinpanic/$repo_name.git" 2>/dev/null || true @@ -84,17 +102,17 @@ create_github_repo() { # Push to GitHub if git push -u origin main; then - echo "Existing repository pushed successfully to GitHub." >> "$REPORT" - echo "Repo $repo_name: Pushed Successfully" >> "$SMS_REPORT" + echo "Existing repository #$repo_number pushed successfully to GitHub." >> "$REPORT" + echo "Repo #$repo_number $repo_name: Pushed Successfully" >> "$SMS_REPORT" else - echo "Failed to push the existing repository to GitHub." >> "$REPORT" - echo "Repo $repo_name: Push Failed" >> "$SMS_REPORT" + echo "Failed to push the existing repository #$repo_number to GitHub." >> "$REPORT" + echo "Repo #$repo_number $repo_name: Push Failed" >> "$SMS_REPORT" fi fi return 0 else - echo "Failed to create GitHub repository $repo_name" >> "$REPORT" - echo "Repo $repo_name: GCF (GitHub Repo Creation Failed)" >> "$SMS_REPORT" + echo "Failed to create GitHub repository #$repo_number: $repo_name" >> "$REPORT" + echo "Repo #$repo_number $repo_name: GCF (GitHub Repo Creation Failed)" >> "$SMS_REPORT" return 1 fi } @@ -135,16 +153,16 @@ update_repo() { local repo_number="$2" cd "$repo_dir" || return 1 - echo "Processing repository $repo_number located at $repo_dir" >> "$REPORT" + echo "Processing repository #$repo_number located at $repo_dir" >> "$REPORT" local github_exists=true if ! check_github_remote; then - echo "No valid GitHub repository found for repo $repo_number." >> "$REPORT" + echo "No valid GitHub repository found for repo #$repo_number." >> "$REPORT" github_exists=false if check_wifi; then repo_name=$(basename "$repo_dir") - create_github_repo "$repo_name" "$repo_dir" + create_github_repo "$repo_name" "$repo_dir" "$repo_number" github_exists=true fi fi @@ -152,20 +170,20 @@ update_repo() { if [ "$github_exists" = true ]; then git fetch origin &>/dev/null if ! git merge origin/main --no-commit --no-ff; then - echo "Merge conflict detected in repo $repo_number" >> "$REPORT" - echo "Repo $repo_number: MC" >> "$SMS_REPORT" + echo "Merge conflict detected in repo #$repo_number" >> "$REPORT" + echo "Repo #$repo_number: MC" >> "$SMS_REPORT" git merge --abort return 1 fi fi if git diff-index --quiet HEAD --; then - echo "No changes detected in repo $repo_number" >> "$REPORT" + echo "No changes detected in repo #$repo_number" >> "$REPORT" if [ "$github_exists" = false ]; then - echo "Repo $repo_number: NC-GDE" >> "$SMS_REPORT" + echo "Repo #$repo_number: NC-GDE" >> "$SMS_REPORT" else - echo "Repo $repo_number: NC-GE" >> "$SMS_REPORT" + echo "Repo #$repo_number: NC-GE" >> "$SMS_REPORT" fi return 0 @@ -175,25 +193,25 @@ update_repo() { git commit -m "Automated update" if [ "$github_exists" = false ]; then - echo "No GitHub repository available for repo $repo_number. Committing locally..." >> "$REPORT" - echo "Repo $repo_number: lc-ngr" >> "$SMS_REPORT" + echo "No GitHub repository available for repo #$repo_number. Committing locally..." >> "$REPORT" + echo "Repo #$repo_number: lc-ngr" >> "$SMS_REPORT" return 0 fi if check_wifi; then - echo "Internet is available. Attempting to push changes..." >> "$REPORT" + echo "Internet is available. Attempting to push changes for repo #$repo_number..." >> "$REPORT" if ! git push origin main; then - echo "Failed to push changes in repo $repo_number" >> "$REPORT" - echo "Repo $repo_number: PF" >> "$SMS_REPORT" + echo "Failed to push changes in repo #$repo_number" >> "$REPORT" + echo "Repo #$repo_number: PF" >> "$SMS_REPORT" return 1 else - echo "Changes pushed successfully in repo $repo_number" >> "$REPORT" - echo "Repo $repo_number: P" >> "$SMS_REPORT" + echo "Changes pushed successfully in repo #$repo_number" >> "$REPORT" + echo "Repo #$repo_number: P" >> "$SMS_REPORT" fi else - echo "No internet connection. Changes committed locally in repo $repo_number" >> "$REPORT" - echo "Repo $repo_number: LC" >> "$SMS_REPORT" + echo "No internet connection. Changes committed locally in repo #$repo_number" >> "$REPORT" + echo "Repo #$repo_number: LC" >> "$SMS_REPORT" fi } @@ -217,6 +235,7 @@ total_repos=${#repo_dirs[@]} # Loop through each valid directory repo_number=1 for repo_dir in "${repo_dirs[@]}"; do + echo "Updating repository #$repo_number: $repo_dir" update_repo "$repo_dir" "$repo_number" case "$(tail -n 1 "$SMS_REPORT")" in *P) pushed_count=$((pushed_count + 1)) ;; diff --git a/another_clone_updated.bak b/tests/backups/another_clone_updated.bak similarity index 100% rename from another_clone_updated.bak rename to tests/backups/another_clone_updated.bak diff --git a/auto_git_update.sh.1.bak b/tests/backups/auto_git_update.sh.1.bak similarity index 100% rename from auto_git_update.sh.1.bak rename to tests/backups/auto_git_update.sh.1.bak diff --git a/tests/backups/auto_git_update.sh.bak b/tests/backups/auto_git_update.sh.bak new file mode 100755 index 0000000..45cc0af --- /dev/null +++ b/tests/backups/auto_git_update.sh.bak @@ -0,0 +1,269 @@ +#!/usr/bin/env bash + +# Check if required commands are available +for cmd in git nmcli msmtp ssh scp gh; do + if ! command -v "$cmd" &>/dev/null; then + echo "$cmd is required but not installed. Exiting." + exit 1 + fi +done + +# Configuration +TXT_FILE="/home/klein/.config/setup/autogitupdate.txt" +PHONE_NUMBER="2673479614@vtext.com" # Verizon SMS gateway +EMAIL="kleinpanic@gmail.com" +SUBJECT="G-U-R" +REPORT="/tmp/git_update_report.txt" # Full detailed report +SMS_REPORT="/tmp/git_update_sms.txt" # Minimal SMS summary +SSH_HOST="eulerpi5" # Alias for the SSH connection +SSH_DIR="/home/klein/reports" # Remote directory to store the report +SMS_CHAR_LIMIT=160 # Character limit for SMS messages + +# Ensure the report files exist and have the correct permissions +ensure_file() { + local file="$1" + local permissions="$2" + [ ! -f "$file" ] && touch "$file" && chmod "$permissions" "$file" + chmod "$permissions" "$file" +} + +ensure_file "$REPORT" 600 +ensure_file "$SMS_REPORT" 600 + +# Function to check WiFi connection and internet availability +check_wifi() { + nmcli -t -f ACTIVE,SSID dev wifi | grep -q "^yes" && ping -c 1 8.8.8.8 &>/dev/null + return $? +} + +get_repo_dirs() { + local valid_dirs=() + + echo "Reading directories from $TXT_FILE..." # Debugging line + + while IFS= read -r repo_dir; do + # Trim whitespace and skip empty lines + repo_dir=$(echo "$repo_dir" | xargs) + [ -z "$repo_dir" ] && continue + + echo "Processing: '$repo_dir'" # Debugging line to show each line being processed + + # Check if the directory is valid and contains a .git folder + if [ -d "$repo_dir" ] && [ -d "$repo_dir/.git" ]; then + echo "Valid Git repository found: '$repo_dir'" # Debugging line + valid_dirs+=("$repo_dir") + else + echo "Invalid directory or not a Git repository: '$repo_dir'" # Debugging line + fi + done < "$TXT_FILE" + + echo "Valid directories: ${valid_dirs[@]}" # Final debug line showing valid directories + echo "${valid_dirs[@]}" +} + +# Function to create GitHub repo if it doesn't exist and push changes +create_github_repo() { + local repo_name="$1" + local repo_dir="$2" + echo "Attempting to create GitHub repo for repo $repo_name" >> "$REPORT" + + # Use GitHub CLI to create the repo + if gh repo create "$repo_name" --public --source="$repo_dir" --remote=origin --push; then + echo "Successfully created GitHub repository $repo_name" >> "$REPORT" + echo "Repo $repo_name: GHS (GitHub Repo Created Successfully)" >> "$SMS_REPORT" + + # Check if the repository has existing commits + if [ -d "$repo_dir/.git" ] && [ "$(git -C "$repo_dir" rev-parse HEAD)" ]; then + echo "Repository has existing commits. Attempting to add remote and push." >> "$REPORT" + + # Add the GitHub remote if not already added + git remote add origin "git@github.com:kleinpanic/$repo_name.git" 2>/dev/null || true + + # Set the main branch if necessary + git branch -M main + + # Push to GitHub + if git push -u origin main; then + echo "Existing repository pushed successfully to GitHub." >> "$REPORT" + echo "Repo $repo_name: Pushed Successfully" >> "$SMS_REPORT" + else + echo "Failed to push the existing repository to GitHub." >> "$REPORT" + echo "Repo $repo_name: Push Failed" >> "$SMS_REPORT" + fi + fi + return 0 + else + echo "Failed to create GitHub repository $repo_name" >> "$REPORT" + echo "Repo $repo_name: GCF (GitHub Repo Creation Failed)" >> "$SMS_REPORT" + return 1 + fi +} + +# Function to check if a remote GitHub origin exists +check_github_remote() { + if ! git remote get-url origin &>/dev/null; then + echo "No 'origin' remote found." >> "$REPORT" + return 1 + fi + + local remote_url + remote_url=$(git remote get-url origin) + if [[ "$remote_url" != *github.com* ]]; then + echo "'origin' remote does not point to GitHub." >> "$REPORT" + return 1 + fi + + local repo_name + repo_name=$(basename "$remote_url" .git) + local repo_owner + repo_owner=$(basename "$(dirname "$remote_url")") + local full_repo_name="$repo_owner/$repo_name" + + echo "Checking if GitHub repository '$full_repo_name' exists..." >> "$REPORT" + + if ! gh repo view "$full_repo_name" &>/dev/null; then + echo "GitHub repository '$full_repo_name' does not exist or is not accessible." >> "$REPORT" + return 1 + fi + + return 0 +} + +# Function to update, commit, and push the changes +update_repo() { + local repo_dir="$1" + local repo_number="$2" + cd "$repo_dir" || return 1 + + echo "Processing repository $repo_number located at $repo_dir" >> "$REPORT" + + local github_exists=true + if ! check_github_remote; then + echo "No valid GitHub repository found for repo $repo_number." >> "$REPORT" + github_exists=false + + if check_wifi; then + repo_name=$(basename "$repo_dir") + create_github_repo "$repo_name" "$repo_dir" + github_exists=true + fi + fi + + if [ "$github_exists" = true ]; then + git fetch origin &>/dev/null + if ! git merge origin/main --no-commit --no-ff; then + echo "Merge conflict detected in repo $repo_number" >> "$REPORT" + echo "Repo $repo_number: MC" >> "$SMS_REPORT" + git merge --abort + return 1 + fi + fi + + if git diff-index --quiet HEAD --; then + echo "No changes detected in repo $repo_number" >> "$REPORT" + + if [ "$github_exists" = false ]; then + echo "Repo $repo_number: NC-GDE" >> "$SMS_REPORT" + else + echo "Repo $repo_number: NC-GE" >> "$SMS_REPORT" + fi + + return 0 + fi + + git add -A + git commit -m "Automated update" + + if [ "$github_exists" = false ]; then + echo "No GitHub repository available for repo $repo_number. Committing locally..." >> "$REPORT" + echo "Repo $repo_number: lc-ngr" >> "$SMS_REPORT" + return 0 + fi + + if check_wifi; then + echo "Internet is available. Attempting to push changes..." >> "$REPORT" + + if ! git push origin main; then + echo "Failed to push changes in repo $repo_number" >> "$REPORT" + echo "Repo $repo_number: PF" >> "$SMS_REPORT" + return 1 + else + echo "Changes pushed successfully in repo $repo_number" >> "$REPORT" + echo "Repo $repo_number: P" >> "$SMS_REPORT" + fi + else + echo "No internet connection. Changes committed locally in repo $repo_number" >> "$REPORT" + echo "Repo $repo_number: LC" >> "$SMS_REPORT" + fi +} + +# Start of the script +echo "Starting auto git update script on $(date)" > "$REPORT" +echo "(G-R), $(date)" > "$SMS_REPORT" + +# Fetch valid repositories +repo_dirs=($(get_repo_dirs)) + +# Counters for SMS summary report +pushed_count=0 +no_change_count=0 +local_commit_count=0 +conflict_count=0 +error_count=0 +created_count=0 +no_github_repo_count=0 +total_repos=${#repo_dirs[@]} + +# Loop through each valid directory +repo_number=1 +for repo_dir in "${repo_dirs[@]}"; do + update_repo "$repo_dir" "$repo_number" + case "$(tail -n 1 "$SMS_REPORT")" in + *P) pushed_count=$((pushed_count + 1)) ;; + *NC*) no_change_count=$((no_change_count + 1)) ;; + *LC) local_commit_count=$((local_commit_count + 1)) ;; + *MC) conflict_count=$((conflict_count + 1)) ;; + *PF) error_count=$((error_count + 1)) ;; + *lc-ngr*) no_github_repo_count=$((no_github_repo_count + 1)) ;; + *GHS) created_count=$((created_count + 1)) ;; + esac + repo_number=$((repo_number + 1)) +done + +# Check if the detailed SMS report exceeds the SMS character limit +sms_detailed_content=$(cat "$SMS_REPORT") +if [ "${#sms_detailed_content}" -gt "$SMS_CHAR_LIMIT" ]; then + sms_summary="Pushed: $pushed_count/$total_repos, No Change: $no_change_count/$total_repos, Locally Committed: $local_commit_count/$total_repos, Conflicts: $conflict_count/$total_repos, Errors: $error_count/$total_repos, No GitHub Repo: $no_github_repo_count/$total_repos, Created: $created_count/$total_repos" + echo "$sms_summary" > "$SMS_REPORT" +fi + +send_text() { + /usr/bin/msmtp -a default -t < "$output_file" + +# Loop through all directories inside ~/codeWS +for dir in ~/codeWS/*; do + # Check if it is a directory + if [ -d "$dir" ]; then + # Loop through the second level of directories + for subdir in "$dir"/*; do + # Check if it is a directory + if [ -d "$subdir" ]; then + # Print the path relative to ~/codeWS and append to the file + echo "${subdir/#$HOME/}" >> "$output_file" + fi + done + fi +done + +echo "Directory paths have been saved to $output_file." diff --git a/testgit.sh b/tests/testgit.sh similarity index 100% rename from testgit.sh rename to tests/testgit.sh