Compare commits

..

1 commit

Author SHA1 Message Date
4d19f9e98f WIP: TUI actor
All checks were successful
ci/woodpecker/push/cron-docker-builder Pipeline was successful
ci/woodpecker/push/push-next Pipeline was successful
ci/woodpecker/push/tag-created Pipeline was successful
2024-08-11 19:36:45 +01:00
14 changed files with 27 additions and 133 deletions

View file

@ -18,21 +18,21 @@ jobs:
uses: actions/checkout@v4
- name: Format
uses: https://git.kemitix.net/kemitix/rust@v1.80.1-1
uses: https://git.kemitix.net/kemitix/rust@v1.80.0-2
with:
args: cargo hack fmt --feature-powerset --all -- --check
args: cargo fmt --all -- --check
- name: Clippy
uses: https://git.kemitix.net/kemitix/rust@v1.80.1-1
uses: https://git.kemitix.net/kemitix/rust@v1.80.0-2
with:
args: cargo hack clippy --feature-powerset
args: cargo clippy
- name: Build
uses: https://git.kemitix.net/kemitix/rust@v1.80.1-1
uses: https://git.kemitix.net/kemitix/rust@v1.80.0-2
with:
args: cargo hack build --feature-powerset
args: cargo build
- name: Test
uses: https://git.kemitix.net/kemitix/rust@v1.80.1-1
uses: https://git.kemitix.net/kemitix/rust@v1.80.0-2
with:
args: cargo hack test --feature-powerset
args: cargo test

View file

@ -12,7 +12,7 @@ keywords = { workspace = true }
categories = { workspace = true }
[features]
default = ["forgejo", "github"]
default = ["forgejo", "github", "tui"]
forgejo = ["git-next-forge-forgejo"]
github = ["git-next-forge-github"]
tui = ["ratatui"]

View file

