IOXNOVX2FJWPCEFVUHA5FEKIZJQT45R7VBAA43EPAKKVF5IWF4GAC 6YZAVBWU6E5FYOI5JGEIPXGZLIKAW6LS2AOFIQWEE5DMOPPCD5PQC KT5UYXGKEEXUHURNOYFVIG7WQ3Y3SJZMM2TP4OSW6NXSXQ5XXRHAC ELG3UDT6OJFEYSJR7HZEC65IUWBMGPPPCXEW3CDW5T74R6KC5LIAC A5YBC77VWH2LXCZJOPZORQJI5ZYABSCHJWVX5HVNWPM5RABXESLQC HOJZI52YIXKAYF766WR3SAOIFZH6YRMDOUE23VWEYNBZRBGEU25AC ONRCENKTUB4JJMPXNAQQYEWDYD54TAGOLWH742GF4EH3KTHV7YLQC VCNKFNUF7OWVSWC6I5D25KUZ3XZZICZ3LHWVPF2N5ZSP7LQ2JOUQC ACDXXAX26ZJJFKJDGRC2GOSJY5JHQWCSTP55SYI6D6LH5UIRYUBAC WXQBBQ2ACNPKCTDF7OTBLP342324ZIOJK42PUO2KT2IYVJ2ETCMAC JZXYSIYDPBWQZCAMGDZ5BFMN6SU73EVVDIYEGTDJN6DVOSBNHN4QC 5ZRDYL6KIQPUI3ZZETH5KJ64N6RUF7KYM3P6Q6HER5XVJZ7GZ4WQC 3XRG4BB6V5V4DICZCMOZMLQNTANWKPO7BBRATTXOZLRNSEUQIA5AC WAOGSCOJ5A372BZKHEYD2BCDBCENNVLFYW3INKUOOAZMDADDIFIQC EJPSD5XO43DWUBBZGNQMY4TMCAXL5EWCGX3OEHUERQ5GRASGWQLQC YK3MOJJLRYEKZ4FUCNJ3YKMTKOINWIYOJKR3ER7IRSGTC7O6FJZQC 7WCB5YQJJZIPUAFHTCQBWNI6ZM5XMIQJAKTLYTR7NOR5NKESRMDQC AZ5D2LQUSYVWVEP7ISFDSZTMZ65UEHZATILMDQ4TYLCKJH4Q3TIAC IFQPVMBD552DZ3B5HCM6W6MI2SB6576ZYJNU5KVA3O4YPZAUEFHAC TEDT26JQBWGATVTY6HZTIOGFR6BXW2BHSUKUTXTA7HOXARRQ5D6AC BJ3CYLUTYL3ODCU7XIQ2YIBQ6GMHP4IQ7HYMD4YCOPFRYEIYNWKQC FTRAPDYAI3KKJDIGZX6PX3HZBYKLPRD5VZ2P5MZSAP2246OPWUOAC YRGDFHABL6BRX55ZWIBGXX3ZX2R4WUV4BELP7JMW5AZX54P5BBIQC LPSUBGUBMG2QHJJSAWQ35SZIMUR62R6ODPWBS7TSNNXJ5UJCNABQC MORKDJUERANZOBUWRC2F5766BEYYWXANAF3YAQ6YQ55WFQA7X64QC OLDN7R342GOTIMPDTTXAWFUM6MX5VTEEXS4GMZM5DAMWGECFXLAQC 5BAPU7K6DRZD2DYLIW3GKD2SIM6ANP7RYWGDJ6JCGHB37MHJUMTAC TMDH7GPVR3J7OEIELEE7RM7KXBA5IMFBCCVJTEGGMLYJZZCOLJ6QC SEJXDXPWV6XND6XIH5XZ3IK4CZDF3EJKLEXNIKOMPNHO5UKUVY3AC 47ZTC4WSACRTU45OJUYCLPGS3XYG5BG2LYIXA7QRKE2AEPH5B25QC SWWE2R6MVBX5CNM6X3WLXZTSRTU53PBJL7WJSFVF77XBPXDX4COAC }pub async fn init(path: PathBuf) -> Result<PathBuf, anyhow::Error> {let config =PijulConfig::load(None, vec![]).context("Loading Pijul config")?;let repo = pijul::Repository::init(&config, Some(&path), None, None).with_context(|| {format!("Initializing a new Pijul repo at {}", path.display())})?;let mut txn = repo.pristine.mut_txn_begin()?;let channel_name = libpijul::DEFAULT_CHANNEL.to_string();txn.open_or_create_channel(&channel_name).context("Creating a default channel")?;txn.set_current_channel(&channel_name).context("Setting the current channel to the default channel")?;txn.commit().context("Commit")?;Ok(path)
Msg::InitedRepo(result) => {let task = match result {Ok(path) => {let (sub, managing_repo, managing_repo_task) =init_managing_repo(path.clone(),&mut state.model.report,);state.model.sub = model::SubState::ManagingRepo(sub);state.managing_repo = Some(managing_repo);managing_repo_task}Err(err) => {let msg =format!("Failed to initialize a new repo: {err:?}");report::show_err(&mut state.model.report, msg);Task::none()}};state.model.sub_menu = None;task}
let mut handle_action = |action| {if let Some(dir_picker::Action::Picked(dir)) = action {// If it contains Pijul repo, init ManagingRepo state// TODO: If it contains Git, offer to migrate it// TODO: Otherwise, offer to init Pijul from scratchlet project = store::Project {last_closed_time: cmp::Reverse(None),path: dir.clone(),};let store_project_task = if repo::is_pijul(&project.path) {Task::perform(async move { store::upsert_project(project).await },Msg::UpsertProjectResult,)
let mut handle_action =|sub_menu: &mut Option<model::SubMenu>,action: Option<dir_picker::Action>| {if let Some(action) = action {match action {dir_picker::Action::Picked(dir) => {// If it contains Pijul repo, init ManagingRepo state// TODO: If it contains Git, offer to migrate it// TODO: Otherwise, offer to init Pijul from scratchlet project = store::Project {last_closed_time: cmp::Reverse(None),path: dir.clone(),};let store_project_task =if repo::is_pijul(&project.path) {Task::perform(async move {store::upsert_project(project).await},Msg::UpsertProjectResult,)} else {Task::none()};let (sub, managing_repo, managing_repo_task) =init_managing_repo(dir, report);new_state = Some((sub, managing_repo));Task::batch([managing_repo_task, store_project_task])}dir_picker::Action::CreateNew(path) => {*sub_menu = Some(model::SubMenu::InitRepo { path });Task::none()}}
};let (sub, managing_repo, managing_repo_task) =init_managing_repo(dir, report);new_state = Some((sub, managing_repo));Task::batch([managing_repo_task, store_project_task])} else {Task::none()}};
}};
action::FilteredMsg::Confirm => {let (task, action) =dir_picker::confirm_input_or_selection(picker);let dir_picker_task =task.map(view::Msg::PickingRepoDir).map(Msg::View);let action_task = handle_action(action);Task::batch([dir_picker_task, action_task])}
action::FilteredMsg::Confirm => match &sub_menu {Some(model::SubMenu::InitRepo { path }) => {let path = path.clone();Task::perform(async move { repo::init(path).await },Msg::InitedRepo,)}Some(model::SubMenu::Push| model::SubMenu::Pull| model::SubMenu::ResetChange,)| None => {let (task, action) =dir_picker::confirm_input_or_selection(picker);let dir_picker_task =task.map(view::Msg::PickingRepoDir).map(Msg::View);let action_task = handle_action(sub_menu, action);Task::batch([dir_picker_task, action_task])}},
view::Msg::EditRecordMsg(action) => edit_record_msg(model, action),view::Msg::EditRecordDesc(action) => edit_record_desc(model, action),
view::Msg::EditRecordMsg(action) => {edit_record_msg(model, action).map(Msg::ManagingRepo)}view::Msg::EditRecordDesc(action) => {edit_record_desc(model, action).map(Msg::ManagingRepo)}
action::FilteredMsg::Confirm => {if let Some(menu) = &sub_menu {match menu {model::SubMenu::Push => push(state, model, sub_menu),model::SubMenu::Pull => pull(state, model, sub_menu),model::SubMenu::ResetChange => {reset_change(state, model, sub_menu, report)}}} else if let Some(ReadyState {repo,navigation: _,selection,forking_channel_name,..}) = model::is_ready_mut(model){#[allow(clippy::collapsible_if)]if let Some(name) = forking_channel_name.take_if(|name| {let name = name.trim();let empty = name.is_empty();let unique = || {repo.channel != name&& !repo.other_channels.iter().any(|n| n == name)};!empty && unique()}) {state.repo_tx_in.send(repo::MsgIn::ForkChannel(name)).unwrap();} else if matches!(selection.primary,selection::Primary::Channel) {if let Some(selection::Channel {ix: _,name,log: _,}) = selection.channel.take()
action::FilteredMsg::Confirm => match &sub_menu {Some(model::SubMenu::Push) => push(state, model, sub_menu),Some(model::SubMenu::Pull) => pull(state, model, sub_menu),Some(model::SubMenu::ResetChange) => {reset_change(state, model, sub_menu, report)}Some(model::SubMenu::InitRepo { .. }) | None => {if let Some(ReadyState {repo,navigation: _,selection,forking_channel_name,..}) = model::is_ready_mut(model){#[allow(clippy::collapsible_if)]if matches!(selection.primary, selection::Primary::Channel){if let Some(selection::Channel {ix: _,name,log: _,}) = selection.channel.take(){state.repo_tx_in.send(repo::MsgIn::SwitchToChannel(name)).unwrap();selection.primary = selection::Primary::default();}} else if let Some(name) =forking_channel_name.take_if(|name| {let name = name.trim();let empty = name.is_empty();let unique = || {repo.channel != name&& !repo.other_channels.iter().any(|n| n == name)};!empty && unique()})