aboutsummaryrefslogtreecommitdiff
path: root/justfile
diff options
context:
space:
mode:
authorSam Scholten2025-10-24 15:27:43 +1000
committerSam Scholten2025-10-24 15:27:50 +1000
commit37617899489b3f141752ca0666ce2e8a600db1ae (patch)
tree669c5d17d2bcaec642f2786476924433c980cbfb /justfile
downloadusync-37617899489b3f141752ca0666ce2e8a600db1ae.tar.gz
usync-37617899489b3f141752ca0666ce2e8a600db1ae.zip
v0.1.0 - Initial release
add logo
Diffstat (limited to 'justfile')
-rw-r--r--justfile72
1 files changed, 72 insertions, 0 deletions
diff --git a/justfile b/justfile
new file mode 100644
index 0000000..84b9380
--- /dev/null
+++ b/justfile
@@ -0,0 +1,72 @@
+# Path synchronization - Core recipes
+
+# CONFIGURE THESE FOR YOUR SETUP:
+SOURCE := "/path/to/source" # Primary location (source for cloud backup)
+TARGET := "/path/to/target" # Secondary location
+
+# Cloud backup configuration
+CLOUD_REMOTE := "your-cloud-remote" # Any rclone remote
+CLOUD_PATH := "/usync" # Path in cloud storage
+CLOUD_MOUNT_PATH := "~/cloud-mount" # Local mount point (default: home directory)
+
+# Install dependencies for openSUSE
+install-deps:
+ sudo zypper install -y rclone unison
+
+# Fast sync between paths (unison)
+sync-paths:
+ unison -ui text paths
+
+# Slow sync to cloud storage (from source)
+sync-cloud: check-rclone mount-cloud
+ rclone sync -P --checkers 32 --transfers 32 --buffer-size 128M --retries 3 --order-by 'size,ascending' {{SOURCE}}/usync {{CLOUD_REMOTE}}:{{CLOUD_PATH}}
+ just unmount-cloud
+
+# Dry run to cloud (safety check)
+sync-cloud-dry: check-rclone mount-cloud
+ rclone sync -P --checkers 32 --transfers 32 --buffer-size 128M --retries 3 --order-by 'size,ascending' --dry-run {{SOURCE}}/usync {{CLOUD_REMOTE}}:{{CLOUD_PATH}}
+ just unmount-cloud
+
+# Mount management (uses configurable mount point)
+mount-cloud:
+ @mountpoint {{CLOUD_MOUNT_PATH}} 2>/dev/null && echo "Cloud storage already mounted" || (mkdir -p {{CLOUD_MOUNT_PATH}} && rclone mount {{CLOUD_REMOTE}}: --vfs-cache-mode full --daemon {{CLOUD_MOUNT_PATH}} && echo "✓ Cloud storage mounted at {{CLOUD_MOUNT_PATH}}")
+
+unmount-cloud:
+ fusermount -u {{CLOUD_MOUNT_PATH}}
+
+# Verify rclone remote exists
+check-rclone:
+ @rclone config show {{CLOUD_REMOTE}} >/dev/null 2>&1 || (echo "Error: rclone remote '{{CLOUD_REMOTE}}' not found. Run 'rclone config' first." && exit 1)
+ @echo "✓ rclone remote '{{CLOUD_REMOTE}}' configured"
+
+# Verify both paths are accessible
+check:
+ @test -d {{SOURCE}} || (echo "Source path not found: {{SOURCE}}" && exit 1)
+ @test -d {{TARGET}} || (echo "Target path not found: {{TARGET}}" && exit 1)
+ @echo "✓ Both paths accessible"
+ @test -w {{SOURCE}} || (echo "Source path not writable" && exit 1)
+ @test -w {{TARGET}} || (echo "Target path not writable" && exit 1)
+ @echo "✓ Both paths writable"
+
+# Create usync directories if they don't exist
+setup:
+ @mkdir -p {{SOURCE}}/usync {{TARGET}}/usync
+ @echo "✓ Usync directories created"
+ @just create-unison-profile
+
+# Create unison profile for non-interactive syncing
+create-unison-profile:
+ @mkdir -p ~/.unison
+ @sed -e "s|TEMPLATE_SOURCE|{{SOURCE}}|g" -e "s|TEMPLATE_TARGET|{{TARGET}}|g" -e "s|TEMPLATE_HOME_DIR|$(echo $HOME)|g" unison-profile.prf > ~/.unison/paths.prf
+ @echo "✓ Unison profile created at ~/.unison/paths.prf"
+
+# Status check (default)
+status:
+ @echo "=== Path Status ==="
+ @echo "Source path: $(test -d {{SOURCE}}/usync && echo "$(ls -1 {{SOURCE}}/usync/ 2>/dev/null | wc -l) folders, $(du -sh {{SOURCE}}/usync 2>/dev/null | cut -f1)" || echo "missing")"
+ @echo "Target path: $(test -d {{TARGET}}/usync && echo "$(ls -1 {{TARGET}}/usync/ 2>/dev/null | wc -l) folders, $(du -sh {{TARGET}}/usync 2>/dev/null | cut -f1)" || echo "missing")"
+ @echo "Cloud storage ({{CLOUD_REMOTE}}): $(mountpoint {{CLOUD_MOUNT_PATH}} >/dev/null 2>&1 && echo "mounted" || echo "not mounted")"
+ @echo "Unison profile: $(test -f ~/.unison/paths.prf && echo "exists" || echo "missing")"
+
+default:
+ just status \ No newline at end of file