diff --git a/daily_backup.ps1 b/daily_backup.ps1 new file mode 100644 index 00000000..45faadac --- /dev/null +++ b/daily_backup.ps1 @@ -0,0 +1,90 @@ +# 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 ==="