1
1
mirror of https://github.com/wez/wezterm.git synced 2024-11-24 07:46:59 +03:00

improve handling of deleted config files in the reloader

The NoticeXXX variants are emitted at the trigger point, but
we should wait for the debounced XXX variants instead.  We
were doing this for write but not for delete.  This should
improve the chances that we'll pick up a new version of a
config file.
This commit is contained in:
Wez Furlong 2019-12-04 20:33:54 -08:00
parent 598c2d8c26
commit 66861ff8f7

View File

@ -16,6 +16,7 @@ use std::fs;
use std::io::prelude::*; use std::io::prelude::*;
use std::path::PathBuf; use std::path::PathBuf;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::time::Duration;
use term; use term;
use termwiz::hyperlink; use termwiz::hyperlink;
use termwiz::input::{KeyCode, Modifiers}; use termwiz::input::{KeyCode, Modifiers};
@ -89,7 +90,7 @@ impl ConfigInner {
fn watch_path(&mut self, path: PathBuf) { fn watch_path(&mut self, path: PathBuf) {
if self.watcher.is_none() { if self.watcher.is_none() {
let (tx, rx) = std::sync::mpsc::channel(); let (tx, rx) = std::sync::mpsc::channel();
let watcher = notify::watcher(tx, std::time::Duration::from_millis(200)).unwrap(); let watcher = notify::watcher(tx, Duration::from_millis(200)).unwrap();
std::thread::spawn(move || { std::thread::spawn(move || {
// block until we get an event // block until we get an event
use notify::DebouncedEvent; use notify::DebouncedEvent;
@ -99,8 +100,13 @@ impl ConfigInner {
// Defer acting until `Write`, otherwise we'll // Defer acting until `Write`, otherwise we'll
// reload twice in quick succession // reload twice in quick succession
DebouncedEvent::NoticeWrite(_) => None, DebouncedEvent::NoticeWrite(_) => None,
DebouncedEvent::NoticeRemove(path) // Likewise, defer processing a remove until after
| DebouncedEvent::Create(path) // we've debounced the event. That will give us
// time to pick up the new version of the config if
// the user's editor removes the file before writing
// out a new version.
DebouncedEvent::NoticeRemove(_) => None,
DebouncedEvent::Create(path)
| DebouncedEvent::Write(path) | DebouncedEvent::Write(path)
| DebouncedEvent::Chmod(path) | DebouncedEvent::Chmod(path)
| DebouncedEvent::Remove(path) | DebouncedEvent::Remove(path)