Migrate from `pijul::progress` to `pijul_interaction::progress`
Dependencies
- [2]
6HQHOC2ZFixing terminal resizing in progress bars - [3]
DFK4BTAABetter computation of the progress bar widths - [4]
S4LQTDJIavoid outputting repo multiple times in channel switch - [5]
BHFLDCFRUpdating last_touched in one extra case in `reset` - [6]
2FZSXUGKfill 0/0 progress bars with `=` to look complete - [7]
ISZ65SPQChecking that `pijul apply` does not destroy unrecorded changes - [8]
5XCNW4EVFixing a bug when outputting after a pull, when a path to be output is a string-prefix of another one without being a path-prefix of that other one - [9]
XQHABMC2Do not block when there is no patch to pull - [10]
Z6ASIMORAvoid increasing the download progress bar length if we need the same dependency more than once - [11]
LZOGKBJXnew command `pijul client` for authenticating to a HTTP server - [12]
ILZ44DEYsimplify outputting with no touched paths - [13]
G65S7FAWVersion bump and cleanup - [14]
3OF3DHLMFixing a panic with narrow terminal windows - [15]
EUZFFJSOUpdating Pijul with the latest changes in Libpijul - [16]
LGEJSLTYFixing output (including its uses in reset and pull) - [17]
QQZNSB26Permission update (after #X243) - [18]
L2VH4BYKDownloading changelists from channels without an id (Nest discussions) - [19]
JZADJIA3Handling HTTP errors - [20]
MU5GSJAWPartial push and pull (WARNING: breaks the existing protocol) - [21]
Y6EVFMTADon't output files if they aren't in the current channel - [22]
5MQUX3TQCorrect spacing for zero-length progress bar - [23]
I24UEJQLVarious post-fire fixes - [24]
I52XSRUHMassive cleanup, and simplification - [25]
YN63NUZOSanakirja 1.0 - [26]
367UBQ6KForwarding SSH stderr, and progress bar for push - [27]
HDGRZISMVersion updates - [28]
FBXYP7QMForgot to add remote::http - [29]
HXEIH4UQPulling more than 100 changes at once - [30]
ZDK3GNDBTag transactions (including a massive refactoring of errors) - [31]
ZWVYH7WPPulling local tags - [32]
4HTHYIA3Fixing HTTP download - [33]
X6YFD4WVDo not download changes if we already have them - [34]
SXEYMYF7Fixing the bad changes in history (unfortunately, by rebooting). - [35]
C4MJ7D7QVerbose printing of conflicts to stderr - [36]
5QTMRUXNFixing a race condition between progress bars - [37]
IQ4FCHPZHTTP connections: pooling + retry on error - [38]
PCEJFKFXProgress bar for upload and apply - [39]
3KRGVQFUDo not update the mtime of unmodified files - [40]
X243Z3Y5Recording only the required metadata (can even be changed later!) - [41]
6ZPDI7QGpull uses None as the base case path when outputing repo - [42]
YTQS4ES3Fixing a parsing problem (related to permissions), and the associated permissions - [43]
TI7PCK7JUpdate `pijul/src/main.rs` to use new identity management - [44]
4XLHUME7Fixing a interlocking when cloning from a particular patch - [45]
DDJO7X2PRemove dependency on `num_cpus` - [46]
WLUID7NADo not block when downloading more than 100 changes over SSH - [47]
WTZXEWY7Flushing the futures pipeline when downloading over HTTP(S) - [48]
76PCXGMLPushing to, and pulling from the local repository - [49]
44BN7FWSDo not output files introduced by patches that were not applied during a push - [50]
Q45QHPO4Feedback on network stuff - [51]
GNMZNKB4Cursors cleanup - [52]
QMTANHVNReset: only output changed files - [53]
OKE6SXPPimprove docs, feedback for pijul key - [54]
IBPVOKM5Fixing a bug in patch download - [55]
A6JQQNNJMore appropriate debug messages - [56]
VBMXB443Retrying if the HTTP connection drops while reading the body - [57]
XSRTXUASPull: show progress bar when applying - [58]
DO2Y5TY5Tag synchronisation - [59]
C3L2TLQWWhen downloading changes, check whether we have their dependencies and download them too - [60]
5SLOJYHGFixing the Git feature - [61]
LYTVEPH3Avoid cloning into an existing path - [62]
DVBSW7SIBump dependencies with minor-level changes - [63]
MDADYULSFix a panic when switching between channels that have different files - [64]
2D7P2VKJChange completions (where the whole progress bar story started) - [65]
VMPAOJS2Don't output after pushing to a local channel - [66]
YWL2K3P7Removing the `Direction` argument in pijul::remote::Repository::remote - [67]
DFRNZLQ6Fixing #798: overwrite check too strict in `pijul apply` when applying a patch adding new files - [68]
A3RM526YIntegrating identity malleability - [69]
4KJ45IJLImplement new identity management - [70]
XA23FMQMReset only files that have been modified - [71]
ZRUPLBBTColours in diff and change: separating concerns and dependencies - [72]
MXQ3U2DPShorter progress bars - [73]
KTTKF3RWLocking stderr and the progress bar in SSH - [74]
TPEH2XNB1.0.0-alpha.28, with Tokio 1.0 - [75]
IVLLXQ5ZImproved push/pull reporting - [76]
UDHP4ZVBFixing SSH asynchronicity issues - [77]
ISCWVXO6Progress bar for push - [78]
BNPSVXICFriendlier progress bars - [79]
TYAKEAJLA better estimate of the maximum number of open patches we can keep (Unix-only at the moment) - [80]
TKEVOH7HFixing a bug when downloading changes, and making change download more efficient (more async) - [81]
L4JXJHWXpijul/*: reorganize imports and remove extern crate - [82]
JL4WKA5PImplement the Sanakirja concurrency model in a cross-process way - [83]
ZSFJT4SFAllow remotes to have a different push and pull address - [*]
AI73GKAOAdding a UserAgent header to the http downloader - [*]
2K7JLB4ZNo pager on Windows - [*]
J2D66R2DEnable the pager dependency on OSX, fixes build
Change contents
- file deletion: progress.rs
use std::borrow::Cow;use std::io::Write;use std::sync::{Arc, Mutex};pub struct Cursors {pub inner: Arc<Mutex<InnerCursors>>,}pub struct InnerCursors {drawn: usize,n_post: usize,n_pre: usize,w: usize,stop: bool,}impl Cursors {pub fn new() -> Self {let inner = Arc::new(Mutex::new(InnerCursors {drawn: 0,cursors: Vec::new(),n_post: 0,n_pre: 0,stop: false,w: 0,}));{let mut inner = if let Ok(inner) = inner_.lock() {inner} else {break;};if inner.stop {inner.render().unwrap();break;} else {inner.render().unwrap();}}std::thread::sleep(std::time::Duration::from_millis(100));}pub fn stop(&self) {if let Ok(mut n) = self.inner.lock() {n.stop = true}}self.stop();}pub fn borrow_mut(&self,) -> Result<std::sync::MutexGuard<InnerCursors>,std::sync::PoisonError<std::sync::MutexGuard<'_, InnerCursors>>,> {let mut m = self.inner.lock()?;m.n_pre = 0;Ok(m)}}#[allow(dead_code)]pub enum Cursor {Static {pre: Cow<'static, str>,},Bar {pre: Cow<'static, str>,n: usize,i: usize,},Spin {pre: Cow<'static, str>,i: usize,},}impl Cursor {fn pre(&self) -> &str {match self {Cursor::Static { pre } => pre,Cursor::Bar { pre, .. } => pre,Cursor::Spin { pre, .. } => pre,}}fn n(&self) -> usize {match self {Cursor::Bar { n, .. } => {let mut n = *n;let mut r = 6;while n > 0 {n /= 10;r += 2}r}_ => 0,}}pub fn incr(&mut self) {match self {Cursor::Bar { i, .. } => *i += 1,_ => {}}}fn render<W: std::io::Write>(&mut self,stdout: &mut W,npre: usize,npost: usize,w: usize,) -> Result<(), std::io::Error> {match self {Cursor::Static { pre } => {for _ in 0..npre - pre.chars().count() {stdout.write_all(b" ")?;}stdout.write_all(pre.as_bytes())?;// Fil the rest of the line with spaces.for _ in 0..w - npre {stdout.write_all(b" ")?;}Ok(())}Cursor::Bar { pre, i, n } => {for _ in 0..npre - pre.chars().count() {stdout.write_all(b" ")?;}// Comupte the appropriate width for the bar.// Output the bar.write!(stdout, "{} [", pre)?;let wb = (w as usize).min(50);}}write!(stdout, "] {}/{}", *i, *n)?;for _ in 0..nw {stdout.write_all(b" ")?;}Ok(())}Cursor::Spin { pre, i } => {for _ in 0..npre - pre.chars().count() {stdout.write_all(b" ")?;}stdout.write_all(pre.as_bytes())?;stdout.write_all(b" ")?;const SYM: [&str; 8] = ["←", "↖", "↑", "↗", "→", "↘", "↓", "↙"];stdout.write_all(SYM[*i].as_bytes())?;*i = (*i + 1) % SYM.len();// Fill the rest of the line with spaces.for _ in 0..w - npre - 2 {stdout.write_all(b" ")?;}Ok(())}}}}impl InnerCursors {fn render(&mut self) -> Result<(), std::io::Error> {use terminal_size::*;let mut stdout = std::io::stdout();if let Some((Width(w), _)) = terminal_size() {if self.n_pre == 0 {self.n_post = 0;for c in self.cursors.iter() {let n_pre = c.pre().chars().count();self.n_pre = self.n_pre.max(n_pre);self.n_post = self.n_post.max(c.n());}}stdout.write_all(b"\x1B[F")?;}for c in self.cursors.iter_mut() {// Clear the end of the line and move to the next one.stdout.write_all(b"\x1B[K\n")?;}self.drawn = self.cursors.len();// Erase the terminal after the cursor.stdout.write_all(b"\x1B[J")?;stdout.flush()?;}Ok(())}}c.render(&mut stdout, self.n_pre, self.n_post, w)?;self.w = w;let w = w as usize;for _ in 0..self.drawn {pub fn push(&mut self, c: Cursor) -> usize {let r = self.cursors.len();self.cursors.push(c);r}let nw = w + npost - wb - 6;if *n <= 1 {for _ in 0..wb as usize {}} else {for j in 0..wb as usize {if j < k {write!(stdout, "=")?;} else if j == k {write!(stdout, ">")?;} else {write!(stdout, " ")?}let k = (wb as usize * *i) / *n;stdout.write_all(filler.as_bytes())?;let filler = if *i == *n { "=" } else { " " };let w_digits = {let mut n = *n;let mut nd = if n == 0 { 1 } else { 0 } + if *i == 0 { 1 } else { 0 };while n > 0 {n /= 10;nd += 1}};let w = w - npre - npost - w_digits;nd * 2_ => {}}}pub fn incr_len(&mut self) {match self {Cursor::Bar { n, .. } => *n += 1,m.stop = false;debug!("borrow_mut");self.restart();let mut t = self.t.lock().unwrap();if let Some(t) = t.take() {t.join().unwrap();}pub fn join(&self) {debug!("join");debug!("stop");}));let cursors = Cursors {inner,t: Mutex::new(None),};cursors.restart();cursors}fn restart(&self) {debug!("restart");let mut t = self.t.lock().unwrap();if t.is_some() {return;}let inner_ = self.inner.clone();*t = Some(std::thread::spawn(move || loop {}impl std::ops::Index<usize> for InnerCursors {type Output = Cursor;fn index(&self, i: usize) -> &Self::Output {self.cursors.index(i)}}impl std::ops::IndexMut<usize> for InnerCursors {fn index_mut(&mut self, i: usize) -> &mut Self::Output {self.cursors.index_mut(i)}cursors: Vec<Cursor>,t: Mutex<Option<std::thread::JoinHandle<()>>>,lazy_static::lazy_static! {pub static ref PROGRESS: crate::progress::Cursors = crate::progress::Cursors::new();}use log::*; - edit in pijul/src/remote/ssh.rs at line 21
use pijul_interaction::progress::ProgressBar; - replacement in pijul/src/remote/ssh.rs at line 949
pro_n: usize,progress_bar: ProgressBar, - replacement in pijul/src/remote/ssh.rs at line 995
super::PROGRESS.borrow_mut().unwrap()[pro_n].incr();progress_bar.inc(1); - replacement in pijul/src/remote/ssh.rs at line 1002
pro_n: usize,progress_bar: ProgressBar, - replacement in pijul/src/remote/ssh.rs at line 1008
self.download_changes_(pro_n, c, Some(sender), changes_dir, full)self.download_changes_(progress_bar, c, Some(sender), changes_dir, full) - replacement in pijul/src/remote/ssh.rs at line 1014
pro_n: usize,progress_bar: ProgressBar, - replacement in pijul/src/remote/ssh.rs at line 1038
super::PROGRESS.borrow_mut().unwrap()[pro_n].incr();progress_bar.inc(1); - replacement in pijul/src/remote/mod.rs at line 27
use crate::progress::PROGRESS;use pijul_interaction::progress::{ProgressBar, Spinner, APPLY_MESSAGE, COMPLETE_MESSAGE, DOWNLOAD_MESSAGE, UPLOAD_MESSAGE,}; - replacement in pijul/src/remote/mod.rs at line 1049
let pro_n = {let mut pro = PROGRESS.borrow_mut().unwrap();pro.push(crate::progress::Cursor::Bar {i: 0,n: changes.len(),pre: "Uploading changes".into(),})};let upload_bar = ProgressBar::new(changes.len() as u64, UPLOAD_MESSAGE)?; - replacement in pijul/src/remote/mod.rs at line 1052
RemoteRepo::Local(ref mut l) => l.upload_changes(pro_n, local, to_channel, changes)?,RemoteRepo::Local(ref mut l) => {l.upload_changes(upload_bar, local, to_channel, changes)?} - replacement in pijul/src/remote/mod.rs at line 1056
s.upload_changes(pro_n, local, to_channel, changes).await?s.upload_changes(upload_bar, local, to_channel, changes).await?}RemoteRepo::Http(ref h) => {h.upload_changes(upload_bar, local, to_channel, changes).await? - edit in pijul/src/remote/mod.rs at line 1063
RemoteRepo::Http(ref h) => h.upload_changes(pro_n, local, to_channel, changes).await?, - replacement in pijul/src/remote/mod.rs at line 1069
local::upload_changes(pro_n, &store, txn, &mut channel, changes)?local::upload_changes(upload_bar, &store, txn, &mut channel, changes)? - edit in pijul/src/remote/mod.rs at line 1073
PROGRESS.join(); - replacement in pijul/src/remote/mod.rs at line 1079
pro_n: usize,progress_bar: ProgressBar, - replacement in pijul/src/remote/mod.rs at line 1087
RemoteRepo::Local(ref mut l) => l.download_changes(pro_n, hashes, send, path).await?,RemoteRepo::Local(ref mut l) => {l.download_changes(progress_bar, hashes, send, path).await?} - replacement in pijul/src/remote/mod.rs at line 1091
s.download_changes(pro_n, hashes, send, path, full).await?s.download_changes(progress_bar, hashes, send, path, full).await? - replacement in pijul/src/remote/mod.rs at line 1095
h.download_changes(pro_n, hashes, send, path, full).await?h.download_changes(progress_bar, hashes, send, path, full).await? - replacement in pijul/src/remote/mod.rs at line 1147[12.16150]→[12.711:1024](∅→∅),[12.1407]→[12.711:1024](∅→∅),[12.105]→[12.2307:2364](∅→∅),[12.1024]→[12.2307:2364](∅→∅),[12.2307]→[12.2307:2364](∅→∅),[12.2364]→[12.1025:1081](∅→∅)
let mut pro = PROGRESS.borrow_mut().unwrap();let pro_a = pro.push(crate::progress::Cursor::Bar {i: 0,n: to_apply.len(),pre: "Downloading changes".into(),});let pro_b = if do_apply {Some(pro.push(crate::progress::Cursor::Bar {i: 0,n: to_apply.len(),pre: "Applying".into(),}))let apply_len = to_apply.len() as u64;let download_bar = ProgressBar::new(apply_len, DOWNLOAD_MESSAGE)?;let apply_bar = if do_apply {ProgressBar::new(apply_len, APPLY_MESSAGE)? - replacement in pijul/src/remote/mod.rs at line 1152
NoneProgressBar::hidden() - edit in pijul/src/remote/mod.rs at line 1154
std::mem::drop(pro); - edit in pijul/src/remote/mod.rs at line 1162
let cloned_download_bar = download_bar.clone(); - replacement in pijul/src/remote/mod.rs at line 1165
.download_changes(pro_a, &mut hash_recv, &mut send, &mut change_path_, false).download_changes(cloned_download_bar,&mut hash_recv,&mut send,&mut change_path_,false,) - edit in pijul/src/remote/mod.rs at line 1173
- replacement in pijul/src/remote/mod.rs at line 1199
.download_changes_rec(repo, hash_send, recv, send_ready, pro_a, waiting, asked).download_changes_rec(repo,hash_send,recv,send_ready,download_bar,waiting,asked,) - replacement in pijul/src/remote/mod.rs at line 1246
if let Some(pro_b) = pro_b {if let Some(apply_bar) = apply_bar.inner() { - replacement in pijul/src/remote/mod.rs at line 1248
PROGRESS.inner.lock().unwrap()[pro_b].incr();apply_bar.inc(1); - edit in pijul/src/remote/mod.rs at line 1264
debug!("join");PROGRESS.join(); - replacement in pijul/src/remote/mod.rs at line 1273
pro_n: usize,progress_bar: ProgressBar, - replacement in pijul/src/remote/mod.rs at line 1282
return Ok(())return Ok(()); - replacement in pijul/src/remote/mod.rs at line 1304
PROGRESS.borrow_mut().unwrap()[pro_n].incr_len();progress_bar.inc(1); - edit in pijul/src/remote/mod.rs at line 1345
let pro_n = {let mut pro = PROGRESS.borrow_mut().unwrap();pro.push(crate::progress::Cursor::Bar {i: 0,n: tag.len(),pre: "Downloading changes".into(),})}; - edit in pijul/src/remote/mod.rs at line 1346
let download_bar = ProgressBar::new(tag.len() as u64, DOWNLOAD_MESSAGE)?;let cloned_download_bar = download_bar.clone(); - replacement in pijul/src/remote/mod.rs at line 1352
pro_n,cloned_download_bar, - replacement in pijul/src/remote/mod.rs at line 1373
.download_changes_rec(repo, send_hash, recv_signal, send_ready, pro_n, waiting, asked).download_changes_rec(repo,send_hash,recv_signal,send_ready,download_bar,waiting,asked,) - replacement in pijul/src/remote/mod.rs at line 1454[12.75363]→[12.2118:2410](∅→∅),[12.2410]→[12.75363:75405](∅→∅),[12.4279]→[12.75363:75405](∅→∅),[12.75363]→[12.75363:75405](∅→∅),[12.75405]→[12.2108:2126](∅→∅),[12.2126]→[12.2411:2507](∅→∅),[12.2507]→[12.2215:2282](∅→∅),[12.4512]→[12.2215:2282](∅→∅),[12.2215]→[12.2215:2282](∅→∅),[12.2282]→[12.76064:76076](∅→∅),[12.76064]→[12.76064:76076](∅→∅)
let mut progress = PROGRESS.borrow_mut().unwrap();let pro_n = {progress.push(crate::progress::Cursor::Bar {i: 0,n: 0,pre: "Completing changes".into(),})};std::mem::drop(progress);let t = tokio::spawn(async move {self_.download_changes(pro_n, &mut recv_hash, &mut send_sig, &mut changes_dir, true).await?;Ok::<_, anyhow::Error>(self_)});let dummy_bar = ProgressBar::hidden();let _completion_spinner = Spinner::new(COMPLETE_MESSAGE)?;let t: tokio::task::JoinHandle<Result<RemoteRepo, anyhow::Error>> =tokio::spawn(async move {self_.download_changes(dummy_bar,&mut recv_hash,&mut send_sig,&mut changes_dir,true,).await?;Ok::<_, anyhow::Error>(self_)}); - edit in pijul/src/remote/mod.rs at line 1484
PROGRESS.borrow_mut().unwrap()[pro_n].incr_len(); - edit in pijul/src/remote/mod.rs at line 1507
PROGRESS.borrow_mut().unwrap()[pro_n].incr_len(); - edit in pijul/src/remote/mod.rs at line 1515
PROGRESS.join(); - edit in pijul/src/remote/local.rs at line 11
use pijul_interaction::progress::ProgressBar; - replacement in pijul/src/remote/local.rs at line 142
pro_n: usize,progress_bar: ProgressBar, - replacement in pijul/src/remote/local.rs at line 178
upload_changes(pro_n, &store, &mut *txn.write(), &channel, changes)?;upload_changes(progress_bar, &store, &mut *txn.write(), &channel, changes)?; - replacement in pijul/src/remote/local.rs at line 196
pro_n: usize,progress_bar: ProgressBar, - replacement in pijul/src/remote/local.rs at line 212
super::PROGRESS.borrow_mut().unwrap()[pro_n].incr();progress_bar.inc(1); - replacement in pijul/src/remote/local.rs at line 268
pro_n: usize,progress_bar: ProgressBar, - replacement in pijul/src/remote/local.rs at line 294
super::PROGRESS.borrow_mut().unwrap()[pro_n].incr();progress_bar.inc(1); - edit in pijul/src/remote/http.rs at line 10
use pijul_interaction::progress::ProgressBar; - replacement in pijul/src/remote/http.rs at line 42
tokio::fs::create_dir_all(&path.parent().unwrap()).await.unwrap();tokio::fs::create_dir_all(&path.parent().unwrap()).await.unwrap(); - replacement in pijul/src/remote/http.rs at line 147
pro_n: usize,progress_bar: ProgressBar, - replacement in pijul/src/remote/http.rs at line 162
super::PROGRESS.borrow_mut().unwrap()[pro_n].incr();progress_bar.inc(1); - replacement in pijul/src/remote/http.rs at line 168
continuecontinue; - replacement in pijul/src/remote/http.rs at line 174
breakbreak; - replacement in pijul/src/remote/http.rs at line 211
super::PROGRESS.borrow_mut().unwrap()[pro_n].incr();progress_bar.inc(1); - replacement in pijul/src/remote/http.rs at line 225
pro_n: usize,progress_bar: ProgressBar, - replacement in pijul/src/remote/http.rs at line 290
super::PROGRESS.borrow_mut().unwrap()[pro_n].incr();progress_bar.inc(1); - replacement in pijul/src/remote/http.rs at line 542
pub async fn prove(&mut self,key: libpijul::key::SKey,) -> Result<(), anyhow::Error> {pub async fn prove(&mut self, key: libpijul::key::SKey) -> Result<(), anyhow::Error> { - edit in pijul/src/main.rs at line 4
mod progress; - edit in pijul/src/commands/reset.rs at line 11
use crate::progress::PROGRESS; - edit in pijul/src/commands/reset.rs at line 12
use pijul_interaction::progress::{Spinner, OUTPUT_MESSAGE}; - replacement in pijul/src/commands/reset.rs at line 192
PROGRESS.borrow_mut().unwrap().push(crate::progress::Cursor::Spin {i: 0,pre: "Outputting repository".into(),});let _output_spinner = Spinner::new(OUTPUT_MESSAGE)?; - edit in pijul/src/commands/reset.rs at line 217
PROGRESS.join(); - replacement in pijul/src/commands/reset.rs at line 218
PROGRESS.borrow_mut().unwrap().push(crate::progress::Cursor::Spin {i: 0,pre: "Outputting repository".into(),});let _output_spinner = Spinner::new(OUTPUT_MESSAGE)?; - edit in pijul/src/commands/reset.rs at line 239
PROGRESS.join(); - edit in pijul/src/commands/pushpull.rs at line 15
use crate::progress::PROGRESS; - edit in pijul/src/commands/pushpull.rs at line 17
use pijul_interaction::progress::{ProgressBar, Spinner, APPLY_MESSAGE, OUTPUT_MESSAGE}; - replacement in pijul/src/commands/pushpull.rs at line 456
let mut pro = PROGRESS.borrow_mut().unwrap();let n = pro.push(crate::progress::Cursor::Bar {i: 0,n: to_download.len(),pre: "Applying".into(),});std::mem::drop(pro);let apply_bar = ProgressBar::new(to_download.len() as u64, APPLY_MESSAGE)?; - replacement in pijul/src/commands/pushpull.rs at line 477
PROGRESS.borrow_mut().unwrap()[n].incr()apply_bar.inc(1); - edit in pijul/src/commands/pushpull.rs at line 538
PROGRESS.borrow_mut().unwrap().push(crate::progress::Cursor::Spin {i: 0,pre: "Outputting repository".into(),}); - edit in pijul/src/commands/pushpull.rs at line 539
let _output_spinner = Spinner::new(OUTPUT_MESSAGE); - replacement in pijul/src/commands/pushpull.rs at line 548
continuecontinue; - replacement in pijul/src/commands/pushpull.rs at line 551
},} - edit in pijul/src/commands/pushpull.rs at line 571
PROGRESS.join(); - edit in pijul/src/commands/apply.rs at line 10
use crate::progress::PROGRESS; - edit in pijul/src/commands/apply.rs at line 11
use pijul_interaction::progress::{Spinner, OUTPUT_MESSAGE}; - replacement in pijul/src/commands/apply.rs at line 147
PROGRESS.borrow_mut().unwrap().push(crate::progress::Cursor::Spin {i: 0,pre: "Outputting repository".into(),});let _output_spinner = Spinner::new(OUTPUT_MESSAGE)?; - edit in pijul/src/commands/apply.rs at line 219
PROGRESS.join(); - edit in pijul/Cargo.toml at line 94
terminal_size = "0.1" - edit in pijul/Cargo.toml at line 110[86.310][87.0]
pijul-interaction = { path = "../pijul-interaction" }