@ -38,7 +38,6 @@ enum Server {
Init,
Start {
/// Display a UI (experimental)
#[cfg(feature = "tui")]
#[arg(long, required = false)]
ui: bool,
},
@ -58,12 +57,6 @@ fn main() -> Result<()> {
Server::Init => {
server::init(&fs)?;
}
#[cfg(not(feature = "tui"))]
Server::Start {} => {
let sleep_duration = std::time::Duration::from_secs(10);
server::start(false, fs, net, repository_factory, sleep_duration)?;
}
#[cfg(feature = "tui")]
Server::Start { ui } => {
let sleep_duration = std::time::Duration::from_secs(10);
server::start(ui, fs, net, repository_factory, sleep_duration)?;

View file

@ -2,4 +2,3 @@ mod file_updated;
mod receive_app_config;
mod receive_valid_app_config;
mod shutdown;
mod subscribe_updates;

View file

@ -71,7 +71,6 @@ impl Handler<ReceiveValidAppConfig> for ServerActor {
let shout = app_config.shout().clone();
self.app_config.replace(app_config);
self.alerts.do_send(UpdateShout::new(shout));
self.send_server_updates();
}
}

View file

@ -1,10 +0,0 @@
use crate::server::actor::{messages::SubscribeToUpdates, ServerActor};
//
impl actix::Handler<SubscribeToUpdates> for ServerActor {
type Result = ();
fn handle(&mut self, msg: SubscribeToUpdates, _ctx: &mut Self::Context) -> Self::Result {
self.subscribers.push(msg.unwrap());
}
}

View file

@ -1,12 +1,9 @@
use actix::{Message, Recipient};
//-
use derive_more::Constructor;
use git_next_core::{
git::graph::Log,
message,
server::{AppConfig, Storage},
ForgeAlias, RepoAlias, RepoBranches,
};
use std::net::SocketAddr;
@ -36,28 +33,3 @@ message!(
);
message!(Shutdown, "Notification to shutdown the server actor");
#[derive(Clone, Debug, PartialEq, Eq, Message)]
#[rtype(result = "()")]
pub enum ServerUpdate {
/// Status of a repo
UpdateRepoSummary {
forge_alias: ForgeAlias,
repo_alias: RepoAlias,
branches: RepoBranches,
log: Log,
},
/// remove a repo
RemoveRepo {
forge_alias: ForgeAlias,
repo_alias: RepoAlias,
},
/// test message
Ping,
}
message!(
SubscribeToUpdates,
Recipient<ServerUpdate>,
"Subscribe to receive updates from the server"
);

View file

@ -1,6 +1,6 @@
//
use actix::prelude::*;
use messages::{ReceiveAppConfig, ServerUpdate};
use messages::ReceiveAppConfig;
use tracing::error;
#[cfg(test)]
@ -58,8 +58,6 @@ pub struct ServerActor {
sleep_duration: std::time::Duration,
repo_actors: BTreeMap<(ForgeAlias, RepoAlias), Addr<RepoActor>>,
subscribers: Vec<Recipient<ServerUpdate>>,
// testing
message_log: Option<Arc<RwLock<Vec<String>>>>,
}
@ -84,7 +82,6 @@ impl ServerActor {
net,
alerts,
repository_factory: repo,
subscribers: Vec::default(),
sleep_duration,
repo_actors: BTreeMap::new(),
message_log: None,
@ -242,10 +239,4 @@ impl ServerActor {
ctx.address().do_send(msg);
}
}
fn send_server_updates(&self) {
self.subscribers.iter().for_each(|subscriber| {
subscriber.do_send(ServerUpdate::Ping);
});
}
}

View file

@ -5,16 +5,12 @@ pub mod actor;
mod tests;
use actix::prelude::*;
use actix_rt::signal;
use crate::{
alerts::{AlertsActor, History},
file_watcher::{watch_file, FileUpdated},
};
#[allow(clippy::module_name_repetitions)]
pub use actor::ServerActor;
use git_next_core::git::RepositoryFactory;
use anyhow::{Context, Result};
@ -67,28 +63,17 @@ pub fn start(
.expect("file watcher");
if ui {
#[cfg(feature = "tui")]
{
use crate::server::actor::messages::SubscribeToUpdates;
use crate::tui;
use std::sync::mpsc::channel;
let (tx_shutdown, rx_shutdown) = channel::<()>();
let tui_addr = tui::Tui::new(tx_shutdown).start();
// tui_addr.do_send(tui::Tick);
let _ = tui_addr.send(tui::Tick).await;
server.do_send(SubscribeToUpdates::new(tui_addr.clone().recipient()));
loop {
let _ = tui_addr.send(tui::Tick).await;
if rx_shutdown.try_recv().is_ok() {
break;
}
// actix_rt::task::yield_now().await;
}
}
let (tx, rx) = std::sync::mpsc::channel::<()>();
actix_rt::task::spawn_blocking(|| {
println!("Start Terminal...");
// TODO: how does server send messages to Tui?
crate::tui::Tui::new(tx).start().do_send(crate::tui::Tick);
});
println!("Waiting for shutdown...");
let _ = rx.recv(); // block until shutdown is signaled
} else {
info!("Server running - Press Ctrl-C to stop...");
let _ = signal::ctrl_c().await;
let _ = actix_rt::signal::ctrl_c().await;
info!("Ctrl-C received, shutting down...");
}

View file

@ -1,4 +1,2 @@
//
mod server_update;
mod tick;

View file

@ -1,28 +0,0 @@
use std::time::Instant;
use actix::Handler;
use crate::{server::actor::messages::ServerUpdate, tui::Tui};
//
impl Handler<ServerUpdate> for Tui {
type Result = ();
fn handle(&mut self, msg: ServerUpdate, _ctx: &mut Self::Context) -> Self::Result {
match msg {
ServerUpdate::UpdateRepoSummary {
forge_alias,
repo_alias,
branches,
log,
} => todo!(),
ServerUpdate::RemoveRepo {
forge_alias,
repo_alias,
} => todo!(),
ServerUpdate::Ping => {
self.last_ping = Instant::now();
}
}
}
}

View file

@ -1,7 +1,7 @@
//
use std::{borrow::BorrowMut, time::Instant};
use std::borrow::BorrowMut;
use actix::{ActorContext, Handler};
use actix::{ActorContext, AsyncContext, Handler};
use ratatui::{
crossterm::event::{self, KeyCode, KeyEventKind},
style::Stylize as _,
@ -14,15 +14,12 @@ impl Handler<Tick> for Tui {
type Result = std::io::Result<()>;
fn handle(&mut self, _msg: Tick, ctx: &mut Self::Context) -> Self::Result {
ctx.notify_later(Tick, std::time::Duration::from_millis(16));
if let Some(terminal) = self.terminal.borrow_mut() {
terminal.draw(|frame| {
let area = frame.area();
frame.render_widget(
Paragraph::new(format!(
"(press 'q' to quit) Ping:[{:?}] UI:[{:?}]",
self.last_ping,
Instant::now()
))
Paragraph::new("Hello Ratatui! (press 'q' to quit)")
.white()
.on_blue(),
area,

View file

@ -5,7 +5,6 @@ pub mod messages;
use std::{
io::{stderr, Stderr},
sync::mpsc::Sender,
time::Instant,
};
use actix::{Actor, Context};
@ -23,7 +22,6 @@ use ratatui::{
pub struct Tui {
terminal: Option<Terminal<CrosstermBackend<Stderr>>>,
signal_shutdown: Sender<()>,
last_ping: Instant,
}
impl Actor for Tui {
type Context = Context<Self>;
@ -54,11 +52,10 @@ impl Actor for Tui {
}
}
impl Tui {
pub fn new(signal_shutdown: Sender<()>) -> Self {
pub const fn new(signal_shutdown: Sender<()>) -> Self {
Self {
terminal: None,
signal_shutdown,
last_ping: Instant::now(),
}
}
}

View file

@ -99,6 +99,7 @@ impl git::repository::OpenRepositoryLike for TestOpenRepository {
.fetch_counter
.read()
.map_err(|_| git::fetch::Error::Lock)?;
println!("Fetch: {i}");
self.fetch_counter
.write()
.map_err(|_| git::fetch::Error::Lock)