This is starting to get annoying on large repos or repos with large files
7FP2DFNXGKH2GQIH35BAIHMRORXERI6ARZGVVN7LZKMUYIADIULAC 5PZN75Y6NSYDCYWWUWH3TSMV7ZCG7BNCQSBRC7DHCK4G6B5RBCUAC Q6MRVSJXQXHRKY5TWJL742RUQNJPRT32QSPJJORZ2IA6KJ4O2UBAC TLGB23EK3LNO6P2G5AKR4OSVWT2AOFCGE2BOPRO4QK64SIHJLX4QC 4UY2WBBPAJUJRRI2S2OGO3R4NQRF6AIXKKAYPMPFYAU274JQYSEQC BSEJ3J6P6WGC2EQXTGQJCK6PU33R6MII3QYXYT22HAT6COL6YAVQC HP7CKJIW6TOQZFAZKKJFF76LGE7EMQVDTRH2RWPM4POIG2WRKHBAC N26HD5PFUNVDSEXAQVOTMSMNPWFHQSZ5PHMGEF2ACC23OWFHTGQQC N5XHCYVTEDH5SJGWHE76A66KDU5CVHM7U5RXWZDE2TT7L3XPGKEAC TYAKEAJLABCZQDYAI4YBGIJNQ7HJS4DVULEGPCZOGJPJUYYNR6TAC WW2EOFBBX6LGMMRKEVGST2SIITJGMK2MTYDAHUTO6QGYPS2JATLQC SXEYMYF7P4RZMZ46WPL4IZUTSQ2ATBWYZX7QNVMS3SGOYXYOHAGQC YXAVFTPP2PQAYMKGQH7QNKFVGKDI2UHVWB7SIDA4QEYSBP75ZGUQC K7JPP64SNKZNMB6XJAYYHDC2464I3BQDLVA3IX4YCQZ4P5TXZXRAC EUZFFJSOWV4PXDFFPDAFBHFUUMOFEU6ST7JH57YYRRR2SEOXLN6QC I24UEJQLCH2SOXA4UHIYWTRDCHSOPU7AFTRUOTX7HZIAV4AZKYEQC GUL4M5FIE7JYXJHR7MCTQS3543HIQXGPLBWZKASBAWWEA4SZ75CAC 2RXOCWUWOGHEKHT5W73LAHJSOZVRTOGS7BWLSIGEEEBJGMCZBXQAC E3DD265TSU5HFAAUYOIYFK5D3GYSPIJSWDVSQX5Q226WPCH43EFQC LPM4PBYJFIFZXN3JNEZOKEQ74UXUMURIFY5U4R2CFC6N4XINHL4AC MOPABMFWZOEMCIQMLEFH74NGTFV6K26FGUFETV3FG5VHCBGLXDIQC 7UPL3Y2A5QOBU6VIUHNWEFGSGQ5CMWGDGOVLRZ53UARXG3TDGLMAC ZDK3GNDBWXJ2OXFDYB72ZCEBGLBF4MKE5K3PVHDZATHJ7HJIDPRQC I52XSRUH5RVHQBFWVMAQPTUSPAJ4KNVID2RMI3UGCVKFLYUO6WZAC P6WE7YKL6ILKLYKMJUJLGINN7L4U7X4KUIE5ELTK2LEENX3DUBCQC YN63NUZO4LVJ7XPMURDULTXBVJKW5MVCTZ24R7Z52QMHO3HPDUVQC RMDMAYRXYBU5OQXV5HSF6LFD4NBMKRNH5EPIVW3K5HAV6D56IG6QC YHG37GA4BELXO4I6TKXMEBIX5MHQT6DWFFFIYYUGLZ4UWCC3NGOQC CCLLB7OIFNFYJZTG3UCI7536TOCWSCSXR67VELSB466R24WLJSDAC VO5OQW4W2656DIYYRNZ3PO7TQ4JOKQ3GVWE5ALUTYVMX3WMXJOYQC 3CFU4DQNHPPJC2B63RSVAVGHTQZT3RT5CCHHYC4ZM6DQ4GVQULSQC GHO6DWPILBBTL6CVZKERJBTFL3EY6ZT4YM4E5R4S6YPGVFKFHCVAC WZVCLZKY34KQBQU6YBGJLQCDADBQ67LQVDNRVCMQVY3O3C3EIWSQC KQTD46KVVWMJ3W6O55BEJLCVTNTDLUH6QT46AEFT7OU2SELXG4IAC RRCSHAYZ6RLWVPNYHF2F5FSRL2KKJNPQUQRIJYLJGB23BZQQ7JLQC MQ6ERQ43MWASF2OSG65FHKWHCWT35BJVFJWKHAFPVCTLICCTJWUAC DJYHARZ7CSRMX6ZFM6P52SM2EC57VTSHWAIMFSD7Q3EL7UYZGLXQC 6YMDOZIB5LVYLFIDGN2WNT5JTHEAMS4TFPVDEZ3OWXWOKJOC5QDAC IXC43DSHDSXCE2X6H6N47GGVKTYM2D2BUUWF34CFWMFT6Z45NOOAC FXEDPLRI7PXLDXV634ZA6D5Q3ZWG3ESTKJTMRPJ4MAHI7PKU3M6AC 3M7WBE24JTPTHWQOU5PO2ZJYKPKEH2F6R4M6RWIRFG334PQEA55QC V4T4SC7OL6WEZNV4XSFBSXY5HPB7VXPSXWSK4Z63QXKQD4JSFNCQC LODKR74E5PIJLS5FRZ6GZLG222JSTNC7BSSWERLTAIF3QHNDDXYQC 7ZFRYVVQQGJYG3POPWJWL3CDW37YDXZYZQC3OSWFHWEUSEMYQ4EQC HMMMKONLCRAXVT7SO2ITTFDOJIQKKVSRIZPXYVPDC34RCBHWMHVAC MDADYULS5AWVMTJDGYCGNQTN6T7XJDRUBDTFILDY5MLF6I2PE5NAC LCERQSWMA2YKOPAPNZUSOQ7FLBGDHBZR33OHLYX7T4KTKULRMJDQC RP7YRM5QOINW7FB5BGNZEXVQN7TXB7LLLHXZPPAI6DGFGRP7JPFQC 27PYHR6LO4M4RMSMLVMUKSYNQ72V6RRMRXLYQI3JA3LBHJO747YAC txn.touch_channel(channel, Some(0));
let now = std::time::SystemTime::now();for inode in touched_inodes.iter() {if let Ok(inode) = internal_pos(txn, inode, change_id) {if let Some(inode) = txn.get_revinodes(&inode, None)? {if let Some(name) = crate::fs::inode_filename(txn, *inode)? {debug!("touching file {:?} {:?}",name,now.duration_since(std::time::SystemTime::UNIX_EPOCH).unwrap().as_millis());working_copy.touch(&name, now).map_err(UnrecordError::WorkingCopy)?}}}}
crate::unrecord::unrecord(&mut *txn.write(), &channel, &changes, &h1, 0)?;crate::unrecord::unrecord(&mut *txn.write(), &channel, &changes, &h2, 0)?;
crate::unrecord::unrecord(&mut *txn.write(), &channel, &changes, &h1, 0, &repo)?;crate::unrecord::unrecord(&mut *txn.write(), &channel, &changes, &h2, 0, &repo)?;
Ok(())}/// Delete the same file on two different channels, merge, unrecord each patch on the same channel. What happens to tree/revtree?#[test]fn fs_times() -> Result<(), anyhow::Error> {env_logger::try_init().unwrap_or(());let repo = working_copy::memory::Memory::new();let changes = changestore::memory::Memory::new();let env = pristine::sanakirja::Pristine::new_anon()?;let txn = env.arc_txn_begin().unwrap();let channel = txn.write().open_or_create_channel("main")?;repo.add_file("file", b"blabla\nblibli\nblublu\n".to_vec());repo.add_file("file2", b"blabla\nblibli\nblublu\n".to_vec());txn.write().add_file("file", 0)?;txn.write().add_file("file2", 0)?;let h0 = record_all(&repo, &changes, &txn, &channel, "")?;debug!("h0 = {:?}", h0);repo.write_file("file", Inode::ROOT)?.write_all(b"blabla\nblublu\n")?;let h1 = record_all(&repo, &changes, &txn, &channel, "")?;debug!("last {:?}", txn.read().last_modified(&channel.r.read()));// Modify file2, but set its modification time one hour ago, so we// can check that `unrecord` doesn't read the entire repo.repo.write_file("file2", Inode::ROOT)?.write_all(b"blabla\nblublu\n")?;repo.touch("file2",std::time::SystemTime::now() - std::time::Duration::from_hours(1),)?;crate::unrecord::unrecord(&mut *txn.write(), &channel, &changes, &h1, 0, &repo)?;debug!("last {:?}", txn.read().last_modified(&channel.r.read()));info!("Final record");let h1 = record_all(&repo, &changes, &txn, &channel, "")?;let change1 = changes.get_change(&h1).unwrap();assert_eq!(change1.changes.len(), 1);
impl<P: std::error::Error + 'static, T: GraphTxnT + TreeTxnT, A: std::error::Error + 'static>std::fmt::Debug for ArchiveError<P, T, A>
impl<P: std::error::Error + 'static,T: GraphTxnT + TreeTxnT,A: std::error::Error + 'static,W: std::error::Error + 'static,> std::fmt::Debug for ArchiveError<P, T, A, W>
) -> Result<bool, unrecord::UnrecordError<C::Error, Self>> {unrecord::unrecord(self, channel, changes, hash, salt)
working_copy: &W,) -> Result<bool, unrecord::UnrecordError<C::Error, W::Error, Self>> {unrecord::unrecord(self, channel, changes, hash, salt, working_copy)
) -> Result<Vec<output::Conflict>, output::ArchiveError<C::Error, T, A::Error>> {output::archive(changes, self, channel, &mut std::iter::empty(), arch)
) -> Result<Vec<output::Conflict>, output::ArchiveError<C::Error, T, A::Error, W::Error>> {output::archive::<_, _, _, _, W>(changes, self, channel, &mut std::iter::empty(), arch)
) -> Result<Vec<output::Conflict>, output::ArchiveError<C::Error, T, A::Error>> {output::archive(changes, self, channel, prefix, arch)
) -> Result<Vec<output::Conflict>, output::ArchiveError<C::Error, T, A::Error, W::Error>> {output::archive::<_, _, _, _, W>(changes, self, channel, prefix, arch)