bug removed: now works with text editors

pull/9/head
prplV 2024-08-21 17:00:04 +03:00
parent 99b8ed32e5
commit 9ec2375a4e
3 changed files with 66 additions and 29 deletions

24
Cargo.lock generated
View File

@ -137,9 +137,9 @@ checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"
[[package]]
name = "cc"
version = "1.1.11"
version = "1.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fb8dd288a69fc53a1996d7ecfbf4a20d59065bff137ce7e56bbd620de191189"
checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48"
dependencies = [
"shlex",
]
@ -320,9 +320,9 @@ dependencies = [
[[package]]
name = "libc"
version = "0.2.155"
version = "0.2.158"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
[[package]]
name = "lock_api"
@ -531,18 +531,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "serde"
version = "1.0.207"
version = "1.0.208"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5665e14a49a4ea1b91029ba7d3bca9f299e1f7cfa194388ccc20f14743e784f2"
checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.207"
version = "1.0.208"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6aea2634c86b0e8ef2cfdc0c340baede54ec27b1e46febd7f80dffb2aa44a00e"
checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf"
dependencies = [
"proc-macro2",
"quote",
@ -600,9 +600,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.74"
version = "2.0.75"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7"
checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9"
dependencies = [
"proc-macro2",
"quote",
@ -626,9 +626,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
version = "1.39.2"
version = "1.39.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1"
checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5"
dependencies = [
"backtrace",
"bytes",

View File

@ -16,7 +16,7 @@
}
},
{
"filename": "config-file",
"filename": "config-file.json",
"src": "/home/vladislav/web/",
"triggers": {
"onDelete": "stop",

View File

@ -9,6 +9,7 @@ use tokio::join;
// use tokio::io::{AsyncRead, AsyncWrite};
// fatal errors handler
use core::panic;
use std::borrow::BorrowMut;
// utils
use std::fmt::Debug;
use std::fs;
@ -16,7 +17,7 @@ use std::path::Path;
use std::process::{ Command, Output };
use std::sync::Arc;
// file change handler
use inotify::{ Inotify, WatchMask };
use inotify::{ EventMask, Inotify, WatchMask };
// logging
use std::io::Write;
use chrono::Local;
@ -350,8 +351,25 @@ async fn create_watcher(filename: &str, path: &str) -> Result<Inotify, std::io::
.watches()
.add(
&src,
WatchMask::MODIFY
WatchMask::ALL_EVENTS
);
// !
// // let _ = stream
// // .watches()
// // .add(
// // &src,
// // WatchMask::ALL_EVENTS
// // );
// while let Some(a) = stream.next().await {
// // println!("event - {:?}", a);
// if a.unwrap().mask == EventMask::MODIFY {
// counter+=1;
// println!("mod {} - {:?}", counter, stream);
// }
// }
// todo!();
// !
Ok(inotify)
}
@ -663,11 +681,29 @@ async fn file_handler
}
} else if is_active(name).await && !is_frozen(name).await{
let watchers = watchers.clone();
// println!("mutex: {:?}", watchers);
let mut buffer = [0; 128];
let mut mutex_guard = watchers.lock().await;
if let Some(notify) = mutex_guard.get_mut(i) {
let events = notify.read_events(&mut buffer);
if events.is_ok() {
// println!("{:?}", events);
if events.is_ok(){
let events: Vec<EventMask> = events.unwrap()
.into_iter()
.map(|mask| {mask.mask})
.filter(|mask| {
*mask == EventMask::MODIFY || *mask == EventMask::DELETE_SELF
})
.collect();
for event in events {
if let EventMask::DELETE_SELF = event {
// ! warning (DELETE_SELF event) !
// println!("! warning (DELETE_SELF event) !");
// * watcher recreation after dealing with file recreation mech in text editors
let mutex = notify.borrow_mut();
*mutex = create_watcher(&file.filename, &file.src).await.unwrap();
}
match file.triggers.on_change.as_str() {
"stop" => {
let _ = tx.send(7).await;
@ -686,6 +722,7 @@ async fn file_handler
}
}
}
}
tokio::task::yield_now().await;
Ok(())
}