pull+push status, add info reports

[?]
Jan 24, 2026, 8:27 PM
UTDTZCTXAAP6AHENYQP7MOQ5QNIKKXN34NV2ONWEGM4HA4FU637AC

Dependencies

  • [2] 6YZAVBWU Initial commit
  • [3] SWWE2R6M display basic repo stuff
  • [4] UB2ITZJS refresh changed files on FS changes
  • [5] KT5UYXGK fix selection after adding file, add changed file diffs
  • [6] YBJRDOTC make all repo actions async
  • [7] D7A7MSIH allow to defer or abandon record, add buttons
  • [8] PTFDJ567 add untracked files encoding
  • [9] GWZGYNIB add view crate
  • [10] 3SYSJKYL add app icon
  • [11] 23SFYK4Q big view refactor into a new crate
  • [12] OPXFZKEB view tests setup
  • [13] ACDXXAX2 refactor main's updates into smaller fns
  • [14] SGHF5QCV cargo update
  • [15] DXAYDIMQ update to latest pijul
  • [16] SASAN2XC use nav-scrollable
  • [17] 3TLPJ57B alt scroll via context and couple fixes
  • [18] PTWZYQFR use nav-scrollable for repo status
  • [19] A6Z4O6RC actions menu
  • [20] 7BLZN73O add a key to refresh repo
  • [21] 5ZRDYL6K fork channel, fix recording esc key
  • [22] 3XRG4BB6 rewritten nav-scrollable!
  • [23] WAOGSCOJ very nice refactor, wip adding channels logs
  • [24] WH57EHNM update tests
  • [25] EJPSD5XO shared allowed actions conditions between update and view
  • [26] YK3MOJJL chonky refactor, wip other channels logs & diffs
  • [27] 7WCB5YQJ refactor msgs and modules
  • [28] AZ5D2LQU allow to set record description
  • [29] PKLUHYE4 allow to copy change hash
  • [30] CULHFNIV add error report view
  • [31] U3EAZKHR allow to copy error report
  • [32] KF2LDB5Y handle repo init errors
  • [33] IFQPVMBD error handling for repo actions
  • [34] LFEMJYYD start of to_record selection
  • [35] 5O4FWCFP add tests to_record selection and improve it
  • [36] FU6P5QLG indicate when a file is a dir with appended '/'
  • [37] YGZ3VCW4 add push
  • [38] ODCT4QJN add pull
  • [39] 2VUX5BTD load identity
  • [40] UPWS6J3B filter to-record changes from selection
  • [41] KLR5FRIB add fs state read/write of repos
  • [42] PKJCFSBM theme improvements
  • [43] LNAL3372 update iced
  • [44] OQ6HSAWH show record log
  • [45] NWJD6VM6 mv libflowers libflorescence
  • [46] AMPZ2BXK show changed files diffs (only Edit atm)
  • [47] ZD56BUSU add back +/- bg colors
  • [48] WIFVLV37 nav-scrollabe: detect size to determine if needs scrolling, msg when ready
  • [49] JZXYSIYD channel selection!
  • [50] 2SLTGWP6 add change files diffs to-record selection
  • [51] S2NVIFXR allow to enter record msg
  • [*] MYGIBRRH wip custom theme

