pull+push status, add info reports
[?]
Jan 24, 2026, 8:27 PM
UTDTZCTXAAP6AHENYQP7MOQ5QNIKKXN34NV2ONWEGM4HA4FU637ACDependencies
- [2]
6YZAVBWUInitial commit - [3]
SWWE2R6Mdisplay basic repo stuff - [4]
UB2ITZJSrefresh changed files on FS changes - [5]
KT5UYXGKfix selection after adding file, add changed file diffs - [6]
YBJRDOTCmake all repo actions async - [7]
D7A7MSIHallow to defer or abandon record, add buttons - [8]
PTFDJ567add untracked files encoding - [9]
GWZGYNIBadd view crate - [10]
3SYSJKYLadd app icon - [11]
23SFYK4Qbig view refactor into a new crate - [12]
OPXFZKEBview tests setup - [13]
ACDXXAX2refactor main's updates into smaller fns - [14]
SGHF5QCVcargo update - [15]
DXAYDIMQupdate to latest pijul - [16]
SASAN2XCuse nav-scrollable - [17]
3TLPJ57Balt scroll via context and couple fixes - [18]
PTWZYQFRuse nav-scrollable for repo status - [19]
A6Z4O6RCactions menu - [20]
7BLZN73Oadd a key to refresh repo - [21]
5ZRDYL6Kfork channel, fix recording esc key - [22]
3XRG4BB6rewritten nav-scrollable! - [23]
WAOGSCOJvery nice refactor, wip adding channels logs - [24]
WH57EHNMupdate tests - [25]
EJPSD5XOshared allowed actions conditions between update and view - [26]
YK3MOJJLchonky refactor, wip other channels logs & diffs - [27]
7WCB5YQJrefactor msgs and modules - [28]
AZ5D2LQUallow to set record description - [29]
PKLUHYE4allow to copy change hash - [30]
CULHFNIVadd error report view - [31]
U3EAZKHRallow to copy error report - [32]
KF2LDB5Yhandle repo init errors - [33]
IFQPVMBDerror handling for repo actions - [34]
LFEMJYYDstart of to_record selection - [35]
5O4FWCFPadd tests to_record selection and improve it - [36]
FU6P5QLGindicate when a file is a dir with appended '/' - [37]
YGZ3VCW4add push - [38]
ODCT4QJNadd pull - [39]
2VUX5BTDload identity - [40]
UPWS6J3Bfilter to-record changes from selection - [41]
KLR5FRIBadd fs state read/write of repos - [42]
PKJCFSBMtheme improvements - [43]
LNAL3372update iced - [44]
OQ6HSAWHshow record log - [45]
NWJD6VM6mv libflowers libflorescence - [46]
AMPZ2BXKshow changed files diffs (only Edit atm) - [47]
ZD56BUSUadd back +/- bg colors - [48]
WIFVLV37nav-scrollabe: detect size to determine if needs scrolling, msg when ready - [49]
JZXYSIYDchannel selection! - [50]
2SLTGWP6add change files diffs to-record selection - [51]
S2NVIFXRallow to enter record msg - [*]
MYGIBRRHwip custom theme
Change contents
- replacement in libflorescence/src/repo.rs at line 77
Push,Pull,Push {channel: String,},Pull {channel: String,}, - replacement in libflorescence/src/repo.rs at line 112
result: anyhow::Result<()>,result: Result<(), PushError>,channel: String, - replacement in libflorescence/src/repo.rs at line 116
result: anyhow::Result<()>,result: Result<(), PullError>,channel: String, - edit in libflorescence/src/repo.rs at line 119
}#[derive(Debug, Error)]pub enum PushError {#[error("Nothing to push")]Empty,#[error("{0}")]Other(#[from] anyhow::Error), - edit in libflorescence/src/repo.rs at line 129
#[derive(Debug, Error)]pub enum PullError {#[error("Nothing to pull")]Empty,#[error("{0}")]Other(#[from] anyhow::Error),} - replacement in libflorescence/src/repo.rs at line 478
MsgIn::Push => {let result = push(&internal_state.path).await;let _ = msg_out_tx.send(MsgOut::Pushed { result });MsgIn::Push { channel } => {let result = push(&internal_state.path, &channel).await;let _ = msg_out_tx.send(MsgOut::Pushed { channel, result }); - replacement in libflorescence/src/repo.rs at line 482
MsgIn::Pull => {let result = pull(&internal_state.path).await;let _ = msg_out_tx.send(MsgOut::Pulled { result });MsgIn::Pull { channel } => {let result = pull(&internal_state.path, &channel).await;let _ = msg_out_tx.send(MsgOut::Pulled { channel, result }); - replacement in libflorescence/src/repo.rs at line 1212
async fn push(repo_path: &Path) -> Result<(), anyhow::Error> {async fn push(repo_path: &Path, channel_name: &str) -> Result<(), PushError> { - replacement in libflorescence/src/repo.rs at line 1214
let channel_name = current_channel(&repo)?;let txn = repo.pristine.arc_txn_begin()?;let txn = repo.pristine.arc_txn_begin().context("Begin pijul txn")?; - replacement in libflorescence/src/repo.rs at line 1218
bail!("Missing remote");return Err(anyhow!("Missing remote"))?; - replacement in libflorescence/src/repo.rs at line 1235
let mut channel = txn.write().open_or_create_channel(&channel_name)?;let mut channel = txn.write().open_or_create_channel(channel_name).context("Open or create channel")?; - edit in libflorescence/src/repo.rs at line 1248
if to_upload.is_empty() {txn.commit()?;bail!("Nothing to push");} - replacement in libflorescence/src/repo.rs at line 1254
txn.commit()?;bail!("Nothing to push");txn.commit().context("Commit")?;return Err(PushError::Empty); - replacement in libflorescence/src/repo.rs at line 1266
txn.commit()?;txn.commit().context("Commit")?; - replacement in libflorescence/src/repo.rs at line 1312
async fn pull(repo_path: &Path) -> Result<(), anyhow::Error> {async fn pull(repo_path: &Path, channel_name: &str) -> Result<(), PullError> { - replacement in libflorescence/src/repo.rs at line 1314
let channel_name = current_channel(&repo)?;let txn = repo.pristine.arc_txn_begin()?;let txn = repo.pristine.arc_txn_begin().context("Begin txn")?; - replacement in libflorescence/src/repo.rs at line 1316
let mut channel = txn.write().open_or_create_channel(&channel_name)?;let mut channel = txn.write().open_or_create_channel(channel_name).context("Open or create channel")?; - replacement in libflorescence/src/repo.rs at line 1323
bail!("Missing remote")return Err(anyhow!("Missing remote"))?; - replacement in libflorescence/src/repo.rs at line 1359
txn.write().unrecord(&repo.changes, &channel, h, 0)?;txn.write().unrecord(&repo.changes, &channel, h, 0).context("Unrecord")?; - replacement in libflorescence/src/repo.rs at line 1363
txn.commit()?;bail!("Nothing to pull");txn.commit().context("Commit")?;return Err(PullError::Empty); - replacement in libflorescence/src/repo.rs at line 1381
)?;).context("Apply change")?; - replacement in libflorescence/src/repo.rs at line 1385
if let Some(n) =txn.channel_has_state(&channel.states, &s.into())?if let Some(n) = txn.channel_has_state(&channel.states, &s.into()).context("Check if channel has state")? - replacement in libflorescence/src/repo.rs at line 1389
txn.put_tags(&mut channel.tags, n.into(), s)?;txn.put_tags(&mut channel.tags, n.into(), s).context("Put tags")?; - replacement in libflorescence/src/repo.rs at line 1392
bail!(return Err(anyhow!( - replacement in libflorescence/src/repo.rs at line 1396
)))?; - replacement in libflorescence/src/repo.rs at line 1418
if let Some(int) = txn_.get_internal(&d.into())? {if let Some(int) =txn_.get_internal(&d.into()).context("Get internal")?{ - replacement in libflorescence/src/repo.rs at line 1422
for inode in txn_.iter_rev_touched(int)? {let (int_, inode) = inode?;for inode in txn_.iter_rev_touched(int).context("Iter rev touched")?{let (int_, inode) = inode.context("Get change node")?; - replacement in libflorescence/src/repo.rs at line 1435
.get_external(&inode.change)?.get_external(&inode.change).context("Get external change")? - replacement in libflorescence/src/repo.rs at line 1466
)? {).context("Find change path")?{ - replacement in libflorescence/src/repo.rs at line 1503
std::thread::available_parallelism()?.get(),std::thread::available_parallelism().context("Get available parallelism")?.get(), - replacement in libflorescence/src/repo.rs at line 1507
)?).context("Output repo no pending")? - replacement in libflorescence/src/repo.rs at line 1518
txn.write().unrecord(&repo.changes, &channel, &h, 0)?;repo.changes.del_change(&h)?;txn.write().unrecord(&repo.changes, &channel, &h, 0).context("Unrecord")?;repo.changes.del_change(&h).context("Delete change")?; - replacement in libflorescence/src/repo.rs at line 1524
txn.commit()?;txn.commit().context("Commit")?; - replacement in libflorescence/src/prelude.rs at line 2
pub use anyhow::{bail, Context};pub use anyhow::{anyhow, bail, Context}; - replacement in inflorescence_view/src/view.rs at line 8
use inflorescence_model::model::{Log, ReadyState, RecordChanges, SubState};use inflorescence_model::model::{IndexSet, Job, Log, ReadyState, RecordChanges, SubState,}; - edit in inflorescence_view/src/view.rs at line 130
jobs, - edit in inflorescence_view/src/view.rs at line 1019
- edit in inflorescence_view/src/view.rs at line 1024
} else {actions_inner};let actions_inner = if !jobs.is_empty() {let jobs = view_jobs(jobs, channel);actions_inner.push(jobs) - edit in inflorescence_view/src/view.rs at line 1034
- replacement in inflorescence_view/src/view.rs at line 1065
button(text("↧").shaping(text::Shaping::Advanced)).on_press(Msg::Action(action::FilteredMsg::ToggleErrorReports),),button(text("↧").shaping(text::Shaping::Advanced)).on_press(Msg::Action(action::FilteredMsg::ToggleReports)), - replacement in inflorescence_view/src/view.rs at line 1144
let row = row(buttons);el(row.spacing(2).wrap())el(row(buttons).spacing(2).wrap())}fn view_jobs<'a>(jobs: &IndexSet<Job>,current_channel: &str,) -> Element<'a, Msg, Theme> {let jobs: Vec<_> = itertools::intersperse_with(jobs.iter().map(|job| view_job(job, current_channel)),|| el(text(", ")),).collect();el(row(jobs).spacing(2).wrap())}fn view_job<'a>(job: &Job, current_channel: &str) -> Element<'a, Msg, Theme> {match job {Job::Pull { channel } => {if channel == current_channel {el(text("Pulling"))} else {el(text(format!("Pulling {channel}")))}}Job::Push { channel } => {if channel == current_channel {el(text("Pushing"))} else {el(text(format!("Pushing {channel}")))}}} - edit in inflorescence_view/src/view/test.rs at line 82
jobs: default(), - edit in inflorescence_view/src/view/test.rs at line 131
jobs: default(), - edit in inflorescence_view/src/view/test.rs at line 174
jobs: default(), - replacement in inflorescence_view/src/view/test.rs at line 188
let uniq_name = "loaded_shown_error_report";let uniq_name = "loaded_shown_reports"; - edit in inflorescence_view/src/view/test.rs at line 207
jobs: default(), - replacement in inflorescence_view/src/view/test.rs at line 220
level: report::Level::Error,level: report::Level::Info, - replacement in inflorescence_view/src/theme.rs at line 47
const REPORT_ERROR_COLOR: Color = color!(0x9d140e);const REPORT_INFO_COLOR: Color = color!(0x08992d); - edit in inflorescence_view/src/theme.rs at line 49
const REPORT_ERROR_COLOR: Color = color!(0x9d140e); - edit in inflorescence_view/src/theme.rs at line 255
report::Level::Info => REPORT_INFO_COLOR, - edit in inflorescence_view/Cargo.toml at line 30
workspace = true[dependencies.itertools] - edit in inflorescence_model/src/model.rs at line 1
pub use indexmap::IndexSet; - edit in inflorescence_model/src/model.rs at line 69
pub jobs: IndexSet<Job>, - edit in inflorescence_model/src/model.rs at line 123
}/// Background jobs#[derive(Debug, PartialEq, Eq, Hash)]pub enum Job {Pull { channel: String },Push { channel: String }, - replacement in inflorescence_model/src/action.rs at line 34
ToggleErrorReports,ClipboardCopyErrorReports,ToggleReports,ClipboardCopyReports, - replacement in inflorescence_model/src/action.rs at line 80
(ToggleErrorReports, ToggleErrorReports) => true,(ClipboardCopyErrorReports, ClipboardCopyErrorReports) => true,(ToggleReports, ToggleReports) => true,(ClipboardCopyReports, ClipboardCopyReports) => true, - replacement in inflorescence_model/src/action.rs at line 121
(ToggleErrorReports, _) => false,(ClipboardCopyErrorReports, _) => false,(ToggleReports, _) => false,(ClipboardCopyReports, _) => false, - replacement in inflorescence_model/src/action.rs at line 142
"hide errors""hide reports" - replacement in inflorescence_model/src/action.rs at line 144
"show errors""show reports" - replacement in inflorescence_model/src/action.rs at line 147
key: "C-e",key: "S-r", - replacement in inflorescence_model/src/action.rs at line 149
msg: Some(FilteredMsg::ToggleErrorReports),msg: Some(FilteredMsg::ToggleReports), - replacement in inflorescence_model/src/action.rs at line 155
label: "copy errors",msg: Some(FilteredMsg::ClipboardCopyErrorReports),label: "copy reports",msg: Some(FilteredMsg::ClipboardCopyReports), - replacement in inflorescence_model/src/action.rs at line 342
let push = || Binding {key: "P",let push = |can_push: bool| Binding {key: "S-p", - replacement in inflorescence_model/src/action.rs at line 345
msg: Some(FilteredMsg::Push),msg: can_push.then_some(FilteredMsg::Push), - replacement in inflorescence_model/src/action.rs at line 347
let pull = || Binding {key: "F",let pull = |can_pull: bool| Binding {key: "S-f", - replacement in inflorescence_model/src/action.rs at line 350
msg: Some(FilteredMsg::Pull),msg: can_pull.then_some(FilteredMsg::Pull), - edit in inflorescence_model/src/action.rs at line 362
can_push_pull, - edit in inflorescence_model/src/action.rs at line 371
push_if(can_record, start_record, ma) - edit in inflorescence_model/src/action.rs at line 375
push_if(can_record, start_record, ma) - edit in inflorescence_model/src/action.rs at line 379
push_if(can_record, start_record, ma) - edit in inflorescence_model/src/action.rs at line 383
push_if(can_record, start_record, ma) - edit in inflorescence_model/src/action.rs at line 386
push_if(can_record, start_record, ma); - replacement in inflorescence_model/src/action.rs at line 393
ma.push(push());ma.push(pull());ma.push(push(can_push_pull));ma.push(pull(can_push_pull)); - edit in inflorescence_model/src/action.rs at line 590
can_push_pull: bool, - edit in inflorescence_model/src/action.rs at line 680
jobs, - edit in inflorescence_model/src/action.rs at line 703
let can_push_pull = jobs.iter().all(|job| match job {model::Job::Pull { channel: c } | model::Job::Push { channel: c } => {c != channel}}); - edit in inflorescence_model/src/action.rs at line 738
can_push_pull, - edit in inflorescence_model/src/action.rs at line 797
can_push_pull, - edit in inflorescence_model/src/action.rs at line 840
can_push_pull, - edit in inflorescence_model/src/action.rs at line 850
can_push_pull, - edit in inflorescence_model/Cargo.toml at line 17
workspace = true[dependencies.indexmap] - replacement in inflorescence/src/main.rs at line 11
use inflorescence_model::model::{Log, Logs, ReadyState, RecordChanges};use inflorescence_model::model::{Job, Log, Logs, ReadyState, RecordChanges}; - edit in inflorescence/src/main.rs at line 156
jobs: default(), - replacement in inflorescence/src/main.rs at line 282
// dbg!("Action not allowed", msg);// dbg!(&state.sub.allowed_actions);info!("Action not allowed: {msg:?}"); - replacement in inflorescence/src/main.rs at line 492
action::FilteredMsg::ToggleErrorReports => {action::FilteredMsg::ToggleReports => { - replacement in inflorescence/src/main.rs at line 505
action::FilteredMsg::ClipboardCopyErrorReports => {action::FilteredMsg::ClipboardCopyReports => { - replacement in inflorescence/src/main.rs at line 557
// TODO switch state while pushing to display progressstate.repo_tx_in.send(repo::MsgIn::Push).unwrap();if let Some(ReadyState { repo, jobs, .. }) =model::is_ready_mut(&mut state.model){jobs.insert(model::Job::Push {channel: repo.channel.clone(),});state.repo_tx_in.send(repo::MsgIn::Push {channel: repo.channel.clone(),}).unwrap();} - replacement in inflorescence/src/main.rs at line 573
// TODO switch state while pulling to display progressstate.repo_tx_in.send(repo::MsgIn::Pull).unwrap();if let Some(ReadyState { repo, jobs, .. }) =model::is_ready_mut(&mut state.model){jobs.insert(model::Job::Pull {channel: repo.channel.clone(),});state.repo_tx_in.send(repo::MsgIn::Pull {channel: repo.channel.clone(),}).unwrap();} - edit in inflorescence/src/main.rs at line 734
let report_info = |state: &mut State, err: String| {report::show_info(&mut state.model.report, err);Task::none()}; - replacement in inflorescence/src/main.rs at line 778
repo::MsgOut::Pushed { result } => match result {Ok(()) => Task::none(),Err(err) => report_err(state, err.to_string()),repo::MsgOut::Pushed { channel, result } => {let task = match result {Ok(()) => report_info(state, format!("Pushed to {channel}")),Err(repo::PushError::Empty) => report_info(state, format!("Nothing to push to {channel}")),Err(err) => report_err(state, err.to_string()),};if let Some(ReadyState { jobs, .. }) =model::is_ready_mut(&mut state.model){jobs.swap_remove(&Job::Push{ channel });}task - replacement in inflorescence/src/main.rs at line 791
repo::MsgOut::Pulled { result } => match result {Ok(()) => Task::none(),Err(err) => report_err(state, err.to_string()),repo::MsgOut::Pulled { channel, result } =>{let task = match result {Ok(()) => report_info(state, format!("Pulled from {channel}")),Err(repo::PullError::Empty) => report_info(state, format!("Nothing to pull from {channel}")),Err(err) => report_err(state, err.to_string()),};if let Some(ReadyState { jobs, .. }) =model::is_ready_mut(&mut state.model){jobs.swap_remove(&Job::Pull{ channel });}task - edit in inflorescence/src/main.rs at line 1110
jobs: default(), - edit in inflorescence/src/main.rs at line 1181
jobs: _, - replacement in inflorescence/src/main.rs at line 1597
action(action::FilteredMsg::ClipboardCopyErrorReports)action(action::FilteredMsg::ClipboardCopyReports) - edit in inflorescence/src/main.rs at line 1601[19.13283]→[11.28327:28349](∅→∅),[27.14398]→[11.28327:28349](∅→∅),[25.28845]→[11.28327:28349](∅→∅),[11.28327]→[11.28327:28349](∅→∅),[11.28349]→[30.7641:7769](∅→∅)
}"e" if mods == Modifiers::CTRL => {action(action::FilteredMsg::ToggleErrorReports) - edit in inflorescence/src/main.rs at line 1604
}"r" if mods == Modifiers::CTRL => {action(action::FilteredMsg::RefreshRepo) - edit in inflorescence/src/main.rs at line 1608
"r" if mods == Modifiers::SHIFT => {action(action::FilteredMsg::ToggleReports)} - edit in inflorescence/src/main.rs at line 1614[17.128]→[20.449:505](∅→∅),[20.505]→[27.14533:14598](∅→∅),[17.578]→[7.2341:2363](∅→∅),[27.14598]→[7.2341:2363](∅→∅),[11.28467]→[7.2341:2363](∅→∅),[25.29021]→[7.2341:2363](∅→∅),[7.2341]→[7.2341:2363](∅→∅)
"l" if mods == Modifiers::CTRL => {action(action::FilteredMsg::RefreshRepo)} - edit in iced_expl_widget/src/report.rs at line 11
Info, - edit in iced_expl_widget/src/report.rs at line 319
Level::Info => "INFO", - edit in iced_expl_widget/src/report.rs at line 327
}pub fn show_info(report: &mut Container, msg: String) {show_log(report, msg, Level::Info) - edit in iced_expl_widget/src/report.rs at line 334
show_log(report, msg, Level::Error)}pub fn show_log(report: &mut Container, msg: String, level: Level) { - replacement in iced_expl_widget/src/report.rs at line 340
level: Level::Error,level, - edit in Cargo.toml at line 71
[workspace.dependencies.itertools]version = "0.14" - replacement in Cargo.lock at line 1211
"windows-sys 0.60.2","windows-sys 0.61.2", - edit in Cargo.lock at line 2563
"indexmap", - edit in Cargo.lock at line 2575
"itertools 0.14.0", - edit in Cargo.lock at line 2641
dependencies = ["either",][[package]]name = "itertools"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" - replacement in Cargo.lock at line 4521
"itertools","itertools 0.12.1", - edit in Cargo.lock at line 6712
][[package]]name = "windows-sys"version = "0.60.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"dependencies = ["windows-targets 0.53.2",