Allowing vertex buffer to use references to the transaction, by changing `output::output` to take an ArcTxn<T> instead of a simple T
Dependencies
- [2]
VPENMXMZUsing prefixes of the base32 of external hashes instead of full internal hashes - [3]
PXR7LQ26Resurrecting known deleted files instead of re-adding them (this is needed after `tag reset`) - [4]
3X5ZCEPZFixing a panic when `pijul archive` does not find the channel - [5]
YHG37GA4Removing one buffer copy in VertexBuffer - [6]
G55Y75FUAvoiding deadlocks when using output.rs with a non-filesystem output - [7]
VO5OQW4WRemoving anyhow in libpijul - [8]
VYHHOEYHVersions and formatting - [9]
5SLOJYHGFixing the Git feature - [10]
2RXOCWUWMaking libpijul deterministic (and getting rid of `rand`) - [11]
CCLLB7OIUpgrading to Sanakirja 0.15 + version bump - [12]
3AMEP2Y5More convenient interface for channels - [13]
PIQCNEEBUpgrading to Clap 3.0.0-alpha.5 - [14]
I52XSRUHMassive cleanup, and simplification - [15]
2UTQVDLPDo not create an archive if the prefix is absolute - [16]
GHO6DWPIRefactoring iterators - [17]
ZDK3GNDBTag transactions (including a massive refactoring of errors) - [18]
EUZFFJSOUpdating Pijul with the latest changes in Libpijul - [19]
WW2EOFBBUmask in archives - [20]
5OGOE4VWStore the current channel in the pristine - [21]
JL4WKA5PImplement the Sanakirja concurrency model in a cross-process way - [22]
GLMOA3PFMore edges in "credit" - [23]
2K7JLB4ZNo pager on Windows - [24]
RMDMAYRXAdding a root inode (aka supporting submodules) - [25]
Y6EVFMTADon't output files if they aren't in the current channel - [26]
ZSF3YFZTencoded file deletion - [27]
NLGQAH4HCredit and reset relative to current directory instead of the root - [28]
ZBNKSYA6Fixing a bus error when starting a transaction on a full disk - [29]
IIV3EL2XCleanup, formatting, and fixing the Git feature - [30]
YRBOKAWJFormatting (why wasn't this recorded before? I'm not sure) - [31]
SECWDBUHAdding empty directories to archives - [32]
FXEDPLRIResurrecting tests, and type cleanup (no need for Arc<RwLock<…>> anymore) - [33]
L4JXJHWXpijul/*: reorganize imports and remove extern crate - [34]
YN63NUZOSanakirja 1.0 - [35]
FBZ6LBF3Permissions in archives (since we do not store full permissions anymore) - [36]
OY3CGEHQEarly stop in the diff algorithms for diff --short - [37]
I3OVP3NHArchive: set the accurate and deterministic mtime - [38]
OWCCRVO5Fixing a broken pipe in credit - [39]
YCEZL7VFMoving to temporary paths when outputting - [40]
I24UEJQLVarious post-fire fixes - [41]
C4MJ7D7QVerbose printing of conflicts to stderr - [42]
GA3P7FOMNicer conflict markers - [43]
BZSC7VMYaddress clippy lints - [44]
SXEYMYF7Fixing the bad changes in history (unfortunately, by rebooting). - [45]
I7VL7VPZMinor cleanup - [46]
27PYHR6LMaking the get_latest_touch function (useful to make archives) public in libpijul - [47]
Z6FWHKCAImproving the UI around zombie conflicts - [48]
A3RM526YIntegrating identity malleability - [*]
XR7MNOMUfile encoding in updates
Change contents
- replacement in pijul/src/remote/mod.rs at line 936[7.61269]→[7.0:63](∅→∅),[7.63]→[7.8957:9035](∅→∅),[7.61331]→[7.8957:9035](∅→∅),[7.9035]→[7.0:100](∅→∅)
let mut txn = l.pristine.mut_txn_begin()?;let mut channel = txn.load_channel(&l.channel)?.unwrap();txn.archive_with_state(&changes, &mut channel, &state, extra, &mut tarball, 0)?let txn = l.pristine.arc_txn_begin()?;let channel = {let txn = txn.read();txn.load_channel(&l.channel)?.unwrap()};txn.archive_with_state(&changes, &channel, &state, extra, &mut tarball, 0)? - replacement in pijul/src/remote/mod.rs at line 943
let txn = l.pristine.txn_begin()?;let channel = txn.load_channel(&l.channel)?.unwrap();let txn = l.pristine.arc_txn_begin()?;let channel = {let txn = txn.read();txn.load_channel(&l.channel)?.unwrap()}; - replacement in pijul/src/commands/reset.rs at line 86
&*txn.read(),&channel.read(),&txn,&channel, - replacement in pijul/src/commands/protocol.rs at line 297
txn.read().archive(&repo.changes, &channel, &mut tarball)?txn.archive(&repo.changes, &channel, &mut tarball)? - replacement in pijul/src/commands/protocol.rs at line 305
let mut txn = txn.write();let mut fork = txn.fork(&channel, &fork_name)?;let mut fork = {let mut txn = txn.write();txn.fork(&channel, &fork_name)?}; - replacement in pijul/src/commands/protocol.rs at line 317
txn.drop_channel(&fork_name)?;txn.write().drop_channel(&fork_name)?; - replacement in pijul/src/commands/protocol.rs at line 321
txn.write().archive(&repo.changes, &channel, &mut tarball)?txn.archive(&repo.changes, &channel, &mut tarball)? - replacement in pijul/src/commands/credit.rs at line 29[7.3572]→[7.179302:179348](∅→∅),[7.13643]→[7.179302:179348](∅→∅),[7.15812]→[7.179302:179348](∅→∅),[7.24306]→[7.179302:179348](∅→∅),[7.179302]→[7.179302:179348](∅→∅)
let txn = repo.pristine.txn_begin()?;let txn_ = repo.pristine.arc_txn_begin()?;let txn = txn_.read(); - replacement in pijul/src/commands/credit.rs at line 54
let channel = channel.read();std::mem::drop(txn); - replacement in pijul/src/commands/credit.rs at line 57
&txn,&txn_, - replacement in pijul/src/commands/credit.rs at line 60
&mut Creditor::new(std::io::stdout(), &txn, &channel),&mut Creditor::new(std::io::stdout(), txn_.clone(), channel.clone()), - replacement in pijul/src/commands/credit.rs at line 75
pub struct Creditor<'a, W: std::io::Write, T: ChannelTxnT> {pub struct Creditor<W: std::io::Write, T: ChannelTxnT> { - replacement in pijul/src/commands/credit.rs at line 80
txn: &'a T,channel: &'a T::Channel,txn: ArcTxn<T>,channel: ChannelRef<T>, - replacement in pijul/src/commands/credit.rs at line 84
impl<'a, W: std::io::Write, T: ChannelTxnT> Creditor<'a, W, T> {pub fn new(w: W, txn: &'a T, channel: &'a T::Channel) -> Self {impl<W: std::io::Write, T: ChannelTxnT> Creditor<W, T> {pub fn new(w: W, txn: ArcTxn<T>, channel: ChannelRef<T>) -> Self { - replacement in pijul/src/commands/credit.rs at line 97
impl<'a, W: std::io::Write, T: TxnTExt> VertexBuffer for Creditor<'a, W, T> {impl<W: std::io::Write, T: TxnTExt> VertexBuffer for Creditor<W, T> { - replacement in pijul/src/commands/credit.rs at line 112
for e in self.txn.iter_adjacent(self.channel, v, EdgeFlags::PARENT, EdgeFlags::all())let txn = self.txn.read();let channel = self.channel.read();for e in txn.iter_adjacent(&channel, v, EdgeFlags::PARENT, EdgeFlags::all()) - replacement in pijul/src/commands/credit.rs at line 122
if let Ok(Some(intro)) = self.txn.get_external(&e.introduced_by()) {if let Ok(Some(intro)) = txn.get_external(&e.introduced_by()) { - replacement in pijul/src/commands/archive.rs at line 5
use libpijul::{Hash, Merkle, MutTxnTExt, TxnT, TxnTExt};use libpijul::{Hash, Merkle, TxnT}; - replacement in pijul/src/commands/archive.rs at line 114
let mut txn = repo.pristine.mut_txn_begin()?;let channel_name = if let Some(ref c) = self.channel {c} else {txn.current_channel().unwrap_or(crate::DEFAULT_CHANNEL)let txn = repo.pristine.arc_txn_begin()?;let channel = {let txn = txn.read();let channel_name = if let Some(ref c) = self.channel {c} else {txn.current_channel().unwrap_or(crate::DEFAULT_CHANNEL)};txn.load_channel(&channel_name)?.unwrap() - edit in pijul/src/commands/archive.rs at line 124
let mut channel = txn.load_channel(&channel_name)?.unwrap(); - replacement in pijul/src/commands/archive.rs at line 126
&mut channel,&channel, - replacement in pijul/src/commands/archive.rs at line 133
let txn = repo.pristine.txn_begin()?;let channel_name = if let Some(ref c) = self.channel {c} else {txn.current_channel().unwrap_or(crate::DEFAULT_CHANNEL)let txn = repo.pristine.arc_txn_begin()?;let channel = {let txn = txn.read();let channel_name = if let Some(ref c) = self.channel {c} else {txn.current_channel().unwrap_or(crate::DEFAULT_CHANNEL)};if let Some(channel) = txn.load_channel(&channel_name)? {channel} else {bail!("No such channel: {:?}", channel_name);} - replacement in pijul/src/commands/archive.rs at line 147
if let Some(channel) = txn.load_channel(&channel_name)? {txn.archive(&repo.changes, &channel, &mut tarball)?} else {bail!("No such channel: {:?}", channel_name);}txn.archive(&repo.changes, &channel, &mut tarball)? - replacement in libpijul/src/record.rs at line 907[7.500045]→[7.98128:98198](∅→∅),[7.98198]→[3.40:93](∅→∅),[3.93]→[7.6768:6853](∅→∅),[7.6768]→[7.6768:6853](∅→∅)
let txn_ = txn.read();let channel_ = channel.read();let (former_parents, is_deleted, encoding) =collect_former_parents::<C, W, T>(changes, &*txn_, &*channel_, vertex)?;let (former_parents, is_deleted, encoding) = {let txn_ = txn.read();let channel_ = channel.read();collect_former_parents::<C, W, T>(changes, &*txn_, &*channel_, vertex)?}; - replacement in libpijul/src/record.rs at line 918
&*txn_,txn, - replacement in libpijul/src/record.rs at line 922
&*channel_,channel, - edit in libpijul/src/record.rs at line 935
let txn_ = txn.read();let channel_ = channel.read(); - replacement in libpijul/src/record.rs at line 951
txn: &T,txn: &ArcTxn<T>, - replacement in libpijul/src/record.rs at line 955
channel: &T::Channel,channel: &ChannelRef<T>, - edit in libpijul/src/record.rs at line 979
let txn = txn.read();let channel = channel.read(); - replacement in libpijul/src/record.rs at line 983
txn,channel,&*txn,&*channel, - edit in libpijul/src/record.rs at line 997
let txn = txn.read();let channel = channel.read(); - replacement in libpijul/src/record.rs at line 1001
txn,channel,&*txn,&*channel, - replacement in libpijul/src/record.rs at line 1011
|| modified_since_last_commit(txn, channel, &working_copy, &item.full_path)?)|| modified_since_last_commit(&*txn.read(),&*channel.read(),&working_copy,&item.full_path,)?) - replacement in libpijul/src/record.rs at line 1018
let mut ret = retrieve(txn, txn.graph(channel), vertex)?;let mut ret = {let txn = txn.read();let channel = channel.read();retrieve(&*txn, txn.graph(&*channel), vertex)?}; - replacement in libpijul/src/output/output.rs at line 649
{let txn = txn.read();let channel = channel.read();alive::output_graph(changes, &*txn, &*channel, &mut f, &mut l, forward).map_err(PristineOutputError::from)?;}alive::output_graph(changes, &txn, &channel, &mut f, &mut l, forward).map_err(PristineOutputError::from)?; - replacement in libpijul/src/output/mod.rs at line 316
txn: &T,channel: &T::Channel,txn: &ArcTxn<T>,channel: &ChannelRef<T>, - replacement in libpijul/src/output/mod.rs at line 322
let mut graph = crate::alive::retrieve(&*txn, txn.graph(&*channel), v0)?;crate::alive::output_graph(changes, &*txn, &*channel, out, &mut graph, &mut forward)?;let mut graph = {let txn = txn.read();let channel = channel.read();crate::alive::retrieve(&*txn, txn.graph(&*channel), v0)?};crate::alive::output_graph(changes, txn, channel, out, &mut graph, &mut forward)?; - replacement in libpijul/src/output/archive.rs at line 150
txn: &T,txn: &ArcTxn<T>, - edit in libpijul/src/output/archive.rs at line 155
let channel = channel.read(); - replacement in libpijul/src/output/archive.rs at line 159[7.692602]→[7.692602:692654](∅→∅),[7.692654]→[7.5033:5062](∅→∅),[7.5062]→[7.692672:692729](∅→∅),[7.58587]→[7.692672:692729](∅→∅),[7.88038]→[7.692672:692729](∅→∅),[7.692672]→[7.692672:692729](∅→∅),[7.692729]→[7.1472:1486](∅→∅),[7.1486]→[7.692729:692788](∅→∅),[7.692729]→[7.692729:692788](∅→∅)
collect_children(txn,changes,txn.graph(&channel),Position::ROOT,Inode::ROOT,"",None,next_prefix_basename,&mut files,)?;{let txn_ = txn.read();let channel_ = channel.read();collect_children(&*txn_,changes,txn_.graph(&channel_),Position::ROOT,Inode::ROOT,"",None,next_prefix_basename,&mut files,)?;} - replacement in libpijul/src/output/archive.rs at line 183[7.693101]→[7.693101:693132](∅→∅),[7.693132]→[7.122535:122605](∅→∅),[7.5132]→[7.693202:693232](∅→∅),[7.58656]→[7.693202:693232](∅→∅),[7.122605]→[7.693202:693232](∅→∅),[7.693202]→[7.693202:693232](∅→∅),[7.693232]→[7.907:933](∅→∅),[7.933]→[7.122606:122685](∅→∅),[7.122685]→[7.1011:1072](∅→∅),[7.1011]→[7.1011:1072](∅→∅),[7.1072]→[7.693398:693414](∅→∅),[7.5222]→[7.693398:693414](∅→∅),[7.58745]→[7.693398:693414](∅→∅),[7.693398]→[7.693398:693414](∅→∅)
b.sort_by(|u, v| {txn.get_changeset(txn.changes(&channel), &u.0.change).unwrap().cmp(&txn.get_changeset(txn.changes(&channel), &v.0.change).unwrap(),)});{let txn_ = txn.read();let channel_ = channel.read();b.sort_by(|u, v| {txn_.get_changeset(txn_.changes(&channel_), &u.0.change).unwrap().cmp(&txn_.get_changeset(txn_.changes(&channel_), &v.0.change).unwrap(),)});} - edit in libpijul/src/output/archive.rs at line 198
let txn_ = txn.read();let channel_ = channel.read(); - replacement in libpijul/src/output/archive.rs at line 233
crate::fs::get_latest_touch(txn, &channel, &output_item.pos)?;crate::fs::get_latest_touch(&*txn_, &channel_, &output_item.pos)?; - replacement in libpijul/src/output/archive.rs at line 235
let ext = txn.get_external(&latest_touch)?.unwrap();let ext = txn_.get_external(&latest_touch)?.unwrap(); - replacement in libpijul/src/output/archive.rs at line 242
txn,&*txn_, - replacement in libpijul/src/output/archive.rs at line 244
txn.graph(&channel),txn_.graph(&channel_), - replacement in libpijul/src/output/archive.rs at line 258
let mut l = crate::alive::retrieve(txn, txn.graph(&channel), output_item.pos)?;let mut l =crate::alive::retrieve(&*txn_, txn_.graph(&channel_), output_item.pos)?; - edit in libpijul/src/output/archive.rs at line 272
std::mem::drop(channel_);std::mem::drop(txn_); - replacement in libpijul/src/output/archive.rs at line 277
&channel,channel, - edit in libpijul/src/lib.rs at line 261[7.727750]→[7.727750:727756](∅→∅),[7.727756]→[7.84622:84623](∅→∅),[7.84623]→[7.2901:2969](∅→∅),[7.126273]→[7.2901:2969](∅→∅),[7.727757]→[7.2901:2969](∅→∅),[7.2969]→[7.727829:727919](∅→∅),[7.727829]→[7.727829:727919](∅→∅),[7.727919]→[7.126274:126308](∅→∅),[7.126308]→[7.727952:728008](∅→∅),[7.727952]→[7.727952:728008](∅→∅),[7.728008]→[7.4880:4899](∅→∅),[7.4899]→[7.33677:33766](∅→∅),[7.29838]→[7.728064:728239](∅→∅),[7.33766]→[7.728064:728239](∅→∅),[7.95462]→[7.728064:728239](∅→∅),[7.728064]→[7.728064:728239](∅→∅),[7.728239]→[7.4900:4918](∅→∅),[7.4918]→[7.728239:728644](∅→∅),[7.728239]→[7.728239:728644](∅→∅),[7.728644]→[7.126309:126343](∅→∅),[7.126343]→[7.728677:728757](∅→∅),[7.728677]→[7.728677:728757](∅→∅),[7.728757]→[7.4919:4938](∅→∅),[7.4938]→[7.33767:33856](∅→∅),[7.29935]→[7.728813:728883](∅→∅),[7.33856]→[7.728813:728883](∅→∅),[7.95568]→[7.728813:728883](∅→∅),[7.728813]→[7.728813:728883](∅→∅),[7.728883]→[7.103863:103939](∅→∅),[7.84709]→[7.126344:126445](∅→∅),[7.103939]→[7.126344:126445](∅→∅),[7.95647]→[7.126344:126445](∅→∅),[7.126445]→[7.728987:729061](∅→∅),[7.728987]→[7.728987:729061](∅→∅),[7.729061]→[7.126446:126488](∅→∅),[7.126488]→[7.729094:729182](∅→∅),[7.729094]→[7.729094:729182](∅→∅),[7.729182]→[7.126489:126591](∅→∅),[7.126591]→[7.4939:4999](∅→∅),[7.4999]→[7.729333:729347](∅→∅),[7.729333]→[7.729333:729347](∅→∅),[7.729347]→[7.5958:5972](∅→∅),[7.5972]→[7.103940:103992](∅→∅),[7.103992]→[7.6033:6165](∅→∅),[7.6033]→[7.6033:6165](∅→∅),[7.6165]→[7.729448:729545](∅→∅),[7.126654]→[7.729448:729545](∅→∅),[7.729448]→[7.729448:729545](∅→∅),[7.729545]→[7.126655:126726](∅→∅),[7.29999]→[7.729602:729612](∅→∅),[7.126726]→[7.729602:729612](∅→∅),[7.729602]→[7.729602:729612](∅→∅)
}fn archive_with_state<P: changestore::ChangeStore, A: Archive>(&mut self,changes: &P,channel: &mut pristine::ChannelRef<Self>,state: &pristine::Merkle,extra: &[pristine::Hash],arch: &mut A,salt: u64,) -> Result<Vec<output::Conflict>, output::ArchiveError<P::Error, Self, A::Error>> {self.archive_prefix_with_state(changes,channel,state,extra,&mut std::iter::empty(),arch,salt,)}/// Warning: this method unrecords changes until finding the/// state. If this is not wanted, please fork the channel before/// calling.fn archive_prefix_with_state<'a,P: changestore::ChangeStore,A: Archive,I: Iterator<Item = &'a str>,>(&mut self,changes: &P,channel: &mut pristine::ChannelRef<Self>,state: &pristine::Merkle,extra: &[pristine::Hash],prefix: &mut I,arch: &mut A,salt: u64,) -> Result<Vec<output::Conflict>, output::ArchiveError<P::Error, Self, A::Error>> {let mut unrecord = Vec::new();let mut found = false;for x in pristine::changeid_rev_log(self, &channel.read(), None)? {let (_, p) = x?;let m: Merkle = (&p.b).into();if &m == state {found = true;break;} else {unrecord.push(p.a.into())}}debug!("unrecord = {:?}", unrecord);if found {for h in unrecord.iter() {let h = self.get_external(h)?.unwrap().into();self.unrecord(changes, channel, &h, salt)?;}{let mut channel_ = channel.write();for app in extra.iter() {self.apply_change_rec(changes, &mut channel_, app)?}}output::archive(changes, self, channel, prefix, arch)} else {Err(output::ArchiveError::StateNotFound { state: *state })} - replacement in libpijul/src/lib.rs at line 456
fn archive<C: changestore::ChangeStore, A: Archive>(fn iter_adjacent<'txn>(&'txn self,graph: &'txn Self::Channel,key: Vertex<pristine::ChangeId>,min_flag: pristine::EdgeFlags,max_flag: pristine::EdgeFlags,) -> Result<pristine::AdjacentIterator<'txn, Self>, pristine::TxnErr<Self::GraphError>> {pristine::iter_adjacent(self, self.graph(graph), key, min_flag, max_flag)}}impl<T: ChannelTxnT + TreeTxnT + DepsTxnT<DepsError = <T as GraphTxnT>::GraphError>> ArcTxn<T> {pub fn archive<C: changestore::ChangeStore, A: Archive>( - replacement in libpijul/src/lib.rs at line 471
channel: &pristine::ChannelRef<Self>,channel: &pristine::ChannelRef<T>, - replacement in libpijul/src/lib.rs at line 473
) -> Result<Vec<output::Conflict>, output::ArchiveError<C::Error, Self, A::Error>> {) -> Result<Vec<output::Conflict>, output::ArchiveError<C::Error, T, A::Error>> { - replacement in libpijul/src/lib.rs at line 477
fn archive_prefix<'a, C: changestore::ChangeStore, I: Iterator<Item = &'a str>, A: Archive>(pub fn archive_prefix<'a,C: changestore::ChangeStore,I: Iterator<Item = &'a str>,A: Archive,>( - replacement in libpijul/src/lib.rs at line 485
channel: &pristine::ChannelRef<Self>,channel: &pristine::ChannelRef<T>, - replacement in libpijul/src/lib.rs at line 488
) -> Result<Vec<output::Conflict>, output::ArchiveError<C::Error, Self, A::Error>> {) -> Result<Vec<output::Conflict>, output::ArchiveError<C::Error, T, A::Error>> { - edit in libpijul/src/lib.rs at line 490
}}impl<T: MutTxnT> ArcTxn<T> {pub fn archive_with_state<P: changestore::ChangeStore, A: Archive>(&self,changes: &P,channel: &pristine::ChannelRef<T>,state: &pristine::Merkle,extra: &[pristine::Hash],arch: &mut A,salt: u64,) -> Result<Vec<output::Conflict>, output::ArchiveError<P::Error, T, A::Error>> {self.archive_prefix_with_state(changes,channel,state,extra,&mut std::iter::empty(),arch,salt,) - replacement in libpijul/src/lib.rs at line 514[7.62357]→[7.60581:60609](∅→∅),[7.60609]→[7.62395:62415](∅→∅),[7.62395]→[7.62395:62415](∅→∅),[7.62415]→[7.60610:60646](∅→∅),[7.60646]→[7.62462:62581](∅→∅),[7.99401]→[7.62462:62581](∅→∅),[7.62462]→[7.62462:62581](∅→∅),[7.62581]→[7.99402:99496](∅→∅),[7.99496]→[7.5729:5811](∅→∅)
fn iter_adjacent<'txn>(&'txn self,graph: &'txn Self::Channel,key: Vertex<pristine::ChangeId>,min_flag: pristine::EdgeFlags,max_flag: pristine::EdgeFlags,) -> Result<pristine::AdjacentIterator<'txn, Self>, pristine::TxnErr<Self::GraphError>> {pristine::iter_adjacent(self, self.graph(graph), key, min_flag, max_flag)/// Warning: this method unrecords changes until finding the/// state. If this is not wanted, please fork the channel before/// calling.pub fn archive_prefix_with_state<'a,P: changestore::ChangeStore,A: Archive,I: Iterator<Item = &'a str>,>(&self,changes: &P,channel: &pristine::ChannelRef<T>,state: &pristine::Merkle,extra: &[pristine::Hash],prefix: &mut I,arch: &mut A,salt: u64,) -> Result<Vec<output::Conflict>, output::ArchiveError<P::Error, T, A::Error>> {let mut unrecord = Vec::new();let mut found = false;let mut txn = self.write();for x in pristine::changeid_rev_log(&*txn, &channel.read(), None)? {let (_, p) = x?;let m: Merkle = (&p.b).into();if &m == state {found = true;break;} else {unrecord.push(p.a.into())}}debug!("unrecord = {:?}", unrecord);if found {for h in unrecord.iter() {let h = txn.get_external(h)?.unwrap().into();unrecord::unrecord(&mut *txn, channel, changes, &h, salt)?;}{let mut channel_ = channel.write();for app in extra.iter() {crate::apply::apply_change_rec(changes, &mut *txn, &mut channel_, app, false)?}}std::mem::drop(txn);output::archive(changes, self, channel, prefix, arch)} else {Err(output::ArchiveError::StateNotFound { state: *state })} - replacement in libpijul/src/diff/mod.rs at line 132
txn: &T,channel: &T::Channel,txn: &ArcTxn<T>,channel: &ChannelRef<T>, - edit in libpijul/src/diff/mod.rs at line 147[7.794648][50.716]
let txn = txn.read();let channel = channel.read(); - replacement in libpijul/src/diff/mod.rs at line 176
txn,txn.graph(channel),&*txn,txn.graph(&*channel), - replacement in libpijul/src/alive/output.rs at line 19
txn: &T,channel: &T::Channel,txn: &ArcTxn<T>,channel: &ChannelRef<T>, - edit in libpijul/src/alive/output.rs at line 37
let txn = txn.read();let channel = channel.read(); - replacement in libpijul/src/alive/output.rs at line 43
.map(|a| a.oldest_vertex(changes, txn, channel, graph, sccs).unwrap()).map(|a| {a.oldest_vertex(changes, &*txn, &*channel, graph, sccs).unwrap()}) - replacement in libpijul/src/alive/output.rs at line 52
.map(|b| b.oldest_vertex(changes, txn, channel, graph, sccs).unwrap()).map(|b| {b.oldest_vertex(changes, &*txn, &*channel, graph, sccs).unwrap()}) - edit in libpijul/src/alive/output.rs at line 81
let txn = txn.read(); - replacement in libpijul/src/alive/output.rs at line 196
txn: &T,txn: &ArcTxn<T>, - edit in libpijul/src/alive/output.rs at line 213
let txn = txn.read(); - replacement in libpijul/src/alive/output.rs at line 229
|p| txn.get_external(&p).unwrap().map(|x| x.into()),|p| txn.read().get_external(&p).unwrap().map(|x| x.into()), - replacement in libpijul/src/alive/output.rs at line 254
txn: &T,channel: &T::Channel,txn: &ArcTxn<T>,channel: &ChannelRef<T>, - replacement in libpijul/src/alive/output.rs at line 266[7.994757]→[7.8316:8404](∅→∅),[7.8404]→[7.994833:994834](∅→∅),[7.67507]→[7.994833:994834](∅→∅),[7.137675]→[7.994833:994834](∅→∅),[7.994833]→[7.994833:994834](∅→∅)
graph.collect_forward_edges(txn, txn.graph(channel), &scc, &forward_scc, forward)?;{let txn = txn.read();let channel = channel.read();graph.collect_forward_edges(&*txn, txn.graph(&*channel), &scc, &forward_scc, forward)?;}