pub struct GitWatcher { /* private fields */ }Expand description
A git watcher for detecting git repository state changes.
Uses the notify crate internally to watch the .git directory
for changes. Provides a non-blocking interface suitable for use
in TUI event loops.
This is useful for caching git statistics and only recomputing them when the git state actually changes, rather than polling at a fixed interval.
Implementations§
Source§impl GitWatcher
impl GitWatcher
Source§impl GitWatcher
impl GitWatcher
Sourcepub fn with_config(config: GitWatchConfig) -> Result<Self, Error>
pub fn with_config(config: GitWatchConfig) -> Result<Self, Error>
Create a new git watcher with custom configuration.
§Arguments
config- Configuration for the watcher.
§Errors
Returns a notify::Error if the watcher cannot be created.
§Example
use ratatui_toolkit::services::git_watcher::{GitWatcher, GitWatchConfig};
let config = GitWatchConfig::new()
.debounce_ms(200);
let watcher = GitWatcher::with_config(config).unwrap();Source§impl GitWatcher
impl GitWatcher
Sourcepub fn check_for_changes(&mut self) -> bool
pub fn check_for_changes(&mut self) -> bool
Check if there are any pending git state changes.
This is a non-blocking operation that returns true if any
relevant git changes have been detected since the last check.
§Returns
true if git changes were detected, false otherwise.
§Example
use ratatui_toolkit::services::git_watcher::GitWatcher;
use std::path::Path;
let mut watcher = GitWatcher::new().unwrap();
watcher.watch(Path::new("/path/to/repo")).unwrap();
// In your event loop:
if watcher.check_for_changes() {
println!("Git state changed, recompute stats!");
}Sourcepub fn has_pending_changes(&self) -> bool
pub fn has_pending_changes(&self) -> bool
Check if there are pending changes without consuming them.
This is useful when you want to know if there are changes but don’t want to reset the flag yet.
§Returns
true if git changes are pending, false otherwise.
Source§impl GitWatcher
impl GitWatcher
Sourcepub fn drain_events(&mut self)
pub fn drain_events(&mut self)
Drain all pending events without processing them.
This clears the event queue and resets the pending changes flag, useful when you want to ignore accumulated changes (e.g., after a batch operation).
§Example
use ratatui_toolkit::services::git_watcher::GitWatcher;
use std::path::Path;
let mut watcher = GitWatcher::new().unwrap();
watcher.watch(Path::new("/path/to/repo")).unwrap();
// After some operation that causes many changes:
watcher.drain_events();Source§impl GitWatcher
impl GitWatcher
Sourcepub fn unwatch(&mut self, repo_path: &Path) -> Result<(), Error>
pub fn unwatch(&mut self, repo_path: &Path) -> Result<(), Error>
Stop watching a git repository.
§Arguments
repo_path- Path to the repository root (where.gitis located).
§Errors
Returns a notify::Error if the path cannot be unwatched.
§Example
use ratatui_toolkit::services::git_watcher::GitWatcher;
use std::path::Path;
let mut watcher = GitWatcher::new().unwrap();
let path = Path::new("/path/to/repo");
watcher.watch(path).unwrap();
// Later...
watcher.unwatch(path).unwrap();Source§impl GitWatcher
impl GitWatcher
Sourcepub fn watch(&mut self, repo_path: &Path) -> Result<(), Error>
pub fn watch(&mut self, repo_path: &Path) -> Result<(), Error>
Start watching a git repository for changes.
Watches the .git directory recursively to detect any changes
to the repository state (commits, staging, branches, etc.).
§Arguments
repo_path- Path to the repository root (where.gitis located).
§Errors
Returns a notify::Error if the path cannot be watched or
if the .git directory doesn’t exist.
§Example
use ratatui_toolkit::services::git_watcher::GitWatcher;
use std::path::Path;
let mut watcher = GitWatcher::new().unwrap();
watcher.watch(Path::new("/path/to/repo")).unwrap();Trait Implementations§
Auto Trait Implementations§
impl Freeze for GitWatcher
impl RefUnwindSafe for GitWatcher
impl Send for GitWatcher
impl !Sync for GitWatcher
impl Unpin for GitWatcher
impl UnwindSafe for GitWatcher
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more