IFQPVMBD552DZ3B5HCM6W6MI2SB6576ZYJNU5KVA3O4YPZAUEFHAC 6YZAVBWU6E5FYOI5JGEIPXGZLIKAW6LS2AOFIQWEE5DMOPPCD5PQC KLR5FRIBS6UOH3S3XAOE22TJACVSVOY7TOLW22DIWNGY27S6WZRAC SWWE2R6MVBX5CNM6X3WLXZTSRTU53PBJL7WJSFVF77XBPXDX4COAC UB2ITZJSDADVINSQEZ3HA6PVGA7OA6JYFG5GMSO7Y7LOXJC4FI7AC EC3TVL4X6VZZVLOKUN63LC73ADPHBHMZO7QMDXGX2ZPURVI4B4XQC KT5UYXGKEEXUHURNOYFVIG7WQ3Y3SJZMM2TP4OSW6NXSXQ5XXRHAC ELG3UDT6OJFEYSJR7HZEC65IUWBMGPPPCXEW3CDW5T74R6KC5LIAC W7IUT3ZVMFH77IGKLAL7WX7IVVTGTY3FKEJ3WHMP3KI37B6NENLQC YBJRDOTCX3ZRDB5EVXJBR55FX3CADCSIGMYWNYVC2PD5W3GXR3DQC A5YBC77VWH2LXCZJOPZORQJI5ZYABSCHJWVX5HVNWPM5RABXESLQC UCBNZULEO6OIEV3RZCAPP6ICALAR7JIS2LLG7IRSX6PVYMFQT5AAC 4WO3ZJM2RNYZCBPS7FGYAEBELYD57OSS7LEUYCWGZBCAY272SNQQC W4LFX7IHQ7SDX67ATSGWDB5IN6472ZJDBKY2XZ54SBJEYD5GAT5QC PTFDJ567XGGF26TE7KVQT7WPZIWV737DBO24VFIPEWPVAVKEKADQC AMPZ2BXK4IGUZO3OPBRSJ6Z4GI5K4PRFMLUGTR6AP4FKKRWQG7LQC RPCIGCNSMPYGTMTUXJRIJG76L2WLRDHGJJZHE4DJ4UT5RPNZRNPAC Y6LXBCJBIJDHAQITICWI5HE7WBMWGPENWJDHEE2O44IEZXADAI2AC OQ6HSAWHIRTAIIWMDGCTIOK47JDY7QVVAHLRDA2R5TTJKNSBFCWQC WI2BVQ6JOJBM4OC5KSZBMTDPBWESIR7GD72B5TLO7H2SY7QBDHJAC AHWWRC73FXLSUDAJBU5UU76MZETHD3DSGJ7OLZPFEHXBDJ733QNAC JE44NYHM4QORCRKOF33QM42EDT7SBCPTULWGT6IVDL3D5LUHQXLAC ONRCENKTUB4JJMPXNAQQYEWDYD54TAGOLWH742GF4EH3KTHV7YLQC 4ELJZGRJNL6FXB33QTYDNPY57JA3WZPUXKLQRTGSLDM7W65PD3YQC VCNKFNUF7OWVSWC6I5D25KUZ3XZZICZ3LHWVPF2N5ZSP7LQ2JOUQC ACDXXAX26ZJJFKJDGRC2GOSJY5JHQWCSTP55SYI6D6LH5UIRYUBAC I56UGW7UUKLSR4753EYRGNROZB5PD522REEOGHVAQOZZTSVRUEEQC X6AK4QPXKTGTWIMJ5CIR46CVIXVUXV5WKTP73CNQOIRANQN4MD5QC YYKXNBFL44LLOBABLXBKOF7IFUIGIEL2SYIPLGDH6UOEY5EZZZSQC 5CYU7UT74NXJWCC36GNQGVBXH676BHBXWZQVIINRMPDEJ27SBRGAC ESMM3FELOBYIX7FUNOU37FYKRJHFU2IMX6LY6EGJTVPTBDU3SEEQC UF5NJKASGMZSZMBUKSUI67B2GIMQFX5SNNQEHHGUBNDBQ2QZZWSAC SWDPAGF6BGUA2L6KFP6LAVCA3SX4QA5FOZRLLOAWLNZ6RNCIV4RQC KQ3P3QRLRNBRI5R6NS43M7IKKZCHBKOY4ZF3WH3PLCKDKBTEERZAC FL2ULDJNRO3KPS24T2PEZWWNXAVFYC42SRVN3LDFVPIAFTDCOBGQC 2LWMGRUM2OLIJHW7XW4HSISIHJAV3JFCWQYRWYV2P2VMSFHJ5CKQC QYDWH7KBIBYZA22PFVZJMZZ3BN65XEYEMVCC6WMVGCZE3A4GQBXAC 5FVZF7XXF4KVBY27SL2WD2ESEECOIM7FJZC7KVKZ4JOVVBUWF43QC B6YUTY3QLUMPXDFM7LHRSPGBQSGH6VNFSQHQXJNGKD5MQKW6P6KAC F542TMBEUP2AVIORK747P2LM74ZZLO6XAQWDMXQDEIRAZH2PTWSQC DXAYDIMQ7BYEI3ASOHKADQWSMVJOA2ZVNEL2TDENJCJKX2U4GMWAC KWTBNTO3QUUE2YADF6SYW6G6ZOKYEWRJQKIWDGZXR33S3YNDVIZQC PTWZYQFRWWUOE2WMQT26CKZKFSHAIJVJS3QWHJFYUFDRRTVPHSUAC JZXYSIYDPBWQZCAMGDZ5BFMN6SU73EVVDIYEGTDJN6DVOSBNHN4QC 5ZRDYL6KIQPUI3ZZETH5KJ64N6RUF7KYM3P6Q6HER5XVJZ7GZ4WQC OJPGHVC3RFBQ7TTSCZH6URSSATII3TESD74EISDNOTNXXSX7PQMAC WAOGSCOJ5A372BZKHEYD2BCDBCENNVLFYW3INKUOOAZMDADDIFIQC WH57EHNML4OTGQQZBT2SG6SOFTBOD6OJPJYHJVGPH22CSSOE25AAC PSKE5G36S3IAGKGEXS2ZN2KIBV754J2OHQRZV577X4QQCLQJ6LIQC AZ5D2LQUSYVWVEP7ISFDSZTMZ65UEHZATILMDQ4TYLCKJH4Q3TIAC KF2LDB5YIXMXBZK6KJWJOLJL66TN2KDXPH3NKEGGCQ5EVOZB77BQC internal_state = spawn_blocking(move || {add(&mut internal_state, &path_clone);internal_state
let result: anyhow::Result<()>;(internal_state, result) = spawn_blocking(move || {let result = add(&mut internal_state, &path_clone);(internal_state, result)
internal_state = spawn_blocking(move || {rm(&mut internal_state, &path_clone);internal_state
let result: anyhow::Result<()>;(internal_state, result) = spawn_blocking(move || {let result = rm(&mut internal_state, &path_clone);(internal_state, result)
record(&internal_state, msg, desc, sk);// Update state after making a recordlet state = get_state(&internal_state);
let state = |internal_state: &InternalState| {record(internal_state, msg, desc, sk)?;// Update state after making a recordget_state(internal_state)};let state = state(&internal_state);
let channel = current_channel(repo);let other_channels = other_channels(repo);let diff = diff(repo);let untracked_files = untracked_files(repo);let changed_files = changed_files(&diff, &repo.changes);
let channel = current_channel(repo)?;let other_channels = other_channels(repo)?;let diff = diff(repo)?;let untracked_files = untracked_files(repo)?;let changed_files = changed_files(&diff, &repo.changes)?;
fn current_channel(repo: &pijul::Repository) -> String {let txn = repo.pristine.txn_begin().unwrap();txn.current_channel()
fn current_channel(repo: &pijul::Repository) -> anyhow::Result<String> {let txn = repo.pristine.txn_begin()?;Ok(txn.current_channel()
let current_channel = current_channel(repo);let mut txn = repo.pristine.mut_txn_begin().unwrap();let channel = txn.load_channel(¤t_channel).unwrap().unwrap();let _fork = txn.fork(&channel, name.trim()).unwrap();txn.commit().unwrap();
let current_channel = current_channel(repo)?;let mut txn = repo.pristine.mut_txn_begin()?;let channel = txn.load_channel(¤t_channel)?.context("Loading current channel")?;let _fork = txn.fork(&channel, name.trim())?;txn.commit()?;Ok(())
state.record(txn.clone(),pijul::Algorithm::default(),false,&pijul::DEFAULT_SEPARATOR,channel.clone(),&repo.working_copy,&repo.changes,"",1, // std::thread::available_parallelism()?.get(),).unwrap();
state.record(txn.clone(),pijul::Algorithm::default(),false,&pijul::DEFAULT_SEPARATOR,channel.clone(),&repo.working_copy,&repo.changes,"",1, // std::thread::available_parallelism()?.get(),)?;
.map(|rec| rec.globalize(&*txn_).unwrap()).collect();let contents = Arc::try_unwrap(rec.contents).unwrap().into_inner();
.map(|rec| {let res = rec.globalize(&*txn_)?;Ok(res)}).collect::<anyhow::Result<Vec<_>>>()?;let contents = Arc::into_inner(rec.contents).context("Failed to get unique strong reference on change contents",)?.into_inner();
let hash = repo.changes.save_change(&mut change, |change, hash| {change.unhashed = Some(serde_json::json!({"signature": sk.sign_raw(&hash.to_bytes()).unwrap(),}));Ok::<_, pijul::changestore::filesystem::Error>(())}).unwrap();
let hash = repo.changes.save_change(&mut change, |change, hash| {change.unhashed = Some(serde_json::json!({"signature": sk.sign_raw(&hash.to_bytes()).unwrap(),}));Ok::<_, pijul::changestore::filesystem::Error>(())})?;
state.record(txn.clone(),pijul::Algorithm::default(),false,&pijul::DEFAULT_SEPARATOR,channel.clone(),&repo.working_copy,&repo.changes,"",std::thread::available_parallelism().unwrap().get(),).unwrap();
state.record(txn.clone(),pijul::Algorithm::default(),false,&pijul::DEFAULT_SEPARATOR,channel.clone(),&repo.working_copy,&repo.changes,"",std::thread::available_parallelism()?.get(),)?;
pub fn add(repo: &mut pijul::Repository, file_path_str: &str) {let txn = repo.pristine.arc_txn_begin().unwrap();let repo_path = CanonicalPathBuf::canonicalize(&repo.path).unwrap();
pub fn add(repo: &mut pijul::Repository,file_path_str: &str,) -> anyhow::Result<()> {let txn = repo.pristine.arc_txn_begin()?;let repo_path = CanonicalPathBuf::canonicalize(&repo.path)?;
txn.commit().unwrap();
txn.commit()?;Ok(())}fn get_change_diffs(hash: ChangeHash,internal_state: &InternalState,) -> anyhow::Result<ChangedFiles> {let change = internal_state.repo.changes.get_change(&hash)?;changed_files(&change, &internal_state.repo.changes)
fn untracked_files(repo: &pijul::Repository) -> BTreeSet<String> {let repo_path = CanonicalPathBuf::canonicalize(&repo.path).unwrap();let txn = repo.pristine.arc_txn_begin().unwrap();let threads = std::thread::available_parallelism().unwrap().get();
fn untracked_files(repo: &pijul::Repository,) -> anyhow::Result<BTreeSet<String>> {let repo_path = CanonicalPathBuf::canonicalize(&repo.path)?;let txn = repo.pristine.arc_txn_begin()?;let threads = std::thread::available_parallelism()?.get();
).unwrap().filter_map(move |path| {let (path, _) = path.unwrap();use path_slash::PathExt;let path_str = path.to_slash_lossy();if !txn_.read().is_tracked(&path_str).unwrap() {Some(path_str.into_owned())} else {None
)?.filter_map(move |path| match path {Err(e) => Some(Err(anyhow::Error::from(e))),Ok((path, _)) => {use path_slash::PathExt;let path_str = path.to_slash_lossy();let is_tracked = match txn_.read().is_tracked(&path_str) {Ok(is_tracked) => is_tracked,Err(e) => return Some(Err(anyhow::Error::from(e))),};if !is_tracked {Some(Ok(path_str.into_owned()))} else {None}
fn mk_log_entry(repo: &pijul::Repository, hash: ChangeHash) -> LogEntry {let header = repo.changes.get_header(&hash).unwrap();let files = repo.changes.get_changes(&hash).unwrap();
fn mk_log_entry(repo: &pijul::Repository,hash: ChangeHash,) -> anyhow::Result<LogEntry> {let header = repo.changes.get_header(&hash)?;let files = repo.changes.get_changes(&hash)?;
state.record(txn,libpijul::Algorithm::default(),false,&libpijul::DEFAULT_SEPARATOR,channel,&repo.working_copy,&repo.changes,"",std::thread::available_parallelism().unwrap().get(),).unwrap();
state.record(txn,libpijul::Algorithm::default(),false,&libpijul::DEFAULT_SEPARATOR,channel,&repo.working_copy,&repo.changes,"",std::thread::available_parallelism()?.get(),)?;
} => repo_refreshed(state, repo_state, invalidate_logs),repo::MsgOut::AddedUntrackedFile { path: _ } => Task::none(),repo::MsgOut::RmedAddedFile { path: _ } => Task::none(),repo::MsgOut::GotChangeDiffs { hash, diffs } => {repo_got_change_diffs(state, hash, diffs)}repo::MsgOut::LoadedEntireLog(log) => got_entire_log(state, log),repo::MsgOut::LoadedOtherChannelLog { channel, log } => {loaded_other_channel_log(state, channel, log)}
} => match repo_state {Ok(repo_state) => {repo_refreshed(state, repo_state, invalidate_logs)}Err(err) => report_err(state, err.to_string()),},repo::MsgOut::AddedUntrackedFile { result, path: _ } => match result {Ok(()) => Task::none(),Err(err) => report_err(state, err.to_string()),},repo::MsgOut::RmedAddedFile { result, path: _ } => match result {Ok(()) => Task::none(),Err(err) => report_err(state, err.to_string()),},repo::MsgOut::GotChangeDiffs { hash, diffs } => match diffs {Ok(diffs) => repo_got_change_diffs(state, hash, diffs),Err(err) => report_err(state, err.to_string()),},repo::MsgOut::LoadedEntireLog(log) => match log {Ok(log) => got_entire_log(state, log),Err(err) => report_err(state, err.to_string()),},repo::MsgOut::LoadedOtherChannelLog { channel, log } => match log {Ok(log) => loaded_other_channel_log(state, channel, log),Err(err) => report_err(state, err.to_string()),},