From c066383e8a9edf2dd26cf32c491e7b2ec63e29fc Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sat, 1 Apr 2023 20:28:32 +1100 Subject: [PATCH] Check remote for latest post Fixes #2 --- Cargo.lock | 6 +++--- Cargo.toml | 6 +++--- src/main.rs | 40 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e83bfe..2defc8c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -75,9 +75,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.23" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ "iana-time-zone", "js-sys", @@ -426,7 +426,7 @@ dependencies = [ [[package]] name = "soyuz-cli" -version = "1.0.0" +version = "1.0.1" dependencies = [ "chrono", "expanduser", diff --git a/Cargo.toml b/Cargo.toml index ae625f8..0f40d74 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "soyuz-cli" -version = "1.0.0" +version = "1.0.1" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -chrono = "0.4.23" +chrono = "0.4.24" expanduser = "1.2.2" regex = "1.7.1" serde = { version = "1.0.152", features = ["derive"] } -toml = { version = "0.7.2", features = ["parse"] } \ No newline at end of file +toml = { version = "0.7.2", features = ["parse"] } diff --git a/src/main.rs b/src/main.rs index 719bf27..5d7e1de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,7 @@ use std::path::PathBuf; use regex::Regex; use serde::Deserialize; use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; use toml; #[derive(Debug, Deserialize)] @@ -280,13 +280,47 @@ fn sync(args: &Vec) -> Result<(), Box> { } fn write() -> Result<(), Box> { + println!("Checking server for latest post..."); let config = read_config()?; let dt = Local::now(); let year = &dt.format("%Y").to_string(); - let local_dir: std::path::PathBuf = expanduser(config.local_dir)?; + let local_dir: std::path::PathBuf = expanduser(&config.local_dir)?; + let remote_dir: std::path::PathBuf = expanduser(&config.remote_dir)?; fs::create_dir_all(format!("{}{}", &local_dir.display(), &year))?; let filepath = format!("{}{}/{}.gmi", local_dir.display(), year, dt.format("%Y-%m-%d")); - Ok(open_file(filepath.into())) + let spath = format!("{}", remote_dir.display()); + let remote_vec = spath.split(':').collect::>(); + let server_name = remote_vec[0]; + let server_path = remote_vec[1]; + let remote_filepath = format!("{}{}/{}.gmi", server_path, year, dt.format("%Y-%m-%d")); + let cmd = format!("[[ -f {} ]] && echo 'true' || echo 'false';", &remote_filepath); + let check = Command::new("ssh") + .args(["-q", &server_name, &cmd]) + .stdout(Stdio::piped()) + .spawn() + .expect("reading from server failed"); + let output = check + .wait_with_output() + .expect("something fucked up"); + let out = std::str::from_utf8(&output.stdout); + let out2 = out.clone()?.trim(); + match out?.trim() { + "true" => { + // user has already published today + println!("\x1B[1;31mYou have already published today!\x1B[0m"); + println!("To edit your post, run 'sync down' first."); + Ok(()) + }, + "false" => { + // open a new file + Ok(open_file(filepath.into())) + }, + _ => { + println!("Something went wrong checking your gemini server"); + println!("Error: {:?}", out2); + Ok(()) + } + } } fn match_single_arg(args: &Vec) -> Result<(), Box> {