Better poll handling and respect the watch poll flag

This commit is contained in:
Jeremy Wall 2023-08-17 17:01:29 -04:00
parent 4d33126c69
commit 38b0b6aa59
3 changed files with 36 additions and 67 deletions

55
flake.lock generated
View File

@ -31,21 +31,6 @@
"type": "github" "type": "github"
} }
}, },
"flake-utils_2": {
"locked": {
"lastModified": 1637014545,
"narHash": "sha256-26IZAc5yzlD9FlDT54io1oqG/bBoyka+FJk5guaX4x4=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "bba5dcc8e0b20ab664967ad83d24d64cb64ec4f4",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"naersk": { "naersk": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs"
@ -78,49 +63,11 @@
"type": "indirect" "type": "indirect"
} }
}, },
"nixpkgs_2": {
"locked": {
"lastModified": 1650222748,
"narHash": "sha256-AHh/goEfG5hlhIMVgGQwACbuv5Wit2ND9vrcB4QthJs=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "ba88a5afa6fff7710c17b5423ff9d721386c4164",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "nixpkgs",
"type": "github"
}
},
"root": { "root": {
"inputs": { "inputs": {
"flake-compat": "flake-compat", "flake-compat": "flake-compat",
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"naersk": "naersk", "naersk": "naersk"
"nixpkgs": "nixpkgs_2",
"rust-overlay": "rust-overlay"
}
},
"rust-overlay": {
"inputs": {
"flake-utils": "flake-utils_2",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1650162887,
"narHash": "sha256-e23LlN7NQGxrsSWNNAjyvrWlZ3kwFSav9kXbayibKWc=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "26b570500cdd7a359526524e9abad341891122a6",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
} }
} }
}, },

View File

@ -14,7 +14,7 @@
use std::path::Path; use std::path::Path;
use std::sync::mpsc::{channel, Receiver, Sender}; use std::sync::mpsc::{channel, Receiver, Sender};
use std::thread; use std::thread;
use std::time::Duration; use std::time::{Duration, Instant};
use notify::{watcher, RecursiveMode, Watcher}; use notify::{watcher, RecursiveMode, Watcher};
@ -67,24 +67,45 @@ fn watch_for_change_events(
println!("Spawning command"); println!("Spawning command");
exec.spawn().expect("Failed to start command"); exec.spawn().expect("Failed to start command");
println!("Starting watch loop"); println!("Starting watch loop");
let mut poll_time = Instant::now();
let mut changed = false;
println!("Waiting for first change event");
let _ = ch.recv().expect("Channel was closed!!!");
loop { loop {
// Wait our requisit number of seconds // Wait our requisit number of seconds
if let Some(poll) = poll { if let Some(poll) = poll {
thread::sleep(dbg!(poll)); println!("We have a poll time {:?}", poll);
} // If our time has passed and the value has changed then run our step immediately
//if let Err(err) = exec.check() { if changed && Instant::now().duration_since(poll_time) >= poll {
// println!("Error running command! {}", err); println!(
// println!("Continuing"); "Recieved changed event and waited: {:?}",
//}; Instant::now().duration_since(poll_time)
// Default to not running the command. );
if !run_loop_step(&ch, &mut exec) { if !run_loop_step(&mut exec) {
println!("Failed to start command"); println!("Failed to start command");
}
changed = false;
continue;
}
println!("Waiting for next change event");
let _ = ch.recv().expect("Channel was closed!!!");
changed = true;
poll_time = Instant::now();
continue;
} else {
println!("We do not have a poll time");
println!("Waiting for next change event");
let _ = ch.recv().expect("Channel was closed!!!");
if !run_loop_step(&mut exec) {
println!("Failed to start command");
}
} }
poll_time = Instant::now();
changed = false;
} }
} }
fn run_loop_step(ch: &Receiver<()>, exec: &mut CancelableProcess) -> bool { fn run_loop_step(exec: &mut CancelableProcess) -> bool {
let _ = ch.recv().unwrap();
// We always want to check on our process each iteration of the loop. // We always want to check on our process each iteration of the loop.
// set signal to false so we won't trigger on the // set signal to false so we won't trigger on the
// next loop iteration unless we recieved more events. // next loop iteration unless we recieved more events.

View File

@ -48,7 +48,7 @@ fn do_flags() -> clap::ArgMatches {
.takes_value(true).help("File or directory to watch for changes"), .takes_value(true).help("File or directory to watch for changes"),
) )
.arg(arg!(--touch).name("filetouch").help("Use file or directory timestamps to monitor for changes.")) .arg(arg!(--touch).name("filetouch").help("Use file or directory timestamps to monitor for changes."))
.arg(arg!(--poll).value_parser(value_parser!(humantime::Duration)).help("Duration of time between polls"))) .arg(arg!(--poll).name("poll").takes_value(true).value_parser(value_parser!(humantime::Duration)).help("Duration of time between polls")))
.subcommand( .subcommand(
clap::Command::new("timer") clap::Command::new("timer")
.about("Run command on a timer") .about("Run command on a timer")
@ -90,6 +90,7 @@ fn main() {
Some(d) => Some((*d).into()), Some(d) => Some((*d).into()),
None => None, None => None,
}; };
println!("Enforcing a poll time of {:?}", duration);
Box::new(FileProcess::new(cmd, maybe_env, file, method, duration)) Box::new(FileProcess::new(cmd, maybe_env, file, method, duration))
} else if let Some(matches) = app.subcommand_matches("timer") { } else if let Some(matches) = app.subcommand_matches("timer") {
// TODO(jwall): This should use cancelable commands. // TODO(jwall): This should use cancelable commands.