From de80601bf4f2704441e2d5307d79697553a37e9f Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Sun, 6 Sep 2020 17:48:14 +0200 Subject: [PATCH] Push progress closes #267 --- CHANGELOG.md | 4 +- README.md | 3 +- assets/push.gif | Bin 0 -> 288471 bytes asyncgit/src/lib.rs | 2 +- asyncgit/src/push.rs | 187 ++++++++++++++++++++++++++++++++--- asyncgit/src/sync/mod.rs | 4 +- asyncgit/src/sync/remotes.rs | 78 ++++++++++++--- src/components/push.rs | 55 +++++++++-- src/strings.rs | 6 +- 9 files changed, 300 insertions(+), 39 deletions(-) create mode 100644 assets/push.gif diff --git a/CHANGELOG.md b/CHANGELOG.md index 97a832e2..08b82102 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased ### Added -- push to origin support ([#265](https://github.com/extrawurst/gitui/issues/265)) +- push to remote ([#265](https://github.com/extrawurst/gitui/issues/265)) ([#267](https://github.com/extrawurst/gitui/issues/267)) + +![push](assets/push.gif) ### Changed - do not highlight selection in diff view when not focused ([#270](https://github.com/extrawurst/gitui/issues/270)) diff --git a/README.md b/README.md index c4174dbd..2816c052 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ - Inspect, commit, and amend changes (incl. hooks: _commit-msg_/_post-commit_) - Stage, unstage, revert and reset files and hunks - Stashing (save, apply, drop, and inspect) +- Push to remote - Browse commit log, diff committed changes - Scalable terminal UI layout - Async [input polling](assets/perf_compare.jpg) @@ -53,7 +54,7 @@ Over the last 2 years my go-to GUI tool for this was [fork](https://git-fork.com # Known Limitations -- no support for push and pull yet (see [#90](https://github.com/extrawurst/gitui/issues/90)) +- no support for `pull` yet (see [#90](https://github.com/extrawurst/gitui/issues/90)) - limited support for branching (see [#90](https://github.com/extrawurst/gitui/issues/91)) - no support for [bare repositories](https://git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server) (see [#100](https://github.com/extrawurst/gitui/issues/100)) - no support for [core.hooksPath](https://git-scm.com/docs/githooks) config diff --git a/assets/push.gif b/assets/push.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e0f7b0743d17eee12bf4c62d2641e361b16daaf GIT binary patch literal 288471 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 G=>Gw`Ga{(~ literal 0 HcmV?d00001 diff --git a/asyncgit/src/lib.rs b/asyncgit/src/lib.rs index e5076ad0..1755022f 100644 --- a/asyncgit/src/lib.rs +++ b/asyncgit/src/lib.rs @@ -20,7 +20,7 @@ mod tags; pub use crate::{ commit_files::AsyncCommitFiles, diff::{AsyncDiff, DiffParams, DiffType}, - push::{AsyncPush, PushRequest}, + push::{AsyncPush, PushProgress, PushProgressState, PushRequest}, revlog::{AsyncLog, FetchStatus}, status::{AsyncStatus, StatusParams}, sync::{ diff --git a/asyncgit/src/push.rs b/asyncgit/src/push.rs index 87dd9f8f..8fffa137 100644 --- a/asyncgit/src/push.rs +++ b/asyncgit/src/push.rs @@ -2,19 +2,83 @@ use crate::{ error::{Error, Result}, sync, AsyncNotification, CWD, }; -use crossbeam_channel::Sender; -use std::sync::{Arc, Mutex}; +use crossbeam_channel::{unbounded, Receiver, Sender}; +use git2::PackBuilderStage; +use std::{ + cmp, + sync::{Arc, Mutex}, + thread, + time::Duration, +}; +use sync::ProgressNotification; +use thread::JoinHandle; +/// #[derive(Clone, Debug)] -enum PushStates { - None, - // Packing, - // Pushing(usize, usize), +pub enum PushProgressState { + /// + PackingAddingObject, + /// + PackingDeltafiction, + /// + Pushing, } -impl Default for PushStates { - fn default() -> Self { - PushStates::None +/// +#[derive(Clone, Debug)] +pub struct PushProgress { + /// + pub state: PushProgressState, + /// + pub progress: u8, +} + +impl PushProgress { + /// + pub fn new( + state: PushProgressState, + current: usize, + total: usize, + ) -> Self { + let total = cmp::max(current, total); + let progress = current as f32 / total as f32 * 100.0; + let progress = progress as u8; + Self { state, progress } + } +} + +impl From for PushProgress { + fn from(progress: ProgressNotification) -> Self { + match progress { + ProgressNotification::Packing { + stage, + current, + total, + } => match stage { + PackBuilderStage::AddingObjects => PushProgress::new( + PushProgressState::PackingAddingObject, + current, + total, + ), + PackBuilderStage::Deltafication => PushProgress::new( + PushProgressState::PackingDeltafiction, + current, + total, + ), + }, + ProgressNotification::PushTransfer { + current, + total, + .. + } => PushProgress::new( + PushProgressState::Pushing, + current, + total, + ), + ProgressNotification::Done => { + PushProgress::new(PushProgressState::Pushing, 1, 1) + } + } } } @@ -30,13 +94,13 @@ pub struct PushRequest { #[derive(Default, Clone, Debug)] struct PushState { request: PushRequest, - state: PushStates, } /// pub struct AsyncPush { state: Arc>>, last_result: Arc>>, + progress: Arc>>, sender: Sender, } @@ -46,6 +110,7 @@ impl AsyncPush { Self { state: Arc::new(Mutex::new(None)), last_result: Arc::new(Mutex::new(None)), + progress: Arc::new(Mutex::new(None)), sender: sender.clone(), } } @@ -62,6 +127,12 @@ impl AsyncPush { Ok(res.clone()) } + /// + pub fn progress(&self) -> Result> { + let res = self.progress.lock()?; + Ok(res.map(|progress| progress.into())) + } + /// pub fn request(&mut self, params: PushRequest) -> Result<()> { log::trace!("request"); @@ -71,19 +142,35 @@ impl AsyncPush { } self.set_request(¶ms)?; + Self::set_progress(self.progress.clone(), None)?; let arc_state = Arc::clone(&self.state); let arc_res = Arc::clone(&self.last_result); + let arc_progress = Arc::clone(&self.progress); let sender = self.sender.clone(); - rayon_core::spawn(move || { - //TODO: use channels to communicate progress - let res = sync::push_origin( + thread::spawn(move || { + let (progress_sender, receiver) = unbounded(); + + let handle = Self::spawn_receiver_thread( + sender.clone(), + receiver, + arc_progress, + ); + + let res = sync::push( CWD, params.remote.as_str(), params.branch.as_str(), + progress_sender.clone(), ); + progress_sender + .send(ProgressNotification::Done) + .expect("closing send failed"); + + handle.join().expect("joining thread failed"); + Self::set_result(arc_res, res).expect("result error"); Self::clear_request(arc_state).expect("clear error"); @@ -96,6 +183,44 @@ impl AsyncPush { Ok(()) } + fn spawn_receiver_thread( + sender: Sender, + receiver: Receiver, + progress: Arc>>, + ) -> JoinHandle<()> { + log::info!("push progress receiver spawned"); + + thread::spawn(move || loop { + let incoming = receiver.recv(); + match incoming { + Ok(update) => { + Self::set_progress( + progress.clone(), + Some(update), + ) + .expect("set prgoress failed"); + sender + .send(AsyncNotification::Push) + .expect("error sending push"); + + //NOTE: for better debugging + thread::sleep(Duration::from_millis(300)); + + if let ProgressNotification::Done = update { + break; + } + } + Err(e) => { + log::error!( + "push progress receiver error: {}", + e + ); + break; + } + } + }) + } + fn set_request(&self, params: &PushRequest) -> Result<()> { let mut state = self.state.lock()?; @@ -105,7 +230,6 @@ impl AsyncPush { *state = Some(PushState { request: params.clone(), - ..PushState::default() }); Ok(()) @@ -121,6 +245,20 @@ impl AsyncPush { Ok(()) } + fn set_progress( + progress: Arc>>, + state: Option, + ) -> Result<()> { + let simple_progress: Option = + state.map(|prog| prog.into()); + log::info!("push progress: {:?}", simple_progress); + let mut progress = progress.lock()?; + + *progress = state; + + Ok(()) + } + fn set_result( arc_result: Arc>>, res: Result<()>, @@ -138,3 +276,24 @@ impl AsyncPush { Ok(()) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_progress_zero_total() { + let prog = + PushProgress::new(PushProgressState::Pushing, 1, 0); + + assert_eq!(prog.progress, 100); + } + + #[test] + fn test_progress_rounding() { + let prog = + PushProgress::new(PushProgressState::Pushing, 2, 10); + + assert_eq!(prog.progress, 20); + } +} diff --git a/asyncgit/src/sync/mod.rs b/asyncgit/src/sync/mod.rs index 21c5041e..87251e39 100644 --- a/asyncgit/src/sync/mod.rs +++ b/asyncgit/src/sync/mod.rs @@ -30,7 +30,9 @@ pub use hooks::{hooks_commit_msg, hooks_post_commit, HookResult}; pub use hunks::{reset_hunk, stage_hunk, unstage_hunk}; pub use ignore::add_to_ignore; pub use logwalker::LogWalker; -pub use remotes::{fetch_origin, get_remotes, push_origin}; +pub use remotes::{ + fetch_origin, get_remotes, push, ProgressNotification, +}; pub use reset::{reset_stage, reset_workdir}; pub use stash::{get_stashes, stash_apply, stash_drop, stash_save}; pub use tags::{get_tags, CommitTags, Tags}; diff --git a/asyncgit/src/sync/remotes.rs b/asyncgit/src/sync/remotes.rs index 6e71e062..a572ced6 100644 --- a/asyncgit/src/sync/remotes.rs +++ b/asyncgit/src/sync/remotes.rs @@ -1,9 +1,38 @@ //! use crate::{error::Result, sync::utils}; -use git2::{Cred, FetchOptions, PushOptions, RemoteCallbacks}; +use crossbeam_channel::Sender; +use git2::{ + Cred, FetchOptions, PackBuilderStage, PushOptions, + RemoteCallbacks, +}; use scopetime::scope_time; +/// +#[derive(Debug, Clone, Copy)] +pub enum ProgressNotification { + /// + PushTransfer { + /// + current: usize, + /// + total: usize, + /// + bytes: usize, + }, + /// + Packing { + /// + stage: PackBuilderStage, + /// + total: usize, + /// + current: usize, + }, + /// + Done, +} + /// pub fn get_remotes(repo_path: &str) -> Result> { scope_time!("get_remotes"); @@ -24,7 +53,7 @@ pub fn fetch_origin(repo_path: &str, branch: &str) -> Result { let mut remote = repo.find_remote("origin")?; let mut options = FetchOptions::new(); - options.remote_callbacks(remote_callbacks()); + options.remote_callbacks(remote_callbacks(None)); remote.fetch(&[branch], Some(&mut options), None)?; @@ -32,10 +61,11 @@ pub fn fetch_origin(repo_path: &str, branch: &str) -> Result { } /// -pub fn push_origin( +pub fn push( repo_path: &str, remote: &str, branch: &str, + progress_sender: Sender, ) -> Result<()> { scope_time!("push_origin"); @@ -43,7 +73,8 @@ pub fn push_origin( let mut remote = repo.find_remote(remote)?; let mut options = PushOptions::new(); - options.remote_callbacks(remote_callbacks()); + + options.remote_callbacks(remote_callbacks(Some(progress_sender))); options.packbuilder_parallelism(0); remote.push(&[branch], Some(&mut options))?; @@ -51,18 +82,37 @@ pub fn push_origin( Ok(()) } -fn remote_callbacks<'a>() -> RemoteCallbacks<'a> { +fn remote_callbacks<'a>( + sender: Option>, +) -> RemoteCallbacks<'a> { let mut callbacks = RemoteCallbacks::new(); - callbacks.push_transfer_progress(|progress, total, bytes| { - log::debug!( - "progress: {}/{} ({} B)", - progress, - total, - bytes, - ); + let sender_clone = sender.clone(); + callbacks.push_transfer_progress(move |current, total, bytes| { + sender_clone.clone().map(|sender| { + sender.send(ProgressNotification::PushTransfer { + current, + total, + bytes, + }) + }); + + // log::debug!( + // "progress: {}/{} ({} B)", + // progress, + // total, + // bytes, + // ); }); - callbacks.pack_progress(|stage, current, total| { - log::debug!("packing: {:?} - {}/{}", stage, current, total); + callbacks.pack_progress(move |stage, current, total| { + sender.clone().map(|sender| { + sender.send(ProgressNotification::Packing { + stage, + total, + current, + }) + }); + + // log::debug!("packing: {:?} - {}/{}", stage, current, total); }); callbacks.credentials(|url, username_from_url, allowed_types| { log::debug!( diff --git a/src/components/push.rs b/src/components/push.rs index 91aca8cf..8cff069a 100644 --- a/src/components/push.rs +++ b/src/components/push.rs @@ -9,13 +9,17 @@ use crate::{ ui::{self, style::SharedTheme}, }; use anyhow::Result; -use asyncgit::{AsyncNotification, AsyncPush, PushRequest}; +use asyncgit::{ + AsyncNotification, AsyncPush, PushProgress, PushProgressState, + PushRequest, +}; use crossbeam_channel::Sender; use crossterm::event::Event; use tui::{ backend::Backend, layout::Rect, - widgets::{Block, BorderType, Borders, Clear, Paragraph, Text}, + style::{Color, Style}, + widgets::{Block, BorderType, Borders, Clear, Gauge}, Frame, }; @@ -23,6 +27,7 @@ use tui::{ pub struct PushComponent { visible: bool, git_push: AsyncPush, + progress: Option, pending: bool, queue: Queue, theme: SharedTheme, @@ -42,6 +47,7 @@ impl PushComponent { pending: false, visible: false, git_push: AsyncPush::new(sender), + progress: None, theme, key_config, } @@ -50,6 +56,7 @@ impl PushComponent { /// pub fn push(&mut self, branch: String) -> Result<()> { self.pending = true; + self.progress = None; self.git_push.request(PushRequest { remote: String::from("origin"), branch, @@ -75,6 +82,7 @@ impl PushComponent { /// fn update(&mut self) -> Result<()> { self.pending = self.git_push.is_pending()?; + self.progress = self.git_push.progress()?; if !self.pending { if let Some(err) = self.git_push.last_result()? { @@ -91,6 +99,33 @@ impl PushComponent { Ok(()) } + + fn get_progress(&self) -> (String, u8) { + self.progress.as_ref().map_or( + (strings::PUSH_POPUP_PROGRESS_NONE.into(), 0), + |progress| { + ( + Self::progress_state_name(&progress.state), + progress.progress, + ) + }, + ) + } + + fn progress_state_name(state: &PushProgressState) -> String { + match state { + PushProgressState::PackingAddingObject => { + strings::PUSH_POPUP_STATES_ADDING + } + PushProgressState::PackingDeltafiction => { + strings::PUSH_POPUP_STATES_DELTAS + } + PushProgressState::Pushing => { + strings::PUSH_POPUP_STATES_PUSHING + } + } + .into() + } } impl DrawableComponent for PushComponent { @@ -100,20 +135,28 @@ impl DrawableComponent for PushComponent { _rect: Rect, ) -> Result<()> { if self.visible { - let txt = vec![Text::Raw(strings::PUSH_POPUP_MSG.into())]; + let (state, progress) = self.get_progress(); + + let area = ui::centered_rect_absolute(30, 3, f.size()); - let area = ui::centered_rect_absolute(25, 3, f.size()); f.render_widget(Clear, area); f.render_widget( - Paragraph::new(txt.iter()) + Gauge::default() + .label(state.as_str()) .block( Block::default() + .title(strings::PUSH_POPUP_MSG) .borders(Borders::ALL) .border_type(BorderType::Thick) .title_style(self.theme.title(true)) .border_style(self.theme.block(true)), ) - .style(self.theme.text_danger()), + .style( + Style::default() + .fg(Color::White) + .bg(Color::Black), // .modifier(Modifier::ITALIC), + ) + .percent(u16::from(progress)), area, ); } diff --git a/src/strings.rs b/src/strings.rs index 42486011..bbedebe8 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -4,7 +4,11 @@ pub mod order { pub static NAV: i8 = 1; } -pub static PUSH_POPUP_MSG: &str = "pushing..."; +pub static PUSH_POPUP_MSG: &str = "Push"; +pub static PUSH_POPUP_PROGRESS_NONE: &str = "preparing..."; +pub static PUSH_POPUP_STATES_ADDING: &str = "adding objects (1/3)"; +pub static PUSH_POPUP_STATES_DELTAS: &str = "deltas (2/3)"; +pub static PUSH_POPUP_STATES_PUSHING: &str = "pushing (3/3)"; pub fn title_status(key_config: &SharedKeyConfig) -> String { format!(