# Daily Backup Script for niggers workspace $ErrorActionPreference = "Continue" $Workspace = "V:\smalldata\niggers" $LogFile = "$Workspace\daily_backup.log" Function Log-Message($msg) { $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" "$timestamp - $msg" | Out-File -FilePath $LogFile -Append -Encoding UTF8 Write-Output "$timestamp - $msg" } Log-Message "=== Starting Daily Backup ===" if (-not (Test-Path $Workspace)) { Log-Message "ERROR: Workspace directory $Workspace is not accessible." exit 1 } Set-Location $Workspace # 1. Regenerate structure manifest & tree summary Log-Message "Updating folder structure manifest and tree summary..." try { python "$Workspace\generate_manifest.py" 2>&1 | Out-File -FilePath $LogFile -Append -Encoding UTF8 } catch { Log-Message "WARNING: generate_manifest.py failed: $_" } # 2. Add safe directory git config --global --add safe.directory * 2>$null # 3. Stage changes Log-Message "Staging modified/new files..." $stagePy = @" import os, subprocess, tempfile root = r'V:\smalldata\niggers' target_exts = {'.py', '.txt', '.json', '.md', '.sh', '.bat', '.ps1', '.csv', '.log'} excluded_dirs = {'.git', '__pycache__', '.omo'} all_target = [] for dirpath, dirnames, filenames in os.walk(root): dirnames[:] = [d for d in dirnames if d not in excluded_dirs] for f in filenames: if f == 'daily_backup.log': continue ext = os.path.splitext(f)[1].lower() if ext in target_exts: full = os.path.join(dirpath, f) rel = os.path.relpath(full, root).replace('\\', '/') all_target.append(rel) with tempfile.NamedTemporaryFile('w', delete=False, encoding='utf-8') as tf: tf.write('\n'.join(all_target) + '\n') tmp_path = tf.name try: subprocess.run(['git', 'add', f'--pathspec-from-file={tmp_path}'], cwd=root) finally: if os.path.exists(tmp_path): os.remove(tmp_path) "@ python -c $stagePy 2>&1 | Out-File -FilePath $LogFile -Append -Encoding UTF8 # 4. Check if there are changes staged $status = (git status --porcelain=v1) if (-not $status) { Log-Message "No changes to commit. Backup is up-to-date." Log-Message "=== Daily Backup Completed ===" exit 0 } # 5. Commit changes $commitDate = Get-Date -Format "yyyy-MM-dd HH:mm" Log-Message "Committing changes..." git commit -m "Automated daily backup: $commitDate" 2>&1 | Out-File -FilePath $LogFile -Append -Encoding UTF8 # 6. Push to Gitea Log-Message "Pushing to Gitea..." git push origin main 2>&1 | Out-File -FilePath $LogFile -Append -Encoding UTF8 if ($LASTEXITCODE -eq 0) { Log-Message "SUCCESS: Pushed daily backup to Gitea." } else { Log-Message "ERROR: Failed to push to Gitea (Exit code: $LASTEXITCODE)." } Log-Message "=== Daily Backup Completed ==="