#!/bin/sh # Auto workflow script for git push with content/ directory handling # Usage: ppts # Automatically: git add ., commit without content/, push to origin, then add content/ and push to home # Always cd to THESIAH repository THESIAH_REPO="${THESIAH_WWW:-${HOME}/Private/repos/THESIAH}" if [ ! -d "$THESIAH_REPO" ]; then echo "Error: THESIAH repository not found at $THESIAH_REPO" exit 1 fi cd "$THESIAH_REPO" || exit 1 # Verify this is the correct git repository if ! git rev-parse --git-dir >/dev/null 2>&1; then echo "Error: Not a git repository at $THESIAH_REPO" exit 1 fi # If no arguments, run auto workflow if [ -z "$1" ]; then echo "Running auto workflow..." # Step 0: Stage all changes first echo "Step 0: Staging all changes..." git add . # Check if there are any changes to commit if git diff --quiet && git diff --cached --quiet; then echo "No changes to commit" exit 0 fi # Step 1: Unstage content/ from staging echo "Step 1: Excluding content/ from staging..." git reset content/ 2>/dev/null || true # Check if there are changes to commit (excluding content/) has_changes_without_content=false if ! git diff --cached --quiet; then has_changes_without_content=true fi # Check if content/ has changes has_content_changes=false if [ -d "content/" ]; then # Check for untracked files in content/ if [ -n "$(git ls-files --others --exclude-standard content/ 2>/dev/null)" ]; then has_content_changes=true fi # Check for modified tracked files in content/ if ! git diff --quiet content/ 2>/dev/null; then has_content_changes=true fi # Check for staged changes in content/ if ! git diff --cached --quiet content/ 2>/dev/null; then has_content_changes=true fi fi # Step 2: Commit without content/ if there are changes if [ "$has_changes_without_content" = true ]; then echo "Step 2: Committing changes (without content/)..." git commit -m "Update (without content/)" || exit 1 # Step 3: Push to origin (without content/) echo "Step 3: Pushing to origin (without content/)..." # Temporarily disable pre-push hook since we already excluded content/ hook_disabled=false if [ -f .git/hooks/pre-push ]; then mv .git/hooks/pre-push .git/hooks/pre-push.disabled hook_disabled=true fi # Try normal push first if git push origin master 2>/dev/null; then # Push succeeded : else # Push failed, try force push (origin may have diverged) echo "Warning: Origin has diverged, using force push..." git push origin master --force || { # Restore hook if push failed if [ "$hook_disabled" = true ] && [ -f .git/hooks/pre-push.disabled ]; then mv .git/hooks/pre-push.disabled .git/hooks/pre-push fi exit 1 } fi # Restore hook after successful push if [ "$hook_disabled" = true ] && [ -f .git/hooks/pre-push.disabled ]; then mv .git/hooks/pre-push.disabled .git/hooks/pre-push fi echo "✓ Pushed to origin (without content/)" else echo "No changes to commit (excluding content/)" fi # Step 4: Add and commit content/ if there are changes if [ "$has_content_changes" = true ]; then echo "Step 4: Adding content/..." git add content/ echo "Step 5: Committing content/..." git commit -m "Update content/" || exit 1 # Step 6: Push to home (with content/)" echo "Step 6: Pushing to home (with content/)..." git push home master || exit 1 echo "✓ Pushed to home (with content/)" else echo "No content/ changes to commit" fi echo "Auto workflow completed!" exit 0 fi # If arguments provided, show usage echo "Usage: ppts" echo " Run without arguments to execute auto workflow" exit 1