Change contents

  • replacement in libflorescence/src/repo.rs at line 77
    [23.580][37.138:148](),[37.148][38.64:74]()
    Push,
    Pull,
    [23.580]
    [23.580]
    Push {
    channel: String,
    },
    Pull {
    channel: String,
    },
  • replacement in libflorescence/src/repo.rs at line 112
    [37.183][38.75:111]()
    result: anyhow::Result<()>,
    [37.183]
    [38.111]
    result: Result<(), PushError>,
    channel: String,
  • replacement in libflorescence/src/repo.rs at line 116
    [38.131][37.183:219](),[37.183][37.183:219]()
    result: anyhow::Result<()>,
    [38.131]
    [37.219]
    result: Result<(), PullError>,
    channel: String,
  • edit in libflorescence/src/repo.rs at line 119
    [37.226]
    [6.281]
    }
    #[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
    [3.266]
    [3.266]
    #[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
    [23.2458][37.1874:2022]()
    MsgIn::Push => {
    let result = push(&internal_state.path).await;
    let _ = msg_out_tx.send(MsgOut::Pushed { result });
    [23.2458]
    [38.132]
    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
    [38.142][38.142:290]()
    MsgIn::Pull => {
    let result = pull(&internal_state.path).await;
    let _ = msg_out_tx.send(MsgOut::Pulled { result });
    [38.142]
    [37.2022]
    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
    [37.2125][37.2125:2188]()
    async fn push(repo_path: &Path) -> Result<(), anyhow::Error> {
    [37.2125]
    [37.2188]
    async fn push(repo_path: &Path, channel_name: &str) -> Result<(), PushError> {
  • replacement in libflorescence/src/repo.rs at line 1214
    [37.2251][37.2251:2345]()
    let channel_name = current_channel(&repo)?;
    let txn = repo.pristine.arc_txn_begin()?;
    [37.2251]
    [37.2345]
    let txn = repo.pristine.arc_txn_begin().context("Begin pijul txn")?;
  • replacement in libflorescence/src/repo.rs at line 1218
    [37.2444][37.2444:2477]()
    bail!("Missing remote");
    [37.2444]
    [37.2477]
    return Err(anyhow!("Missing remote"))?;
  • replacement in libflorescence/src/repo.rs at line 1235
    [37.2789][37.2789:2863]()
    let mut channel = txn.write().open_or_create_channel(&channel_name)?;
    [37.2789]
    [37.2863]
    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
    [37.3090][37.3090:3184]()
    if to_upload.is_empty() {
    txn.commit()?;
    bail!("Nothing to push");
    }
  • replacement in libflorescence/src/repo.rs at line 1254
    [37.3387][37.3387:3444]()
    txn.commit()?;
    bail!("Nothing to push");
    [37.3387]
    [37.3444]
    txn.commit().context("Commit")?;
    return Err(PushError::Empty);
  • replacement in libflorescence/src/repo.rs at line 1266
    [37.3633][37.3633:3652]()
    txn.commit()?;
    [37.3633]
    [37.3652]
    txn.commit().context("Commit")?;
  • replacement in libflorescence/src/repo.rs at line 1312
    [38.392][38.392:455]()
    async fn pull(repo_path: &Path) -> Result<(), anyhow::Error> {
    [38.392]
    [38.455]
    async fn pull(repo_path: &Path, channel_name: &str) -> Result<(), PullError> {
  • replacement in libflorescence/src/repo.rs at line 1314
    [38.522][38.522:616]()
    let channel_name = current_channel(&repo)?;
    let txn = repo.pristine.arc_txn_begin()?;
    [38.522]
    [38.616]
    let txn = repo.pristine.arc_txn_begin().context("Begin txn")?;
  • replacement in libflorescence/src/repo.rs at line 1316
    [38.617][38.617:691]()
    let mut channel = txn.write().open_or_create_channel(&channel_name)?;
    [38.617]
    [38.691]
    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
    [38.790][38.790:822]()
    bail!("Missing remote")
    [38.790]
    [38.822]
    return Err(anyhow!("Missing remote"))?;
  • replacement in libflorescence/src/repo.rs at line 1359
    [38.1700][38.1700:1766]()
    txn.write().unrecord(&repo.changes, &channel, h, 0)?;
    [38.1700]
    [38.1766]
    txn.write()
    .unrecord(&repo.changes, &channel, h, 0)
    .context("Unrecord")?;
  • replacement in libflorescence/src/repo.rs at line 1363
    [38.1776][38.1776:1833]()
    txn.commit()?;
    bail!("Nothing to pull");
    [38.1776]
    [38.1833]
    txn.commit().context("Commit")?;
    return Err(PullError::Empty);
  • replacement in libflorescence/src/repo.rs at line 1381
    [38.2395][38.2395:2419]()
    )?;
    [38.2395]
    [38.2419]
    )
    .context("Apply change")?;
  • replacement in libflorescence/src/repo.rs at line 1385
    [38.2485][38.2485:2597]()
    if let Some(n) =
    txn.channel_has_state(&channel.states, &s.into())?
    [38.2485]
    [38.2597]
    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
    [38.2619][38.2619:2690]()
    txn.put_tags(&mut channel.tags, n.into(), s)?;
    [38.2619]
    [38.2690]
    txn.put_tags(&mut channel.tags, n.into(), s)
    .context("Put tags")?;
  • replacement in libflorescence/src/repo.rs at line 1392
    [38.2719][38.2719:2750]()
    bail!(
    [38.2719]
    [38.2750]
    return Err(anyhow!(
  • replacement in libflorescence/src/repo.rs at line 1396
    [38.2951][38.2951:2981]()
    )
    [38.2951]
    [38.2981]
    ))?;
  • replacement in libflorescence/src/repo.rs at line 1418
    [38.3540][38.3540:3607]()
    if let Some(int) = txn_.get_internal(&d.into())? {
    [38.3540]
    [38.3607]
    if let Some(int) =
    txn_.get_internal(&d.into()).context("Get internal")?
    {
  • replacement in libflorescence/src/repo.rs at line 1422
    [38.3648][38.3648:3763]()
    for inode in txn_.iter_rev_touched(int)? {
    let (int_, inode) = inode?;
    [38.3648]
    [38.3763]
    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
    [38.4101][38.4101:4163]()
    .get_external(&inode.change)?
    [38.4101]
    [38.4163]
    .get_external(&inode.change)
    .context("Get external change")?
  • replacement in libflorescence/src/repo.rs at line 1466
    [38.5150][38.5150:5171]()
    )? {
    [38.5150]
    [38.5171]
    )
    .context("Find change path")?
    {
  • replacement in libflorescence/src/repo.rs at line 1503
    [38.6368][38.6368:6433]()
    std::thread::available_parallelism()?.get(),
    [38.6368]
    [38.6433]
    std::thread::available_parallelism()
    .context("Get available parallelism")?
    .get(),
  • replacement in libflorescence/src/repo.rs at line 1507
    [38.6456][38.6456:6475]()
    )?
    [38.6456]
    [38.6475]
    )
    .context("Output repo no pending")?
  • replacement in libflorescence/src/repo.rs at line 1518
    [38.6670][38.6670:6771]()
    txn.write().unrecord(&repo.changes, &channel, &h, 0)?;
    repo.changes.del_change(&h)?;
    [38.6670]
    [37.4665]
    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
    [38.6773][38.6773:6792]()
    txn.commit()?;
    [38.6773]
    [38.6792]
    txn.commit().context("Commit")?;
  • replacement in libflorescence/src/prelude.rs at line 2
    [33.11461][33.11461:11494]()
    pub use anyhow::{bail, Context};
    [33.11461]
    [8.14]
    pub use anyhow::{anyhow, bail, Context};
  • replacement in inflorescence_view/src/view.rs at line 8
    [30.70][28.937:1013](),[22.2464][28.937:1013]()
    use inflorescence_model::model::{Log, ReadyState, RecordChanges, SubState};
    [30.70]
    [34.202]
    use inflorescence_model::model::{
    IndexSet, Job, Log, ReadyState, RecordChanges, SubState,
    };
  • edit in inflorescence_view/src/view.rs at line 130
    [34.454]
    [23.4655]
    jobs,
  • edit in inflorescence_view/src/view.rs at line 1019
    [21.3334]
    [23.20014]
  • edit in inflorescence_view/src/view.rs at line 1024
    [21.3579]
    [21.3579]
    } 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
    [21.3621]
    [25.2605]
  • replacement in inflorescence_view/src/view.rs at line 1065
    [30.715][30.715:887]()
    button(text("↧").shaping(text::Shaping::Advanced)).on_press(
    Msg::Action(action::FilteredMsg::ToggleErrorReports),
    ),
    [30.715]
    [30.887]
    button(text("↧").shaping(text::Shaping::Advanced))
    .on_press(Msg::Action(action::FilteredMsg::ToggleReports)),
  • replacement in inflorescence_view/src/view.rs at line 1144
    [25.3075][25.3075:3133]()
    let row = row(buttons);
    el(row.spacing(2).wrap())
    [25.3075]
    [19.9919]
    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
    [34.2383]
    [18.2372]
    jobs: default(),
  • edit in inflorescence_view/src/view/test.rs at line 131
    [34.2414]
    [24.1666]
    jobs: default(),
  • edit in inflorescence_view/src/view/test.rs at line 174
    [34.2445]
    [24.2477]
    jobs: default(),
  • replacement in inflorescence_view/src/view/test.rs at line 188
    [30.3005][30.3005:3054]()
    let uniq_name = "loaded_shown_error_report";
    [30.3005]
    [30.3054]
    let uniq_name = "loaded_shown_reports";
  • edit in inflorescence_view/src/view/test.rs at line 207
    [34.2476]
    [30.3567]
    jobs: default(),
  • replacement in inflorescence_view/src/view/test.rs at line 220
    [30.3913][30.3913:3958]()
    level: report::Level::Error,
    [30.3913]
    [30.3958]
    level: report::Level::Info,
  • replacement in inflorescence_view/src/theme.rs at line 47
    [30.5374][30.5374:5426]()
    const REPORT_ERROR_COLOR: Color = color!(0x9d140e);
    [30.5374]
    [30.5426]
    const REPORT_INFO_COLOR: Color = color!(0x08992d);
  • edit in inflorescence_view/src/theme.rs at line 49
    [30.5480]
    [35.429]
    const REPORT_ERROR_COLOR: Color = color!(0x9d140e);
  • edit in inflorescence_view/src/theme.rs at line 255
    [30.5974]
    [30.5974]
    report::Level::Info => REPORT_INFO_COLOR,
  • edit in inflorescence_view/Cargo.toml at line 30
    [11.25345]
    [12.9490]
    workspace = true
    [dependencies.itertools]
  • edit in inflorescence_model/src/model.rs at line 1
    [27.3550]
    [34.12804]
    pub use indexmap::IndexSet;
  • edit in inflorescence_model/src/model.rs at line 69
    [34.12896]
    [27.5171]
    pub jobs: IndexSet<Job>,
  • edit in inflorescence_model/src/model.rs at line 123
    [27.6686]
    [27.6686]
    }
    /// 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
    [29.205][30.6708:6732](),[30.6732][31.40:71]()
    ToggleErrorReports,
    ClipboardCopyErrorReports,
    [29.205]
    [34.12964]
    ToggleReports,
    ClipboardCopyReports,
  • replacement in inflorescence_model/src/action.rs at line 80
    [29.254][30.6733:6791](),[30.6791][31.72:144]()
    (ToggleErrorReports, ToggleErrorReports) => true,
    (ClipboardCopyErrorReports, ClipboardCopyErrorReports) => true,
    [29.254]
    [34.13127]
    (ToggleReports, ToggleReports) => true,
    (ClipboardCopyReports, ClipboardCopyReports) => true,
  • replacement in inflorescence_model/src/action.rs at line 121
    [29.292][30.6792:6834](),[30.6834][31.145:194]()
    (ToggleErrorReports, _) => false,
    (ClipboardCopyErrorReports, _) => false,
    [29.292]
    [34.13524]
    (ToggleReports, _) => false,
    (ClipboardCopyReports, _) => false,
  • replacement in inflorescence_model/src/action.rs at line 142
    [30.7058][31.195:221]()
    "hide errors"
    [30.7058]
    [30.7084]
    "hide reports"
  • replacement in inflorescence_model/src/action.rs at line 144
    [30.7101][31.222:248]()
    "show errors"
    [30.7101]
    [30.7127]
    "show reports"
  • replacement in inflorescence_model/src/action.rs at line 147
    [30.7170][30.7170:7194]()
    key: "C-e",
    [30.7170]
    [30.7194]
    key: "S-r",
  • replacement in inflorescence_model/src/action.rs at line 149
    [30.7213][30.7213:7269]()
    msg: Some(FilteredMsg::ToggleErrorReports),
    [30.7213]
    [30.7269]
    msg: Some(FilteredMsg::ToggleReports),
  • replacement in inflorescence_model/src/action.rs at line 155
    [31.344][31.344:449]()
    label: "copy errors",
    msg: Some(FilteredMsg::ClipboardCopyErrorReports),
    [31.344]
    [31.449]
    label: "copy reports",
    msg: Some(FilteredMsg::ClipboardCopyReports),
  • replacement in inflorescence_model/src/action.rs at line 342
    [29.445][37.4881:4927]()
    let push = || Binding {
    key: "P",
    [29.445]
    [37.4927]
    let push = |can_push: bool| Binding {
    key: "S-p",
  • replacement in inflorescence_model/src/action.rs at line 345
    [37.4950][37.4950:4988]()
    msg: Some(FilteredMsg::Push),
    [37.4950]
    [37.4988]
    msg: can_push.then_some(FilteredMsg::Push),
  • replacement in inflorescence_model/src/action.rs at line 347
    [37.4995][38.9717:9763]()
    let pull = || Binding {
    key: "F",
    [37.4995]
    [38.9763]
    let pull = |can_pull: bool| Binding {
    key: "S-f",
  • replacement in inflorescence_model/src/action.rs at line 350
    [38.9786][38.9786:9824]()
    msg: Some(FilteredMsg::Pull),
    [38.9786]
    [38.9824]
    msg: can_pull.then_some(FilteredMsg::Pull),
  • edit in inflorescence_model/src/action.rs at line 362
    [34.14581]
    [25.9194]
    can_push_pull,
  • edit in inflorescence_model/src/action.rs at line 371
    [36.9979][36.9979:10041]()
    push_if(can_record, start_record, ma)
  • edit in inflorescence_model/src/action.rs at line 375
    [36.10232][36.10232:10294]()
    push_if(can_record, start_record, ma)
  • edit in inflorescence_model/src/action.rs at line 379
    [36.10489][36.10489:10551]()
    push_if(can_record, start_record, ma)
  • edit in inflorescence_model/src/action.rs at line 383
    [36.10750][36.10750:10812]()
    push_if(can_record, start_record, ma)
  • edit in inflorescence_model/src/action.rs at line 386
    [36.10849]
    [25.9947]
    push_if(can_record, start_record, ma);
  • replacement in inflorescence_model/src/action.rs at line 393
    [34.14738][37.4996:5025](),[37.5025][38.9832:9861]()
    ma.push(push());
    ma.push(pull());
    [34.14738]
    [25.10048]
    ma.push(push(can_push_pull));
    ma.push(pull(can_push_pull));
  • edit in inflorescence_model/src/action.rs at line 590
    [34.15264]
    [25.13596]
    can_push_pull: bool,
  • edit in inflorescence_model/src/action.rs at line 680
    [34.15347]
    [25.15286]
    jobs,
  • edit in inflorescence_model/src/action.rs at line 703
    [25.15998]
    [25.15998]
    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
    [34.15827]
    [25.17255]
    can_push_pull,
  • edit in inflorescence_model/src/action.rs at line 797
    [34.16354]
    [25.19067]
    can_push_pull,
  • edit in inflorescence_model/src/action.rs at line 840
    [34.16716]
    [25.20786]
    can_push_pull,
  • edit in inflorescence_model/src/action.rs at line 850
    [34.16810]
    [25.21024]
    can_push_pull,
  • edit in inflorescence_model/Cargo.toml at line 17
    [23.39245]
    [23.39245]
    workspace = true
    [dependencies.indexmap]
  • replacement in inflorescence/src/main.rs at line 11
    [16.2366][28.9471:9543]()
    use inflorescence_model::model::{Log, Logs, ReadyState, RecordChanges};
    [16.2366]
    [34.16818]
    use inflorescence_model::model::{Job, Log, Logs, ReadyState, RecordChanges};
  • edit in inflorescence/src/main.rs at line 156
    [34.16922]
    [23.80705]
    jobs: default(),
  • replacement in inflorescence/src/main.rs at line 282
    [25.24625][26.60091:60180]()
    // dbg!("Action not allowed", msg);
    // dbg!(&state.sub.allowed_actions);
    [25.24625]
    [26.60180]
    info!("Action not allowed: {msg:?}");
  • replacement in inflorescence/src/main.rs at line 492
    [29.2205][30.7484:7537]()
    action::FilteredMsg::ToggleErrorReports => {
    [29.2205]
    [31.610]
    action::FilteredMsg::ToggleReports => {
  • replacement in inflorescence/src/main.rs at line 505
    [31.922][31.922:982]()
    action::FilteredMsg::ClipboardCopyErrorReports => {
    [31.922]
    [31.982]
    action::FilteredMsg::ClipboardCopyReports => {
  • replacement in inflorescence/src/main.rs at line 557
    [37.5615][38.9869:9936](),[38.9936][37.5615:5678](),[37.5615][37.5615:5678]()
    // TODO switch state while pushing to display progress
    state.repo_tx_in.send(repo::MsgIn::Push).unwrap();
    [37.5615]
    [34.18160]
    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
    [38.9976][38.9976:10106]()
    // TODO switch state while pulling to display progress
    state.repo_tx_in.send(repo::MsgIn::Pull).unwrap();
    [38.9976]
    [38.10106]
    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
    [13.932]
    [33.11922]
    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
    [37.5932][37.5932:6026](),[37.6026][33.13260:13320](),[33.13260][33.13260:13320]()
    repo::MsgOut::Pushed { result } => match result {
    Ok(()) => Task::none(),
    Err(err) => report_err(state, err.to_string()),
    [37.5932]
    [33.13320]
    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
    [33.13331][38.10142:10296]()
    repo::MsgOut::Pulled { result } => match result {
    Ok(()) => Task::none(),
    Err(err) => report_err(state, err.to_string()),
    [33.13331]
    [38.10296]
    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
    [34.18238]
    [23.91307]
    jobs: default(),
  • edit in inflorescence/src/main.rs at line 1181
    [34.18265]
    [23.92314]
    jobs: _,
  • replacement in inflorescence/src/main.rs at line 1597
    [31.1175][31.1175:1254]()
    action(action::FilteredMsg::ClipboardCopyErrorReports)
    [31.1175]
    [31.1254]
    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
    [27.14467]
    [19.13406]
    }
    "r" if mods == Modifiers::CTRL => {
    action(action::FilteredMsg::RefreshRepo)
  • edit in inflorescence/src/main.rs at line 1608
    [19.13428]
    [11.28349]
    "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
    [30.8171]
    [30.8171]
    Info,
  • edit in iced_expl_widget/src/report.rs at line 319
    [31.1601]
    [31.1601]
    Level::Info => "INFO",
  • edit in iced_expl_widget/src/report.rs at line 327
    [31.1802]
    [32.3140]
    }
    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
    [32.3198]
    [32.3198]
    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
    [32.3257][32.3257:3286]()
    level: Level::Error,
    [32.3257]
    [32.3286]
    level,
  • edit in Cargo.toml at line 71
    [5.7853]
    [15.1185]
    [workspace.dependencies.itertools]
    version = "0.14"
  • replacement in Cargo.lock at line 1211
    [4.2498][14.2363:2386]()
    "windows-sys 0.60.2",
    [4.2498]
    [2.24404]
    "windows-sys 0.61.2",
  • edit in Cargo.lock at line 2563
    [23.103045]
    [23.103045]
    "indexmap",
  • edit in Cargo.lock at line 2575
    [23.103104]
    [9.1043]
    "itertools 0.14.0",
  • edit in Cargo.lock at line 2641
    [10.5291]
    [10.5291]
    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
    [10.8545][10.8545:8559]()
    "itertools",
    [10.8545]
    [10.8559]
    "itertools 0.12.1",
  • edit in Cargo.lock at line 6712
    [2.95004][2.95004:95019](),[2.95019][14.13173:13400]()
    ]
    [[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",