//! Request hydration of a VFS placeholder via the desktop client. //! //! cargo run -p dr-sync-nextcloud --example hydrate -- use std::path::PathBuf; use std::time::{Duration, Instant}; use dr_sync_nextcloud::desktop_client::{hydrated_path, is_placeholder, DesktopClient}; fn main() { env_logger::init(); let Some(arg) = std::env::args().nth(1) else { eprintln!("usage: hydrate "); std::process::exit(2); }; let path = PathBuf::from(arg); let Some(client) = DesktopClient::detect() else { eprintln!("no desktop client running (expected on Android)"); std::process::exit(1); }; println!("desktop client detected"); if !is_placeholder(&path) { println!("{} is already materialised", path.display()); return; } let target = hydrated_path(&path); let before = std::fs::metadata(&path).map(|m| m.len()).unwrap_or(0); println!("stub: {} ({before} bytes)", path.display()); client.make_available_locally(&path).expect("send command"); println!("requested; polling for {}", target.display()); let start = Instant::now(); while start.elapsed() < Duration::from_secs(30) { if let Ok(m) = std::fs::metadata(&target) { println!( "hydrated: {} bytes in {:.1}s", m.len(), start.elapsed().as_secs_f64() ); return; } std::thread::sleep(Duration::from_millis(250)); } println!("timed out after 30s"); std::process::exit(1); }