replacement in pijul/src/remote/mod.rs at line 789
[27.13011]→[24.0:88](∅→∅) − debug!("update_changelist_pushpull line {}, {:?} {:?}", line!(), n, h);
+ debug!(
+ "update_changelist_pushpull line {}, {:?} {:?}",
+ line!(),
+ n,
+ h
+ );
replacement in pijul/src/remote/mod.rs at line 1286
replacement in pijul/src/remote/mod.rs at line 1382
[27.593]→[27.604:703](∅→∅) − .download_changes_rec(repo, send_hash, recv_signal, send_ready, pro_n, waiting, asked)
+ .download_changes_rec(
+ repo,
+ send_hash,
+ recv_signal,
+ send_ready,
+ pro_n,
+ waiting,
+ asked,
+ )
replacement in pijul/src/remote/http.rs at line 41
[27.24470]→[27.557:628](∅→∅) − tokio::fs::create_dir_all(&path.parent().unwrap()).await.unwrap();
+ tokio::fs::create_dir_all(&path.parent().unwrap())
+ .await
+ .unwrap();
replacement in pijul/src/remote/http.rs at line 167
[27.1410]→[27.1410:1435](∅→∅) replacement in pijul/src/remote/http.rs at line 173
[27.1626]→[27.1626:1652](∅→∅) replacement in pijul/src/remote/http.rs at line 541
[27.1930]→[27.1930:2044](∅→∅) − pub async fn prove(
− &mut self,
− key: libpijul::key::SKey,
− ) -> Result<(), anyhow::Error> {
+ pub async fn prove(&mut self, key: libpijul::key::SKey) -> Result<(), anyhow::Error> {
replacement in pijul/src/identity/mod.rs at line 133
[27.4106]→[27.280:382](∅→∅) − if let Ok(password) = keyring::Entry::new("pijul", name).and_then(|x| x.get_password()) {
+ if let Ok(password) = keyring::Entry::new("pijul", name).and_then(|x| x.get_password())
+ {
replacement in pijul/src/identity/mod.rs at line 149
[27.4743]→[27.383:496](∅→∅) − if let Err(e) = keyring::Entry::new("pijul", name).and_then(|x| x.set_password(&password_attempt)) {
+ if let Err(e) =
+ keyring::Entry::new("pijul", name).and_then(|x| x.set_password(&password_attempt))
+ {
replacement in pijul/src/identity/mod.rs at line 272
[27.7658]→[27.497:613](∅→∅) − if let Err(e) = keyring::Entry::new("pijul", &self.name).and_then(|x| x.set_password(&user_password)) {
+ if let Err(e) = keyring::Entry::new("pijul", &self.name)
+ .and_then(|x| x.set_password(&user_password))
+ {
edit in pijul/src/identity/create.rs at line 8
edit in pijul/src/identity/create.rs at line 12
[27.28571]→[27.8736:8770](∅→∅) − use thrussh_keys::key::PublicKey;
replacement in pijul/src/identity/create.rs at line 14
+ use thrussh_keys::key::PublicKey;
replacement in pijul/src/commands/tag.rs at line 290
[27.5248]→[22.0:127](∅→∅) − chrono::DateTime::from_naive_utc_and_offset(chrono::NaiveDateTime::from_timestamp_opt(t, 0).unwrap(), chrono::Utc)
+ chrono::DateTime::from_naive_utc_and_offset(
+ chrono::NaiveDateTime::from_timestamp_opt(t, 0).unwrap(),
+ chrono::Utc,
+ )
replacement in pijul/src/commands/protocol.rs at line 413
[27.2669]→[14.492:524](∅→∅) replacement in pijul/src/commands/identity.rs at line 443
[27.19585]→[27.1057:1165](∅→∅) − if let Err(e) = Entry::new("pijul", &identity.name).and_then(|x| x.delete_password()) {
+ if let Err(e) =
+ Entry::new("pijul", &identity.name).and_then(|x| x.delete_password())
+ {
edit in pijul/src/commands/dependents.rs at line 1
[27.243]→[27.244:288](∅→∅) − use std::path::PathBuf;
− use std::io::Write;
edit in pijul/src/commands/dependents.rs at line 3
+ use std::io::Write;
+ use std::path::PathBuf;
replacement in pijul/src/commands/dependents.rs at line 37
[16.450]→[16.450:480](∅→∅) replacement in pijul/src/commands/dependents.rs at line 65
[16.856]→[16.856:886](∅→∅) replacement in pijul/src/commands/debug.rs at line 55
[27.518]→[27.518:629](∅→∅) − txn
− .follow_oldest_path(&repo.changes, &channel, &root)?.0
+ txn.follow_oldest_path(&repo.changes, &channel, &root)?.0
replacement in pijul/src/commands/debug.rs at line 84
[27.805]→[27.805:939](∅→∅) − if let (Some(a), Some(b)) = (it.next(),it.next()) {
− use libpijul::pristine::{Position, ChangeId, ChangePosition, Base32};
+ if let (Some(a), Some(b)) = (it.next(), it.next()) {
+ use libpijul::pristine::{Base32, ChangeId, ChangePosition, Position};
edit in pijul/src/commands/client.rs at line 3
+ use crate::config::global_config_dir;
+ use hyper::service::{make_service_fn, service_fn};
+ use hyper::{Body, Request, Response, Server};
edit in pijul/src/commands/client.rs at line 8
[27.4644]→[27.4644:4773](∅→∅) − use hyper::{Body, Request, Response, Server};
− use hyper::service::{make_service_fn, service_fn};
− use tokio::sync::mpsc::channel;
replacement in pijul/src/commands/client.rs at line 9
[27.4792]→[27.4792:4830](∅→∅) − use crate::config::global_config_dir;
+ use tokio::sync::mpsc::channel;
edit in pijul/src/commands/client.rs at line 20
[27.5032]→[27.5032:5033](∅→∅) replacement in pijul/src/commands/client.rs at line 29
[27.5461]→[27.5461:5495](∅→∅) edit in pijul/src/commands/client.rs at line 36
[27.5610]→[27.5610:5611](∅→∅) replacement in pijul/src/commands/client.rs at line 65
[27.6965]→[27.6965:7011](∅→∅) replacement in pijul/src/commands/client.rs at line 80
[21.60]→[27.11272:11362](∅→∅),
[27.7541]→[27.11272:11362](∅→∅) − eprintln!("If the URL doesn't open automatically, please visit {}", url);
+ eprintln!(
+ "If the URL doesn't open automatically, please visit {}",
+ url
+ );
replacement in pijul/src/commands/client.rs at line 85
[27.7598]→[27.7598:7623](∅→∅) replacement in pijul/src/commands/client.rs at line 111
[27.8334]→[27.8334:8356](∅→∅) replacement in pijul/src/commands/apply.rs at line 139
[13.188]→[13.188:221](∅→∅) replacement in pijul/Cargo.toml at line 82
[27.197874]→[27.0:85](∅→∅) − sanakirja = { version = "1.2.16", default-features = false, features = [ "crc32" ] }
+ sanakirja = { version = "1.4.0", default-features = false, features = [ "crc32" ] }
replacement in libpijul/src/vertex_buffer.rs at line 165
[27.221091]→[27.0:91](∅→∅) − changes: sides.iter().flat_map(|(_, b)| b.iter()).cloned().cloned().collect(),
+ changes: sides
+ .iter()
+ .flat_map(|(_, b)| b.iter())
+ .cloned()
+ .cloned()
+ .collect(),
replacement in libpijul/src/vertex_buffer.rs at line 184
[27.221363]→[27.92:185](∅→∅) − changes: add_del.iter().flat_map(|(_, b)| b.iter()).cloned().cloned().collect(),
+ changes: add_del
+ .iter()
+ .flat_map(|(_, b)| b.iter())
+ .cloned()
+ .cloned()
+ .collect(),
replacement in libpijul/src/vertex_buffer.rs at line 204
[27.221703]→[27.186:309](∅→∅) − fn conflict_next<C: ChangeStore>(&mut self, id_: usize, sides: Option<(&C, &[&Hash])>) -> Result<(), std::io::Error> {
+ fn conflict_next<C: ChangeStore>(
+ &mut self,
+ id_: usize,
+ sides: Option<(&C, &[&Hash])>,
+ ) -> Result<(), std::io::Error> {
replacement in libpijul/src/vertex_buffer.rs at line 229
− Ok(header) => if let Some(l) = header.message.lines().next() {
− l.to_string()
− } else {
− String::new()
− },
+ Ok(header) => {
+ if let Some(l) = header.message.lines().next() {
+ l.to_string()
+ } else {
+ String::new()
+ }
+ }
edit in libpijul/src/unrecord/mod.rs at line 589
[27.2201]→[27.1690:1691](∅→∅) replacement in libpijul/src/unrecord/mod.rs at line 611
[27.2511]→[27.2511:2532](∅→∅) replacement in libpijul/src/unrecord/mod.rs at line 629
[27.3143]→[27.3143:3168](∅→∅) edit in libpijul/src/unrecord/mod.rs at line 659
[27.4017]→[27.4017:4018](∅→∅) edit in libpijul/src/unrecord/mod.rs at line 674
[27.2923]→[27.4099:4100](∅→∅) replacement in libpijul/src/unrecord/mod.rs at line 680
[27.4413]→[27.4413:4439](∅→∅) edit in libpijul/src/unrecord/mod.rs at line 695
[27.238933]→[27.238933:238934](∅→∅) resolve order conflict in libpijul/src/unrecord/mod.rs at line 695
replacement in libpijul/src/tests/file_conflicts.rs at line 1216
[27.646]→[8.708:813](∅→∅) − Conflict::ZombieFile { ref path, .. } => assert!(path == "a/b/c/file" || path == "a/b/c/alice"),
+ Conflict::ZombieFile { ref path, .. } => {
+ assert!(path == "a/b/c/file" || path == "a/b/c/alice")
+ }
replacement in libpijul/src/tests/file_conflicts.rs at line 1238
[27.692]→[8.814:919](∅→∅) − Conflict::ZombieFile { ref path, .. } => assert!(path == "a/b/c/file" || path == "a/b/c/alice"),
+ Conflict::ZombieFile { ref path, .. } => {
+ assert!(path == "a/b/c/file" || path == "a/b/c/alice")
+ }
replacement in libpijul/src/tag.rs at line 169
[27.8872]→[27.8872:8945](∅→∅) − ::sanakirja::btree::Db_::from_page(tag.header.offsets.external);
+ unsafe { ::sanakirja::btree::Db_::from_page(tag.header.offsets.external) };
replacement in libpijul/src/tag.rs at line 317
[27.12934]→[27.12934:13025](∅→∅) − fn load_page(&self, off: u64) -> Result<::sanakirja::CowPage, ::sanakirja::CRCError> {
+ unsafe fn load_page(&self, off: u64) -> Result<::sanakirja::CowPage, ::sanakirja::CRCError> {
replacement in libpijul/src/tag.rs at line 346
[27.13707]→[27.13707:13745](∅→∅) − let page = txn.txn.alloc_page()?;
+ let page = unsafe { txn.txn.alloc_page()? };
replacement in libpijul/src/tag.rs at line 374
[27.14586]→[27.14586:14640](∅→∅) − let new_page = txn.txn.alloc_page()?;
+ let new_page = unsafe { txn.txn.alloc_page()? };
replacement in libpijul/src/tag.rs at line 381
− unsafe { P::put_mut(&mut new_page_, &mut new_curs, &k, &v, r) }
+ unsafe { P::put_mut(&mut txn.txn, &mut new_page_, &mut new_curs, &k, &v, r) }
replacement in libpijul/src/tag.rs at line 385
[27.14933]→[27.14933:14984](∅→∅) − Ok(::sanakirja::btree::Db_::from_page(result))
+ Ok(unsafe { ::sanakirja::btree::Db_::from_page(result) })
replacement in libpijul/src/tag.rs at line 479
[27.18233]→[27.18233:18258](∅→∅) + txn.internal.db.into(),
replacement in libpijul/src/tag.rs at line 487
[27.18452]→[27.18452:18477](∅→∅) + txn.external.db.into(),
replacement in libpijul/src/tag.rs at line 495
[27.18680]→[27.18680:18706](∅→∅) + channel.graph.db.into(),
replacement in libpijul/src/tag.rs at line 503
[27.18875]→[27.18875:18903](∅→∅) + channel.changes.db.into(),
replacement in libpijul/src/tag.rs at line 514
[27.19146]→[27.19146:19214](∅→∅) − >(&txn, channel.revchanges.db, &mut new, &sender, &breceiver)?;
+ >(
+ &txn,
+ channel.revchanges.db.into(),
+ &mut new,
+ &sender,
+ &breceiver,
+ )?;
replacement in libpijul/src/tag.rs at line 524
[27.19335]→[27.19335:19362](∅→∅) + channel.states.db.into(),
replacement in libpijul/src/tag.rs at line 535
− >(&txn, channel.tags.db, &mut new, &sender, &breceiver)?;
+ >(&txn, channel.tags.db.into(), &mut new, &sender, &breceiver)?;
edit in libpijul/src/tag.rs at line 556
+ struct CopyTxn {}
+
+ impl ::sanakirja::AllocPage for CopyTxn {
+ /// Allocate a single page.
+ unsafe fn alloc_page(&mut self) -> Result<::sanakirja::MutPage, Self::Error> {
+ unimplemented!()
+ }
+
+ /// Allocate a single page.
+ unsafe fn alloc_page_no_dirty(&mut self) -> Result<::sanakirja::MutPage, Self::Error> {
+ unimplemented!()
+ }
+
+ /// Allocate many contiguous pages, return the first one
+ unsafe fn alloc_contiguous(&mut self, _: u64) -> Result<::sanakirja::MutPage, Self::Error> {
+ unimplemented!()
+ }
+
+ /// Increment the reference count for page `off`.
+ fn incr_rc(&mut self, _: u64) -> Result<usize, Self::Error> {
+ unimplemented!()
+ }
+
+ unsafe fn decr_rc(&mut self, _: u64) -> Result<usize, Self::Error> {
+ unimplemented!()
+ }
+
+ unsafe fn decr_rc_owned(&mut self, _: u64) -> Result<usize, Self::Error> {
+ unimplemented!()
+ }
+ }
+
+ impl ::sanakirja::LoadPage for CopyTxn {
+ type Error = std::convert::Infallible;
+ unsafe fn load_page(&self, _: u64) -> Result<::sanakirja::CowPage, Self::Error> {
+ unimplemented!()
+ }
+ }
+
replacement in libpijul/src/tag.rs at line 613
[4.836]→[27.20669:20730](∅→∅),
[27.20669]→[27.20669:20730](∅→∅) − let page = txn.txn.load_page(old_page_off).unwrap();
+ let page = unsafe { txn.txn.load_page(old_page_off).unwrap() };
replacement in libpijul/src/tag.rs at line 645
[27.21785]→[3.77:151](∅→∅) − unsafe { P::put_mut(&mut new_page_, &mut new_curs, k, v, r) }
+ unsafe { P::put_mut(&mut CopyTxn {}, &mut new_page_, &mut new_curs, k, v, r) }
replacement in libpijul/src/tag/txn.rs at line 91
[27.2116]→[27.2116:2197](∅→∅) − fn load_page(&self, off: u64) -> Result<::sanakirja::CowPage, Self::Error> {
+ unsafe fn load_page(&self, off: u64) -> Result<::sanakirja::CowPage, Self::Error> {
replacement in libpijul/src/tag/txn.rs at line 124
[27.3286]→[27.3286:3486](∅→∅) − use crate::pristine::sanakirja::Db;
− let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(db.graph);
− Ok(::sanakirja::btree::get(self, &gr, key, value)?.map(|(_, v)| v))
+ unsafe {
+ use crate::pristine::sanakirja::Db;
+ let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(db.graph);
+ Ok(::sanakirja::btree::get(self, &gr, key, value)?.map(|(_, v)| v))
+ }
replacement in libpijul/src/tag/txn.rs at line 135
[27.3638]→[27.3638:3852](∅→∅) − use crate::pristine::sanakirja::UDb;
− let gr: UDb<ChangeId, SerializedHash> = UDb::from_page(self.header.offsets.external);
− Ok(::sanakirja::btree::get(self, &gr, int, None)?.map(|(_, v)| v))
+ unsafe {
+ use crate::pristine::sanakirja::UDb;
+ let gr: UDb<ChangeId, SerializedHash> = UDb::from_page(self.header.offsets.external);
+ Ok(::sanakirja::btree::get(self, &gr, int, None)?.map(|(_, v)| v))
+ }
replacement in libpijul/src/tag/txn.rs at line 146
[27.4004]→[27.4004:4218](∅→∅) − use crate::pristine::sanakirja::UDb;
− let gr: UDb<SerializedHash, ChangeId> = UDb::from_page(self.header.offsets.internal);
− Ok(::sanakirja::btree::get(self, &gr, int, None)?.map(|(_, v)| v))
+ unsafe {
+ use crate::pristine::sanakirja::UDb;
+ let gr: UDb<SerializedHash, ChangeId> = UDb::from_page(self.header.offsets.internal);
+ Ok(::sanakirja::btree::get(self, &gr, int, None)?.map(|(_, v)| v))
+ }
replacement in libpijul/src/tag/txn.rs at line 163
[27.4509]→[27.4509:4960](∅→∅) − let edge = SerializedEdge::new(min_flag, dest.change, dest.pos, ChangeId::ROOT);
− use crate::pristine::sanakirja::Db;
− let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(g.graph);
− let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &gr)?;
− cursor.set(self, &key, Some(&edge))?;
− Ok(Self::Adj {
− cursor,
− key,
− min_flag,
− max_flag,
− })
+ unsafe {
+ let edge = SerializedEdge::new(min_flag, dest.change, dest.pos, ChangeId::ROOT);
+ use crate::pristine::sanakirja::Db;
+ let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(g.graph);
+ let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &gr)?;
+ cursor.set(self, &key, Some(&edge))?;
+ Ok(Self::Adj {
+ cursor,
+ key,
+ min_flag,
+ max_flag,
+ })
+ }
replacement in libpijul/src/tag/txn.rs at line 191
[27.5393]→[27.5393:5586](∅→∅) − use crate::pristine::sanakirja::Db;
− let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(graph.graph);
− Ok(crate::pristine::sanakirja::find_block(self, &gr, p)?)
+ unsafe {
+ use crate::pristine::sanakirja::Db;
+ let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(graph.graph);
+ Ok(crate::pristine::sanakirja::find_block(self, &gr, p)?)
+ }
replacement in libpijul/src/tag/txn.rs at line 203
[27.5758]→[27.5758:5955](∅→∅) − use crate::pristine::sanakirja::Db;
− let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(graph.graph);
− Ok(crate::pristine::sanakirja::find_block_end(self, &gr, p)?)
+ unsafe {
+ use crate::pristine::sanakirja::Db;
+ let gr: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(graph.graph);
+ Ok(crate::pristine::sanakirja::find_block_end(self, &gr, p)?)
+ }
replacement in libpijul/src/tag/txn.rs at line 253
[27.7265]→[27.7265:7584](∅→∅) − use crate::pristine::sanakirja::Db;
− let db: Db<ChangeId, L64> = Db::from_page(*channel);
− match ::sanakirja::btree::get(self, &db, c, None) {
− Ok(Some((k, x))) if k == c => Ok(Some(x)),
− Ok(x) => {
− debug!("get_changeset = {:?}", x);
− Ok(None)
+ unsafe {
+ use crate::pristine::sanakirja::Db;
+ let db: Db<ChangeId, L64> = Db::from_page(*channel);
+ match ::sanakirja::btree::get(self, &db, c, None) {
+ Ok(Some((k, x))) if k == c => Ok(Some(x)),
+ Ok(x) => {
+ debug!("get_changeset = {:?}", x);
+ Ok(None)
+ }
+ Err(e) => {
+ error!("{:?}", e);
+ Err(TxnErr(SanakirjaError::PristineCorrupt).into())
+ }
edit in libpijul/src/tag/txn.rs at line 267
[27.7598]→[27.7598:7725](∅→∅),
[27.7725]→[27.7725:7739](∅→∅) − Err(e) => {
− error!("{:?}", e);
− Err(TxnErr(SanakirjaError::PristineCorrupt).into())
− }
replacement in libpijul/src/tag/txn.rs at line 275
[27.7941]→[27.7941:8349](∅→∅) − use crate::pristine::sanakirja::UDb;
− let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*revchanges);
− match ::sanakirja::btree::get(self, &db, c, None) {
− Ok(Some((k, x))) if k == c => Ok(Some(x)),
− Ok(_) => Ok(None),
− Err(e) => {
− error!("{:?}", e);
− Err(TxnErr(SanakirjaError::PristineCorrupt).into())
+ unsafe {
+ use crate::pristine::sanakirja::UDb;
+ let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*revchanges);
+ match ::sanakirja::btree::get(self, &db, c, None) {
+ Ok(Some((k, x))) if k == c => Ok(Some(x)),
+ Ok(_) => Ok(None),
+ Err(e) => {
+ error!("{:?}", e);
+ Err(TxnErr(SanakirjaError::PristineCorrupt).into())
+ }
replacement in libpijul/src/tag/txn.rs at line 297
[27.8692]→[27.8692:8947](∅→∅) − use crate::pristine::sanakirja::Db;
− let db: Db<ChangeId, L64> = Db::from_page(*channel);
− let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;
− if let Some(k) = pos {
− cursor.set(self, &k, None)?;
+ unsafe {
+ use crate::pristine::sanakirja::Db;
+ let db: Db<ChangeId, L64> = Db::from_page(*channel);
+ let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;
+ if let Some(k) = pos {
+ cursor.set(self, &k, None)?;
+ }
+ Ok(Cursor {
+ cursor,
+ txn: self,
+ k: std::marker::PhantomData,
+ v: std::marker::PhantomData,
+ t: std::marker::PhantomData,
+ })
edit in libpijul/src/tag/txn.rs at line 312
[27.8957]→[27.8957:9154](∅→∅) − Ok(Cursor {
− cursor,
− txn: self,
− k: std::marker::PhantomData,
− v: std::marker::PhantomData,
− t: std::marker::PhantomData,
− })
replacement in libpijul/src/tag/txn.rs at line 328
[27.9636]→[27.9636:9920](∅→∅) − use crate::pristine::sanakirja::UDb;
− let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*channel);
− let mut cursor = ::sanakirja::btree::cursor::Cursor::new(&*txn, &db)?;
− if let Some(k) = pos {
− cursor.set(&*txn, &k, None)?;
+ unsafe {
+ use crate::pristine::sanakirja::UDb;
+ let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*channel);
+ let mut cursor = ::sanakirja::btree::cursor::Cursor::new(&*txn, &db)?;
+ if let Some(k) = pos {
+ cursor.set(&*txn, &k, None)?;
+ }
+ Ok(Cursor {
+ cursor,
+ txn,
+ k: std::marker::PhantomData,
+ v: std::marker::PhantomData,
+ t: std::marker::PhantomData,
+ })
edit in libpijul/src/tag/txn.rs at line 343
[27.9930]→[27.9930:10121](∅→∅) − Ok(Cursor {
− cursor,
− txn,
− k: std::marker::PhantomData,
− v: std::marker::PhantomData,
− t: std::marker::PhantomData,
− })
replacement in libpijul/src/tag/txn.rs at line 353
[27.10397]→[27.10397:10950](∅→∅) − use crate::pristine::sanakirja::UDb;
− let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*channel);
− let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;
− if let Some(ref pos) = pos {
− cursor.set(self, pos, None)?;
− } else {
− cursor.set_last(self)?;
− };
− Ok(RevCursor {
− cursor,
− txn: self,
− k: std::marker::PhantomData,
− v: std::marker::PhantomData,
− t: std::marker::PhantomData,
− })
+ unsafe {
+ use crate::pristine::sanakirja::UDb;
+ let db: UDb<L64, Pair<ChangeId, SerializedMerkle>> = UDb::from_page(*channel);
+ let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;
+ if let Some(ref pos) = pos {
+ cursor.set(self, pos, None)?;
+ } else {
+ cursor.set_last(self)?;
+ };
+ Ok(RevCursor {
+ cursor,
+ txn: self,
+ k: std::marker::PhantomData,
+ v: std::marker::PhantomData,
+ t: std::marker::PhantomData,
+ })
+ }
replacement in libpijul/src/tag/txn.rs at line 419
[27.12419]→[27.12419:12675](∅→∅) − use crate::pristine::sanakirja::UDb;
− let db: UDb<SerializedMerkle, L64> = UDb::from_page(*channel);
− match ::sanakirja::btree::get(self, &db, m, None)? {
− Some((k, v)) if k == m => Ok(Some(*v)),
− _ => Ok(None),
+ unsafe {
+ use crate::pristine::sanakirja::UDb;
+ let db: UDb<SerializedMerkle, L64> = UDb::from_page(*channel);
+ match ::sanakirja::btree::get(self, &db, m, None)? {
+ Some((k, v)) if k == m => Ok(Some(*v)),
+ _ => Ok(None),
+ }
replacement in libpijul/src/tag/txn.rs at line 436
[27.2496]→[27.2496:2540](∅→∅),
[27.2540]→[27.39095:39185](∅→∅),
[27.39185]→[27.2592:2726](∅→∅),
[27.2592]→[27.2592:2726](∅→∅),
[27.2726]→[6.894:922](∅→∅) − use crate::pristine::sanakirja::Db;
− let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*tags);
− let t: L64 = t.into();
− match ::sanakirja::btree::get(self, &db, &t, None)? {
− Some((k, _)) => Ok(k == &t),
− _ => Ok(false),
+ unsafe {
+ use crate::pristine::sanakirja::Db;
+ let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*tags);
+ let t: L64 = t.into();
+ match ::sanakirja::btree::get(self, &db, &t, None)? {
+ Some((k, _)) => Ok(k == &t),
+ _ => Ok(false),
+ }
replacement in libpijul/src/tag/txn.rs at line 461
[27.13471]→[27.2833:2877](∅→∅),
[27.2877]→[27.39303:39396](∅→∅),
[27.2932]→[27.13585:13733](∅→∅),
[27.39396]→[27.13585:13733](∅→∅),
[27.13585]→[27.13585:13733](∅→∅) − use crate::pristine::sanakirja::Db;
− let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*channel);
− let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;
− if let Some(k) = k {
− cursor.set(self, &k, None)?;
+ unsafe {
+ use crate::pristine::sanakirja::Db;
+ let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*channel);
+ let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;
+ if let Some(k) = k {
+ cursor.set(self, &k, None)?;
+ }
+ Ok(Cursor {
+ cursor,
+ txn: self,
+ k: std::marker::PhantomData,
+ v: std::marker::PhantomData,
+ t: std::marker::PhantomData,
+ })
edit in libpijul/src/tag/txn.rs at line 476
[27.13743]→[27.13743:13940](∅→∅) − Ok(Cursor {
− cursor,
− txn: self,
− k: std::marker::PhantomData,
− v: std::marker::PhantomData,
− t: std::marker::PhantomData,
− })
replacement in libpijul/src/tag/txn.rs at line 532
[27.15103]→[27.3272:3316](∅→∅),
[27.3316]→[27.39870:39963](∅→∅),
[27.3371]→[27.15217:15645](∅→∅),
[27.39963]→[27.15217:15645](∅→∅),
[27.15217]→[27.15217:15645](∅→∅) − use crate::pristine::sanakirja::Db;
− let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*channel);
− let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;
− if let Some(from) = from {
− cursor.set(self, &from.into(), None)?;
− } else {
− cursor.set_last(self)?;
− };
− Ok(RevCursor {
− cursor,
− txn: self,
− k: std::marker::PhantomData,
− v: std::marker::PhantomData,
− t: std::marker::PhantomData,
− })
+ unsafe {
+ use crate::pristine::sanakirja::Db;
+ let db: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> = Db::from_page(*channel);
+ let mut cursor = ::sanakirja::btree::cursor::Cursor::new(self, &db)?;
+ if let Some(from) = from {
+ cursor.set(self, &from.into(), None)?;
+ } else {
+ cursor.set_last(self)?;
+ };
+ Ok(RevCursor {
+ cursor,
+ txn: self,
+ k: std::marker::PhantomData,
+ v: std::marker::PhantomData,
+ t: std::marker::PhantomData,
+ })
+ }
replacement in libpijul/src/small_string.rs at line 314
[27.487787]→[27.47547:47596](∅→∅) − unsafe fn write_to_page(&self, p: *mut u8) {
+ unsafe fn write_to_page<T: sanakirja::AllocPage>(&self, _: &mut T, p: *mut u8) {
edit in libpijul/src/record.rs at line 942
+ debug!(
+ "add root if needed {:?} {:?}",
+ pos.0.as_u64(),
+ pos2.0.as_u64()
+ );
edit in libpijul/src/record.rs at line 1047
+ debug!("name start {:?} end {:?}", name_start, name_end);
replacement in libpijul/src/record.rs at line 1747
[11.891]→[11.891:912](∅→∅) replacement in libpijul/src/pristine/sanakirja.rs at line 135
[27.22192]→[27.22192:22232](∅→∅) − const VERSION: L64 = L64(1u64.to_le());
+ const VERSION: u64 = 1u64;
replacement in libpijul/src/pristine/sanakirja.rs at line 140
[27.532869]→[27.22233:22295](∅→∅) − if L64(txn.root(Root::Version as usize)) != VERSION {
+ if txn.root(Root::Version as usize) != VERSION {
edit in libpijul/src/pristine/sanakirja.rs at line 143
edit in libpijul/src/pristine/sanakirja.rs at line 166
+ debug!("txn begin done");
replacement in libpijul/src/pristine/sanakirja.rs at line 179
[27.1263]→[27.534173:534255](∅→∅),
[27.22427]→[27.534173:534255](∅→∅),
[27.534173]→[27.534173:534255](∅→∅),
[27.534255]→[27.22428:22595](∅→∅) − let mut txn = ::sanakirja::Env::mut_txn_begin(self.env.clone()).unwrap();
− if let Some(version) = txn.root(Root::Version as usize) {
− if L64(version) != VERSION {
− return Err(SanakirjaError::Version.into());
+ unsafe {
+ let mut txn = ::sanakirja::Env::mut_txn_begin(self.env.clone()).unwrap();
+ if let Some(version) = txn.root(Root::Version as usize) {
+ if version != VERSION {
+ return Err(SanakirjaError::Version.into());
+ }
+ } else {
+ txn.set_root(Root::Version as usize, VERSION);
replacement in libpijul/src/pristine/sanakirja.rs at line 188
[27.22609]→[27.22609:22687](∅→∅) − } else {
− txn.set_root(Root::Version as usize, VERSION.0);
+ Ok(MutTxn {
+ channels: if let Some(db) = txn.root_db(Root::Channels as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ external: if let Some(db) = txn.root_db(Root::External as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ internal: if let Some(db) = txn.root_db(Root::Internal as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ inodes: if let Some(db) = txn.root_db(Root::Inodes as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ revinodes: if let Some(db) = txn.root_db(Root::RevInodes as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ tree: if let Some(db) = txn.root_db(Root::Tree as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ revtree: if let Some(db) = txn.root_db(Root::RevTree as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ revdep: if let Some(db) = txn.root_db(Root::RevDep as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ dep: if let Some(db) = txn.root_db(Root::Dep as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ touched_files: if let Some(db) = txn.root_db(Root::TouchedFiles as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ rev_touched_files: if let Some(db) = txn.root_db(Root::RevTouchedFiles as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ partials: if let Some(db) = txn.root_db(Root::Partials as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ remotes: if let Some(db) = txn.root_db(Root::Remotes as usize) {
+ db
+ } else {
+ btree::create_db_(&mut txn)?
+ },
+ open_channels: Mutex::new(HashMap::default()),
+ open_remotes: Mutex::new(HashMap::default()),
+ txn,
+ counter: 0,
+ cur_channel: None,
+ })
edit in libpijul/src/pristine/sanakirja.rs at line 261
[27.22697]→[27.1264:3608](∅→∅),
[27.534255]→[27.1264:3608](∅→∅),
[27.3608]→[27.61706:61823](∅→∅),
[27.61823]→[27.536168:536185](∅→∅),
[27.536168]→[27.536168:536185](∅→∅),
[27.536185]→[27.61824:61848](∅→∅),
[27.61848]→[27.5403:5434](∅→∅),
[27.5434]→[27.3609:3620](∅→∅),
[27.61848]→[27.3609:3620](∅→∅),
[27.536185]→[27.3609:3620](∅→∅) − Ok(MutTxn {
− channels: if let Some(db) = txn.root_db(Root::Channels as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− external: if let Some(db) = txn.root_db(Root::External as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− internal: if let Some(db) = txn.root_db(Root::Internal as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− inodes: if let Some(db) = txn.root_db(Root::Inodes as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− revinodes: if let Some(db) = txn.root_db(Root::RevInodes as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− tree: if let Some(db) = txn.root_db(Root::Tree as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− revtree: if let Some(db) = txn.root_db(Root::RevTree as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− revdep: if let Some(db) = txn.root_db(Root::RevDep as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− dep: if let Some(db) = txn.root_db(Root::Dep as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− touched_files: if let Some(db) = txn.root_db(Root::TouchedFiles as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− rev_touched_files: if let Some(db) = txn.root_db(Root::RevTouchedFiles as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− partials: if let Some(db) = txn.root_db(Root::Partials as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− remotes: if let Some(db) = txn.root_db(Root::Remotes as usize) {
− db
− } else {
− btree::create_db_(&mut txn)?
− },
− open_channels: Mutex::new(HashMap::default()),
− open_remotes: Mutex::new(HashMap::default()),
− txn,
− counter: 0,
− cur_channel: None,
− })
replacement in libpijul/src/pristine/sanakirja.rs at line 317
[27.330]→[27.330:369](∅→∅),
[27.369]→[27.60694:60754](∅→∅),
[27.60694]→[27.60694:60754](∅→∅),
[27.60754]→[27.370:428](∅→∅),
[27.428]→[27.60839:60899](∅→∅),
[27.60839]→[27.60839:60899](∅→∅),
[27.60899]→[27.429:487](∅→∅),
[27.487]→[27.60984:61040](∅→∅),
[27.60984]→[27.60984:61040](∅→∅),
[27.61040]→[27.488:544](∅→∅),
[27.544]→[27.61123:61185](∅→∅),
[27.61123]→[27.61123:61185](∅→∅),
[27.61185]→[27.545:604](∅→∅),
[27.604]→[27.61271:61323](∅→∅),
[27.61271]→[27.61271:61323](∅→∅),
[27.61323]→[27.605:659](∅→∅),
[27.659]→[27.61404:61462](∅→∅),
[27.61404]→[27.61404:61462](∅→∅),
[27.61462]→[27.660:717](∅→∅),
[27.717]→[27.61546:61602](∅→∅),
[27.61546]→[27.61546:61602](∅→∅),
[27.61602]→[27.718:774](∅→∅),
[27.774]→[27.61685:61735](∅→∅),
[27.61685]→[27.61685:61735](∅→∅),
[27.61735]→[27.775:828](∅→∅),
[27.828]→[27.61815:61885](∅→∅),
[27.61815]→[27.61815:61885](∅→∅),
[27.61885]→[27.829:892](∅→∅),
[27.892]→[27.61975:62053](∅→∅),
[27.61975]→[27.61975:62053](∅→∅),
[27.62053]→[27.893:960](∅→∅),
[27.960]→[27.62147:62207](∅→∅),
[27.62147]→[27.62147:62207](∅→∅),
[27.62207]→[27.961:1019](∅→∅),
[27.1019]→[27.62292:62352](∅→∅),
[27.62292]→[27.62292:62352](∅→∅),
[27.62352]→[27.1020:1078](∅→∅),
[27.1078]→[27.62437:62616](∅→∅),
[27.62437]→[27.62437:62616](∅→∅),
[27.62616]→[27.25562:25737](∅→∅),
[27.25737]→[27.7637:7710](∅→∅),
[27.62787]→[27.7637:7710](∅→∅),
[27.7710]→[27.25738:25881](∅→∅),
[27.25881]→[17.0:122](∅→∅),
[17.122]→[27.62979:63032](∅→∅),
[27.458]→[27.62979:63032](∅→∅),
[27.22914]→[27.62979:63032](∅→∅),
[27.25963]→[27.62979:63032](∅→∅),
[27.62979]→[27.62979:63032](∅→∅),
[27.63032]→[27.1079:1133](∅→∅),
[27.1133]→[27.63113:63170](∅→∅),
[27.63113]→[27.63113:63170](∅→∅),
[27.63170]→[27.1134:1190](∅→∅),
[27.1190]→[27.63253:63316](∅→∅),
[27.63253]→[27.63253:63316](∅→∅),
[27.63316]→[27.1191:1250](∅→∅),
[27.1250]→[27.63402:63457](∅→∅),
[27.63402]→[27.63402:63457](∅→∅),
[27.63457]→[27.1251:1306](∅→∅),
[27.1306]→[27.22915:22966](∅→∅),
[27.63539]→[27.22915:22966](∅→∅),
[27.22966]→[27.1307:1360](∅→∅),
[27.1360]→[27.539904:539914](∅→∅),
[27.23046]→[27.539904:539914](∅→∅),
[27.63539]→[27.539904:539914](∅→∅),
[27.539904]→[27.539904:539914](∅→∅),
[27.539914]→[27.63540:63598](∅→∅),
[27.63598]→[27.1361:1418](∅→∅),
[27.1418]→[27.63682:63796](∅→∅),
[27.63682]→[27.63682:63796](∅→∅),
[27.63796]→[27.25964:26018](∅→∅),
[27.26018]→[2.0:126](∅→∅) − use ::sanakirja::debug::Check;
− debug!("check: internal 0x{:x}", self.internal.db);
− self.internal.add_refs(&self.txn, refs).unwrap();
− debug!("check: external 0x{:x}", self.external.db);
− self.external.add_refs(&self.txn, refs).unwrap();
− debug!("check: inodes 0x{:x}", self.inodes.db);
− self.inodes.add_refs(&self.txn, refs).unwrap();
− debug!("check: revinodes 0x{:x}", self.revinodes.db);
− self.revinodes.add_refs(&self.txn, refs).unwrap();
− debug!("check: tree 0x{:x}", self.tree.db);
− self.tree.add_refs(&self.txn, refs).unwrap();
− debug!("check: revtree 0x{:x}", self.revtree.db);
− self.revtree.add_refs(&self.txn, refs).unwrap();
− debug!("check: revdep 0x{:x}", self.revdep.db);
− self.revdep.add_refs(&self.txn, refs).unwrap();
− debug!("check: dep 0x{:x}", self.dep.db);
− self.dep.add_refs(&self.txn, refs).unwrap();
− debug!("check: touched_files 0x{:x}", self.touched_files.db);
− self.touched_files.add_refs(&self.txn, refs).unwrap();
− debug!("check: rev_touched_files 0x{:x}", self.rev_touched_files.db);
− self.rev_touched_files.add_refs(&self.txn, refs).unwrap();
− debug!("check: partials 0x{:x}", self.partials.db);
− self.partials.add_refs(&self.txn, refs).unwrap();
− debug!("check: channels 0x{:x}", self.channels.db);
− self.channels.add_refs(&self.txn, refs).unwrap();
− for x in btree::iter(&self.txn, &self.channels, None).unwrap() {
− let (name, tup) = x.unwrap();
− debug!("check: channel name: {:?}", name.as_str());
− let graph: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(tup.graph.into());
− let changes: Db<ChangeId, L64> = Db::from_page(tup.changes.into());
− let revchanges: UDb<L64, Pair<ChangeId, SerializedMerkle>> =
− UDb::from_page(tup.revchanges.into());
− let states: UDb<SerializedMerkle, L64> = UDb::from_page(tup.states.into());
− let tags: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> =
− Db::from_page(tup.tags.into());
− debug!("check: graph 0x{:x}", graph.db);
− graph.add_refs(&self.txn, refs).unwrap();
− debug!("check: changes 0x{:x}", changes.db);
− changes.add_refs(&self.txn, refs).unwrap();
− debug!("check: revchanges 0x{:x}", revchanges.db);
− revchanges.add_refs(&self.txn, refs).unwrap();
− debug!("check: states 0x{:x}", states.db);
− states.add_refs(&self.txn, refs).unwrap();
− debug!("check: tags 0x{:x}", tags.db);
− tags.add_refs(&self.txn, refs).unwrap();
− }
− debug!("check: remotes 0x{:x}", self.remotes.db);
− self.remotes.add_refs(&self.txn, refs).unwrap();
− for x in btree::iter(&self.txn, &self.remotes, None).unwrap() {
− let (name, tup) = x.unwrap();
− debug!("check: remote name: {:?}", name);
− let remote: UDb<L64, Pair<SerializedHash, SerializedMerkle>> =
− UDb::from_page(tup.remote.into());
+ unsafe {
+ use ::sanakirja::debug::Check;
+ debug!("check: internal 0x{:x}", self.internal.db);
+ self.internal.add_refs(&self.txn, refs).unwrap();
+ debug!("check: external 0x{:x}", self.external.db);
+ self.external.add_refs(&self.txn, refs).unwrap();
+ debug!("check: inodes 0x{:x}", self.inodes.db);
+ self.inodes.add_refs(&self.txn, refs).unwrap();
+ debug!("check: revinodes 0x{:x}", self.revinodes.db);
+ self.revinodes.add_refs(&self.txn, refs).unwrap();
+ debug!("check: tree 0x{:x}", self.tree.db);
+ self.tree.add_refs(&self.txn, refs).unwrap();
+ debug!("check: revtree 0x{:x}", self.revtree.db);
+ self.revtree.add_refs(&self.txn, refs).unwrap();
+ debug!("check: revdep 0x{:x}", self.revdep.db);
+ self.revdep.add_refs(&self.txn, refs).unwrap();
+ debug!("check: dep 0x{:x}", self.dep.db);
+ self.dep.add_refs(&self.txn, refs).unwrap();
+ debug!("check: touched_files 0x{:x}", self.touched_files.db);
+ self.touched_files.add_refs(&self.txn, refs).unwrap();
+ debug!("check: rev_touched_files 0x{:x}", self.rev_touched_files.db);
+ self.rev_touched_files.add_refs(&self.txn, refs).unwrap();
+ debug!("check: partials 0x{:x}", self.partials.db);
+ self.partials.add_refs(&self.txn, refs).unwrap();
+ debug!("check: channels 0x{:x}", self.channels.db);
+ self.channels.add_refs(&self.txn, refs).unwrap();
+ for x in btree::iter(&self.txn, &self.channels, None).unwrap() {
+ let (name, tup) = x.unwrap();
+ debug!("check: channel name: {:?}", name.as_str());
+ let graph: Db<Vertex<ChangeId>, SerializedEdge> = Db::from_page(tup.graph.into());
+ let changes: Db<ChangeId, L64> = Db::from_page(tup.changes.into());
+ let revchanges: UDb<L64, Pair<ChangeId, SerializedMerkle>> =
+ UDb::from_page(tup.revchanges.into());
+ let states: UDb<SerializedMerkle, L64> = UDb::from_page(tup.states.into());
+ let tags: Db<L64, Pair<SerializedMerkle, SerializedMerkle>> =
+ Db::from_page(tup.tags.into());
+ debug!("check: graph 0x{:x}", graph.db);
+ graph.add_refs(&self.txn, refs).unwrap();
+ debug!("check: changes 0x{:x}", changes.db);
+ changes.add_refs(&self.txn, refs).unwrap();
+ debug!("check: revchanges 0x{:x}", revchanges.db);
+ revchanges.add_refs(&self.txn, refs).unwrap();
+ debug!("check: states 0x{:x}", states.db);
+ states.add_refs(&self.txn, refs).unwrap();
+ debug!("check: tags 0x{:x}", tags.db);
+ tags.add_refs(&self.txn, refs).unwrap();
+ }
+ debug!("check: remotes 0x{:x}", self.remotes.db);
+ self.remotes.add_refs(&self.txn, refs).unwrap();
+ for x in btree::iter(&self.txn, &self.remotes, None).unwrap() {
+ let (name, tup) = x.unwrap();
+ debug!("check: remote name: {:?}", name);
+ let remote: UDb<L64, Pair<SerializedHash, SerializedMerkle>> =
+ UDb::from_page(tup.remote.into());
replacement in libpijul/src/pristine/sanakirja.rs at line 372
[27.111]→[27.26111:26279](∅→∅),
[2.127]→[27.26111:26279](∅→∅),
[27.26111]→[27.26111:26279](∅→∅),
[27.26279]→[7.0:124](∅→∅),
[27.108]→[27.64103:64158](∅→∅),
[7.124]→[27.64103:64158](∅→∅),
[27.26279]→[27.64103:64158](∅→∅),
[27.64103]→[27.64103:64158](∅→∅),
[27.64158]→[27.1419:1474](∅→∅),
[27.1474]→[27.64240:64289](∅→∅),
[27.64240]→[27.64240:64289](∅→∅),
[27.64289]→[27.1475:1527](∅→∅),
[27.1527]→[27.64368:64423](∅→∅),
[27.64368]→[27.64368:64423](∅→∅),
[27.64423]→[27.1528:1583](∅→∅),
[27.1583]→[27.109:213](∅→∅) − let rev: UDb<SerializedHash, L64> = UDb::from_page(tup.rev.into());
− let states: UDb<SerializedMerkle, L64> = UDb::from_page(tup.states.into());
− let tags: UDb<L64, Pair<SerializedMerkle, SerializedMerkle>> =
− UDb::from_page(tup.tags.into());
− debug!("check: remote 0x{:x}", remote.db);
− remote.add_refs(&self.txn, refs).unwrap();
− debug!("check: rev 0x{:x}", rev.db);
− rev.add_refs(&self.txn, refs).unwrap();
− debug!("check: states 0x{:x}", states.db);
− states.add_refs(&self.txn, refs).unwrap();
− debug!("check: tags 0x{:x}", tags.db);
− tags.add_refs(&self.txn, refs).unwrap();
+ let rev: UDb<SerializedHash, L64> = UDb::from_page(tup.rev.into());
+ let states: UDb<SerializedMerkle, L64> = UDb::from_page(tup.states.into());
+ let tags: UDb<L64, Pair<SerializedMerkle, SerializedMerkle>> =
+ UDb::from_page(tup.tags.into());
+ debug!("check: remote 0x{:x}", remote.db);
+ remote.add_refs(&self.txn, refs).unwrap();
+ debug!("check: rev 0x{:x}", rev.db);
+ rev.add_refs(&self.txn, refs).unwrap();
+ debug!("check: states 0x{:x}", states.db);
+ states.add_refs(&self.txn, refs).unwrap();
+ debug!("check: tags 0x{:x}", tags.db);
+ tags.add_refs(&self.txn, refs).unwrap();
+ }
+ ::sanakirja::debug::add_free_refs(&self.txn, refs).unwrap();
+ ::sanakirja::debug::check_free(&self.txn, &refs);
edit in libpijul/src/pristine/sanakirja.rs at line 388
[27.541965]→[27.1584:1653](∅→∅),
[27.1653]→[27.64580:64638](∅→∅),
[27.64580]→[27.64580:64638](∅→∅) − ::sanakirja::debug::add_free_refs(&self.txn, refs).unwrap();
− ::sanakirja::debug::check_free(&self.txn, &refs);
replacement in libpijul/src/pristine/sanakirja.rs at line 616
[27.1967]→[27.62143:62226](∅→∅),
[27.68287]→[27.62143:62226](∅→∅) − let mut k = match cursor.set(txn, &key, None) {
− Ok(Some((k, _))) => k,
+ debug!("key {:?}", key);
+ let (mut k, v) = match cursor.set(txn, &key, None) {
+ Ok(Some((k, v))) => (k, v),
replacement in libpijul/src/pristine/sanakirja.rs at line 620
[27.62248]→[27.62248:62359](∅→∅) − if let Some((k, _)) = cursor.prev(txn).map_err(|x| BlockError::Txn(x.into()))? {
− k
+ if let Some((k, v)) = cursor.prev(txn).map_err(|x| BlockError::Txn(x.into()))? {
+ (k, v)
replacement in libpijul/src/pristine/sanakirja.rs at line 628
[27.62535]→[27.62535:62586](∅→∅) − debug!("find_block_end: BLOCK ERROR");
+ debug!("find_block_end: BLOCK ERROR 0");
edit in libpijul/src/pristine/sanakirja.rs at line 632
+ debug!("cursor {:?} {:?}", k, v);
edit in libpijul/src/pristine/sanakirja.rs at line 1202
+ debug!("unsafe load channel");
replacement in libpijul/src/pristine/sanakirja.rs at line 1375
[27.26986]→[27.26986:27022](∅→∅),
[27.27022]→[27.98701:98762](∅→∅),
[27.63207]→[27.8251:8342](∅→∅),
[27.98762]→[27.8251:8342](∅→∅),
[27.550501]→[27.8251:8342](∅→∅),
[27.8342]→[27.27023:27084](∅→∅),
[27.27084]→[27.8411:8517](∅→∅),
[27.8411]→[27.8411:8517](∅→∅),
[27.8517]→[27.27085:27343](∅→∅),
[27.27343]→[27.3474:3539](∅→∅),
[27.3539]→[27.27343:27397](∅→∅),
[27.27343]→[27.27343:27397](∅→∅),
[27.27397]→[27.8718:9200](∅→∅),
[27.8718]→[27.8718:9200](∅→∅) − let name = name.to_owned();
− match self.open_remotes.lock().entry(name.clone()) {
− Entry::Vacant(v) => match btree::get(&self.txn, &self.remotes, &name, None)? {
− Some((name_, remote)) if name == *name_ => {
− debug!("load_remote: {:?} {:?}", name_, remote);
− let r = Remote {
− remote: UDb::from_page(remote.remote.into()),
− rev: UDb::from_page(remote.rev.into()),
− states: UDb::from_page(remote.states.into()),
− id_rev: remote.id_rev.into(),
− tags: Db::from_page(remote.tags.into()),
− path: remote.path.to_owned(),
− };
− for x in btree::iter(&self.txn, &r.remote, None).unwrap() {
− debug!("remote -> {:?}", x);
− }
− for x in btree::iter(&self.txn, &r.rev, None).unwrap() {
− debug!("rev -> {:?}", x);
− }
− for x in btree::iter(&self.txn, &r.states, None).unwrap() {
− debug!("states -> {:?}", x);
− }
+ unsafe {
+ let name = name.to_owned();
+ match self.open_remotes.lock().entry(name.clone()) {
+ Entry::Vacant(v) => match btree::get(&self.txn, &self.remotes, &name, None)? {
+ Some((name_, remote)) if name == *name_ => {
+ debug!("load_remote: {:?} {:?}", name_, remote);
+ let r = Remote {
+ remote: UDb::from_page(remote.remote.into()),
+ rev: UDb::from_page(remote.rev.into()),
+ states: UDb::from_page(remote.states.into()),
+ id_rev: remote.id_rev.into(),
+ tags: Db::from_page(remote.tags.into()),
+ path: remote.path.to_owned(),
+ };
+ for x in btree::iter(&self.txn, &r.remote, None).unwrap() {
+ debug!("remote -> {:?}", x);
+ }
+ for x in btree::iter(&self.txn, &r.rev, None).unwrap() {
+ debug!("rev -> {:?}", x);
+ }
+ for x in btree::iter(&self.txn, &r.states, None).unwrap() {
+ debug!("states -> {:?}", x);
+ }
replacement in libpijul/src/pristine/sanakirja.rs at line 1399
[27.78509]→[27.9201:9320](∅→∅) − for x in self.iter_remote(&r.remote, 0).unwrap() {
− debug!("ITER {:?}", x);
+ for x in self.iter_remote(&r.remote, 0).unwrap() {
+ debug!("ITER {:?}", x);
+ }
+
+ let r = RemoteRef {
+ db: Arc::new(Mutex::new(r)),
+ id: name,
+ };
+ Ok(Some(v.insert(r).clone()))
replacement in libpijul/src/pristine/sanakirja.rs at line 1409
[27.78916]→[27.9321:9362](∅→∅),
[27.9362]→[27.63208:63261](∅→∅),
[27.63261]→[27.27398:27432](∅→∅),
[27.27432]→[27.9460:9533](∅→∅),
[27.9460]→[27.9460:9533](∅→∅),
[27.9533]→[27.551161:551179](∅→∅),
[27.47633]→[27.551161:551179](∅→∅),
[27.78957]→[27.551161:551179](∅→∅),
[27.551161]→[27.551161:551179](∅→∅),
[27.551179]→[27.9534:9587](∅→∅),
[27.9587]→[27.45322:45387](∅→∅),
[27.551193]→[27.45322:45387](∅→∅) −
− let r = RemoteRef {
− db: Arc::new(Mutex::new(r)),
− id: name,
− };
− Ok(Some(v.insert(r).clone()))
− }
− _ => return Ok(None),
− },
− Entry::Occupied(occ) => Ok(Some(occ.get().clone())),
+ _ => return Ok(None),
+ },
+ Entry::Occupied(occ) => Ok(Some(occ.get().clone())),
+ }
replacement in libpijul/src/pristine/sanakirja.rs at line 1508
[27.48638]→[27.28068:28104](∅→∅),
[27.28104]→[27.98763:98824](∅→∅),
[27.63332]→[27.9588:9679](∅→∅),
[27.98824]→[27.9588:9679](∅→∅),
[27.555427]→[27.9588:9679](∅→∅),
[27.9679]→[27.28105:28166](∅→∅),
[27.28166]→[27.9748:9788](∅→∅),
[27.9748]→[27.9748:9788](∅→∅),
[27.9788]→[27.63333:63390](∅→∅),
[27.63390]→[27.28167:28441](∅→∅),
[27.28441]→[27.3540:3609](∅→∅),
[27.3609]→[27.28441:28499](∅→∅),
[27.28441]→[27.28441:28499](∅→∅),
[27.28499]→[27.10059:10088](∅→∅),
[27.10059]→[27.10059:10088](∅→∅),
[27.10088]→[27.28500:28534](∅→∅),
[27.28534]→[27.10132:10188](∅→∅),
[27.10132]→[27.10132:10188](∅→∅),
[27.10188]→[27.556087:556105](∅→∅),
[27.48698]→[27.556087:556105](∅→∅),
[27.81384]→[27.556087:556105](∅→∅),
[27.556087]→[27.556087:556105](∅→∅),
[27.556105]→[27.10189:10242](∅→∅),
[27.10242]→[27.556119:556156](∅→∅),
[27.556119]→[27.556119:556156](∅→∅) − let name = name.to_owned();
− match self.open_remotes.lock().entry(name.clone()) {
− Entry::Vacant(v) => match btree::get(&self.txn, &self.remotes, &name, None)? {
− Some((name_, remote)) if *name_ == name => {
− let r = RemoteRef {
− db: Arc::new(Mutex::new(Remote {
− remote: UDb::from_page(remote.remote.into()),
− rev: UDb::from_page(remote.rev.into()),
− states: UDb::from_page(remote.states.into()),
− id_rev: remote.id_rev.into(),
− tags: Db::from_page(remote.tags.into()),
− path: remote.path.to_owned(),
− })),
− id: name,
− };
− v.insert(r);
− }
− _ => return Ok(None),
− },
− Entry::Occupied(_) => {}
+ unsafe {
+ let name = name.to_owned();
+ match self.open_remotes.lock().entry(name.clone()) {
+ Entry::Vacant(v) => match btree::get(&self.txn, &self.remotes, &name, None)? {
+ Some((name_, remote)) if *name_ == name => {
+ let r = RemoteRef {
+ db: Arc::new(Mutex::new(Remote {
+ remote: UDb::from_page(remote.remote.into()),
+ rev: UDb::from_page(remote.rev.into()),
+ states: UDb::from_page(remote.states.into()),
+ id_rev: remote.id_rev.into(),
+ tags: Db::from_page(remote.tags.into()),
+ path: remote.path.to_owned(),
+ })),
+ id: name,
+ };
+ v.insert(r);
+ }
+ _ => return Ok(None),
+ },
+ Entry::Occupied(_) => {}
+ }
+ Ok(self.open_remotes.lock().get(&name).cloned())
edit in libpijul/src/pristine/sanakirja.rs at line 1532
[27.556166]→[27.98825:98882](∅→∅) − Ok(self.open_remotes.lock().get(&name).cloned())
replacement in libpijul/src/pristine/sanakirja.rs at line 1992
[27.52835]→[27.86749:86818](∅→∅),
[27.86818]→[27.563252:563283](∅→∅),
[27.563252]→[27.563252:563283](∅→∅),
[27.563283]→[27.99121:99196](∅→∅),
[27.48487]→[27.563351:563385](∅→∅),
[27.66689]→[27.563351:563385](∅→∅),
[27.99196]→[27.563351:563385](∅→∅),
[27.563351]→[27.563351:563385](∅→∅),
[27.563385]→[27.10301:10385](∅→∅),
[27.10385]→[27.0:79](∅→∅),
[27.79]→[27.66690:66748](∅→∅),
[27.66748]→[27.28535:28817](∅→∅),
[27.28817]→[27.4762:4826](∅→∅),
[27.4826]→[27.28882:29054](∅→∅),
[27.28882]→[27.28882:29054](∅→∅),
[27.25888]→[27.465:513](∅→∅),
[27.29054]→[27.465:513](∅→∅),
[27.465]→[27.465:513](∅→∅),
[27.571]→[27.571:623](∅→∅),
[27.623]→[27.11102:11175](∅→∅),
[27.11102]→[27.11102:11175](∅→∅) − let name = crate::small_string::SmallString::from_str(name);
− let mut commit = None;
− let result = match self.open_channels.lock().entry(name.clone()) {
− Entry::Vacant(v) => {
− let r = match btree::get(&self.txn, &self.channels, &name, None)? {
− Some((name_, b)) if name_ == name.as_ref() => ChannelRef {
− r: Arc::new(RwLock::new(Channel {
− graph: Db::from_page(b.graph.into()),
− changes: Db::from_page(b.changes.into()),
− revchanges: UDb::from_page(b.revchanges.into()),
− states: UDb::from_page(b.states.into()),
− tags: Db::from_page(b.tags.into()),
− apply_counter: b.apply_counter.into(),
− last_modified: b.last_modified.into(),
− id: b.id,
− name: name.clone(),
− })),
− },
− _ => {
− let br = ChannelRef {
+ unsafe {
+ let name = crate::small_string::SmallString::from_str(name);
+ let mut commit = None;
+ let result = match self.open_channels.lock().entry(name.clone()) {
+ Entry::Vacant(v) => {
+ let r = match btree::get(&self.txn, &self.channels, &name, None)? {
+ Some((name_, b)) if name_ == name.as_ref() => ChannelRef {
replacement in libpijul/src/pristine/sanakirja.rs at line 2000
[27.66811]→[27.11237:11541](∅→∅),
[27.11237]→[27.11237:11541](∅→∅),
[27.11541]→[27.25889:25962](∅→∅),
[27.25962]→[27.29055:29509](∅→∅),
[27.25962]→[27.11541:11591](∅→∅),
[27.29509]→[27.11541:11591](∅→∅),
[27.11541]→[27.11541:11591](∅→∅),
[27.11591]→[27.25963:26013](∅→∅) − graph: btree::create_db_(&mut self.txn)?,
− changes: btree::create_db_(&mut self.txn)?,
− revchanges: btree::create_db_(&mut self.txn)?,
− states: btree::create_db_(&mut self.txn)?,
− tags: btree::create_db_(&mut self.txn)?,
− id: {
− let mut rng = rand::thread_rng();
− use rand::Rng;
− let mut x = RemoteId([0; 16]);
− for x in x.0.iter_mut() {
− *x = rng.gen()
− }
− x
− },
− apply_counter: 0,
− last_modified: 0,
+ graph: Db::from_page(b.graph.into()),
+ changes: Db::from_page(b.changes.into()),
+ revchanges: UDb::from_page(b.revchanges.into()),
+ states: UDb::from_page(b.states.into()),
+ tags: Db::from_page(b.tags.into()),
+ apply_counter: b.apply_counter.into(),
+ last_modified: b.last_modified.into(),
+ id: b.id,
replacement in libpijul/src/pristine/sanakirja.rs at line 2010
[27.11726]→[27.11726:11872](∅→∅),
[27.11872]→[27.48488:48524](∅→∅),
[27.564869]→[27.48488:48524](∅→∅) − };
− commit = Some(br.clone());
− br
− }
− };
− v.insert(r).clone()
+ },
+ _ => {
+ let br = ChannelRef {
+ r: Arc::new(RwLock::new(Channel {
+ graph: btree::create_db_(&mut self.txn)?,
+ changes: btree::create_db_(&mut self.txn)?,
+ revchanges: btree::create_db_(&mut self.txn)?,
+ states: btree::create_db_(&mut self.txn)?,
+ tags: btree::create_db_(&mut self.txn)?,
+ id: {
+ let mut rng = rand::thread_rng();
+ use rand::Rng;
+ let mut x = RemoteId([0; 16]);
+ for x in x.0.iter_mut() {
+ *x = rng.gen()
+ }
+ x
+ },
+ apply_counter: 0,
+ last_modified: 0,
+ name: name.clone(),
+ })),
+ };
+ commit = Some(br.clone());
+ br
+ }
+ };
+ v.insert(r).clone()
+ }
+ Entry::Occupied(occ) => occ.get().clone(),
+ };
+ if let Some(commit) = commit {
+ self.put_channel(commit)?;
replacement in libpijul/src/pristine/sanakirja.rs at line 2044
[27.564912]→[27.48525:48591](∅→∅),
[27.48591]→[27.564959:564998](∅→∅),
[27.564959]→[27.564959:564998](∅→∅),
[27.564998]→[27.317:356](∅→∅) − Entry::Occupied(occ) => occ.get().clone(),
− };
− if let Some(commit) = commit {
− self.put_channel(commit)?;
edit in libpijul/src/pristine/sanakirja.rs at line 2046
[27.565055]→[27.48592:48611](∅→∅) replacement in libpijul/src/pristine/sanakirja.rs at line 2128
[27.169]→[27.0:68](∅→∅),
[27.68]→[27.169:218](∅→∅),
[27.169]→[27.169:218](∅→∅),
[27.218]→[27.99538:99625](∅→∅),
[27.99625]→[27.67401:67454](∅→∅),
[27.67401]→[27.67401:67454](∅→∅),
[27.67454]→[27.3664:3783](∅→∅),
[27.363]→[27.3664:3783](∅→∅),
[27.3783]→[27.99626:99657](∅→∅),
[27.67512]→[27.476:627](∅→∅),
[27.99657]→[27.476:627](∅→∅),
[27.476]→[27.476:627](∅→∅),
[27.627]→[27.0:30](∅→∅),
[27.30]→[27.627:780](∅→∅),
[27.627]→[27.627:780](∅→∅) − debug!(target: "drop_channel", "drop channel {:?}", name0);
− let name = SmallString::from_str(name0);
− let channel = if let Some(channel) = self.open_channels.lock().remove(&name) {
− let channel = Arc::try_unwrap(channel.r)
− .map_err(|_| SanakirjaError::ChannelRc {
− c: name0.to_string(),
− })?
− .into_inner();
− Some((
− channel.graph,
− channel.changes,
− channel.revchanges,
− channel.states,
− channel.tags,
− ))
− } else if let Some((name_, chan)) = btree::get(&self.txn, &self.channels, &name, None)? {
− if name_ == name.as_ref() {
+ unsafe {
+ debug!(target: "drop_channel", "drop channel {:?}", name0);
+ let name = SmallString::from_str(name0);
+ let channel = if let Some(channel) = self.open_channels.lock().remove(&name) {
+ let channel = Arc::try_unwrap(channel.r)
+ .map_err(|_| SanakirjaError::ChannelRc {
+ c: name0.to_string(),
+ })?
+ .into_inner();
replacement in libpijul/src/pristine/sanakirja.rs at line 2138
[27.803]→[27.29893:30119](∅→∅),
[27.30119]→[27.4827:4880](∅→∅) − Db::from_page(chan.graph.into()),
− Db::from_page(chan.changes.into()),
− UDb::from_page(chan.revchanges.into()),
− UDb::from_page(chan.states.into()),
− Db::from_page(chan.tags.into()),
+ channel.graph,
+ channel.changes,
+ channel.revchanges,
+ channel.states,
+ channel.tags,
edit in libpijul/src/pristine/sanakirja.rs at line 2144
+ } else if let Some((name_, chan)) = btree::get(&self.txn, &self.channels, &name, None)?
+ {
+ if name_ == name.as_ref() {
+ Some((
+ Db::from_page(chan.graph.into()),
+ Db::from_page(chan.changes.into()),
+ UDb::from_page(chan.revchanges.into()),
+ UDb::from_page(chan.states.into()),
+ Db::from_page(chan.tags.into()),
+ ))
+ } else {
+ None
+ }
replacement in libpijul/src/pristine/sanakirja.rs at line 2159
[27.1078]→[27.1078:1137](∅→∅),
[27.1137]→[27.0:69](∅→∅),
[27.69]→[27.86:135](∅→∅),
[27.135]→[27.0:151](∅→∅),
[27.1183]→[27.0:151](∅→∅),
[27.190]→[27.99658:99702](∅→∅),
[27.99702]→[5.442:501](∅→∅),
[5.501]→[27.2052:2243](∅→∅),
[27.99702]→[27.2052:2243](∅→∅),
[27.441]→[27.2052:2243](∅→∅),
[27.2243]→[27.740:926](∅→∅),
[27.926]→[27.2243:2281](∅→∅),
[27.2243]→[27.2243:2281](∅→∅) − }
− } else {
− None
− };
− btree::del(&mut self.txn, &mut self.channels, &name, None)?;
− if let Some((a, b, c, d, e)) = channel {
− let mut unused_changes = Vec::new();
− 'outer: for x in btree::rev_iter(&self.txn, &c, None)? {
− let (_, p) = x?;
− let chan = chan.read();
− assert_ne!(chan.name.as_str(), name0);
− if self
− .channel_has_state(&chan.states, &p.b)
− .map_err(|e| e.0)?
− .is_some()
− {
− // This other channel is in the same state as
− // our dropped channel is, so all subsequent
− // patches are in use.
− break 'outer;
+ };
+ btree::del(&mut self.txn, &mut self.channels, &name, None)?;
+ if let Some((a, b, c, d, e)) = channel {
+ let mut unused_changes = Vec::new();
+ 'outer: for x in btree::rev_iter(&self.txn, &c, None)? {
+ let (_, p) = x?;
+ debug!(target: "drop_channel", "testing unused change: {:?}", p);
+ for chan in self.channels("").map_err(|e| e.0)? {
+ debug!(target: "drop_channel", "channel: {:?}", name);
+ let chan = chan.read();
+ assert_ne!(chan.name.as_str(), name0);
+ if self
+ .channel_has_state(&chan.states, &p.b)
+ .map_err(|e| e.0)?
+ .is_some()
+ {
+ // This other channel is in the same state as
+ // our dropped channel is, so all subsequent
+ // patches are in use.
+ break 'outer;
+ }
+ if self
+ .get_changeset(&chan.changes, &p.a)
+ .map_err(|e| e.0)?
+ .is_some()
+ {
+ // This channel has a patch, move on.
+ continue 'outer;
+ }
replacement in libpijul/src/pristine/sanakirja.rs at line 2189
[27.596]→[27.2282:2470](∅→∅),
[27.2470]→[27.927:989](∅→∅),
[27.989]→[27.2470:2511](∅→∅),
[27.2470]→[27.2470:2511](∅→∅) − if self
− .get_changeset(&chan.changes, &p.a)
− .map_err(|e| e.0)?
− .is_some()
− {
− // This channel has a patch, move on.
− continue 'outer;
+
+ debug!(target: "drop_channel", "actually unused: {:?}", p);
+ unused_changes.push(p.a);
+ }
+ let mut deps = Vec::new();
+ for ch in unused_changes.iter() {
+ for x in btree::iter(&self.txn, &self.dep, Some((ch, None)))? {
+ let (k, v) = x?;
+ if k > ch {
+ break;
+ }
+ deps.push((*k, *v));
replacement in libpijul/src/pristine/sanakirja.rs at line 2202
[27.751]→[27.751:769](∅→∅),
[27.769]→[27.990:1067](∅→∅),
[27.1067]→[27.769:825](∅→∅),
[27.769]→[27.769:825](∅→∅),
[27.825]→[27.70:109](∅→∅),
[27.109]→[27.825:871](∅→∅),
[27.825]→[27.825:871](∅→∅),
[27.871]→[27.110:259](∅→∅),
[27.259]→[27.2512:2543](∅→∅) − }
−
− debug!(target: "drop_channel", "actually unused: {:?}", p);
− unused_changes.push(p.a);
− }
− let mut deps = Vec::new();
− for ch in unused_changes.iter() {
− for x in btree::iter(&self.txn, &self.dep, Some((ch, None)))? {
− let (k, v) = x?;
− if k > ch {
− break;
+ for (k, v) in deps.drain(..) {
+ debug!(target: "drop_channel", "deleting from revdep: {:?} {:?}", k, v);
+ btree::del(&mut self.txn, &mut self.dep, &k, Some(&v))?;
+ btree::del(&mut self.txn, &mut self.revdep, &v, Some(&k))?;
edit in libpijul/src/pristine/sanakirja.rs at line 2207
[27.311]→[27.311:352](∅→∅) replacement in libpijul/src/pristine/sanakirja.rs at line 2208
[27.370]→[27.370:417](∅→∅),
[27.417]→[27.1068:1238](∅→∅),
[27.1238]→[27.497:595](∅→∅),
[27.497]→[27.497:595](∅→∅) − for (k, v) in deps.drain(..) {
− debug!(target: "drop_channel", "deleting from revdep: {:?} {:?}", k, v);
− btree::del(&mut self.txn, &mut self.dep, &k, Some(&v))?;
− btree::del(&mut self.txn, &mut self.revdep, &v, Some(&k))?;
− }
+ btree::drop(&mut self.txn, a)?;
+ btree::drop(&mut self.txn, b)?;
+ btree::drop(&mut self.txn, c)?;
+ btree::drop(&mut self.txn, d)?;
+ btree::drop(&mut self.txn, e)?;
+ Ok(true)
+ } else {
+ Ok(false)
edit in libpijul/src/pristine/sanakirja.rs at line 2217
[27.1042]→[27.1183:1359](∅→∅),
[27.1183]→[27.1183:1359](∅→∅),
[27.1359]→[27.191:235](∅→∅),
[27.235]→[27.596:656](∅→∅),
[27.1359]→[27.596:656](∅→∅) − btree::drop(&mut self.txn, a)?;
− btree::drop(&mut self.txn, b)?;
− btree::drop(&mut self.txn, c)?;
− btree::drop(&mut self.txn, d)?;
− btree::drop(&mut self.txn, e)?;
− Ok(true)
− } else {
− Ok(false)
replacement in libpijul/src/pristine/sanakirja.rs at line 2225
[27.30318]→[27.568157:568188](∅→∅),
[27.90802]→[27.568157:568188](∅→∅),
[27.568157]→[27.568157:568188](∅→∅),
[27.568188]→[27.99703:99754](∅→∅),
[27.30379]→[27.568255:568289](∅→∅),
[27.67583]→[27.568255:568289](∅→∅),
[27.99754]→[27.568255:568289](∅→∅),
[27.568255]→[27.568255:568289](∅→∅),
[27.568289]→[27.30380:30534](∅→∅),
[27.30534]→[27.67584:67641](∅→∅),
[27.12543]→[27.67584:67641](∅→∅),
[27.67641]→[27.30535:30809](∅→∅),
[27.30809]→[27.3746:3815](∅→∅),
[27.3815]→[27.30809:30872](∅→∅),
[27.30809]→[27.30809:30872](∅→∅),
[27.30872]→[27.12814:12843](∅→∅),
[27.12814]→[27.12814:12843](∅→∅),
[27.12843]→[27.30873:30901](∅→∅),
[27.30901]→[27.12887:12982](∅→∅),
[27.12887]→[27.12887:12982](∅→∅) − let mut commit = None;
− match self.open_remotes.lock().entry(id) {
− Entry::Vacant(v) => {
− let r = match btree::get(&self.txn, &self.remotes, &id, None)? {
− Some((name_, remote)) if *name_ == id => RemoteRef {
− db: Arc::new(Mutex::new(Remote {
− remote: UDb::from_page(remote.remote.into()),
− rev: UDb::from_page(remote.rev.into()),
− states: UDb::from_page(remote.states.into()),
− id_rev: remote.id_rev.into(),
− tags: Db::from_page(remote.tags.into()),
− path: SmallString::from_str(path),
− })),
− id,
− },
− _ => {
− let br = RemoteRef {
+ unsafe {
+ let mut commit = None;
+ match self.open_remotes.lock().entry(id) {
+ Entry::Vacant(v) => {
+ let r = match btree::get(&self.txn, &self.remotes, &id, None)? {
+ Some((name_, remote)) if *name_ == id => RemoteRef {
replacement in libpijul/src/pristine/sanakirja.rs at line 2232
[27.67703]→[27.13044:13266](∅→∅),
[27.13044]→[27.13044:13266](∅→∅),
[27.13266]→[27.30902:30955](∅→∅),
[27.30955]→[27.3816:3888](∅→∅) − remote: btree::create_db_(&mut self.txn)?,
− rev: btree::create_db_(&mut self.txn)?,
− states: btree::create_db_(&mut self.txn)?,
− id_rev: 0u64.into(),
− tags: btree::create_db(&mut self.txn)?,
+ remote: UDb::from_page(remote.remote.into()),
+ rev: UDb::from_page(remote.rev.into()),
+ states: UDb::from_page(remote.states.into()),
+ id_rev: remote.id_rev.into(),
+ tags: Db::from_page(remote.tags.into()),
replacement in libpijul/src/pristine/sanakirja.rs at line 2240
[27.31055]→[27.13347:13493](∅→∅),
[27.13347]→[27.13347:13493](∅→∅),
[27.13493]→[27.569306:569335](∅→∅),
[27.569306]→[27.569306:569335](∅→∅) − };
− commit = Some(br.clone());
− br
− }
− };
− v.insert(r);
+ },
+ _ => {
+ let br = RemoteRef {
+ db: Arc::new(Mutex::new(Remote {
+ remote: btree::create_db_(&mut self.txn)?,
+ rev: btree::create_db_(&mut self.txn)?,
+ states: btree::create_db_(&mut self.txn)?,
+ id_rev: 0u64.into(),
+ tags: btree::create_db(&mut self.txn)?,
+ path: SmallString::from_str(path),
+ })),
+ id,
+ };
+ commit = Some(br.clone());
+ br
+ }
+ };
+ v.insert(r);
+ }
+ Entry::Occupied(_) => {}
replacement in libpijul/src/pristine/sanakirja.rs at line 2261
[27.569349]→[27.569349:569386](∅→∅) − Entry::Occupied(_) => {}
+ if let Some(commit) = commit {
+ self.put_remotes(commit)?;
+ }
+ Ok(self.open_remotes.lock().get(&id).unwrap().clone())
edit in libpijul/src/pristine/sanakirja.rs at line 2266
[27.569396]→[27.569396:569435](∅→∅),
[27.569435]→[27.2750:2789](∅→∅),
[27.2789]→[27.569482:569492](∅→∅),
[27.569482]→[27.569482:569492](∅→∅),
[27.569492]→[27.99755:99818](∅→∅) − if let Some(commit) = commit {
− self.put_remotes(commit)?;
− }
− Ok(self.open_remotes.lock().get(&id).unwrap().clone())
edit in libpijul/src/pristine/sanakirja.rs at line 2325
[27.2151]→[27.92330:92526](∅→∅),
[27.68505]→[27.92330:92526](∅→∅),
[27.571127]→[27.92330:92526](∅→∅) − self.txn.set_root(Root::Tree as usize, self.tree.db);
− self.txn.set_root(Root::RevTree as usize, self.revtree.db);
− self.txn.set_root(Root::Inodes as usize, self.inodes.db);
replacement in libpijul/src/pristine/sanakirja.rs at line 2326
[27.13511]→[27.13511:13579](∅→∅),
[27.13579]→[27.92598:92942](∅→∅),
[27.92598]→[27.92598:92942](∅→∅) − .set_root(Root::RevInodes as usize, self.revinodes.db);
− self.txn.set_root(Root::Internal as usize, self.internal.db);
− self.txn.set_root(Root::External as usize, self.external.db);
− self.txn.set_root(Root::RevDep as usize, self.revdep.db);
− self.txn.set_root(Root::Channels as usize, self.channels.db);
− self.txn.set_root(Root::Remotes as usize, self.remotes.db);
+ .set_root(Root::Tree as usize, u64::from(self.tree.db).into());
+ self.txn
+ .set_root(Root::RevTree as usize, u64::from(self.revtree.db).into());
+ self.txn
+ .set_root(Root::Inodes as usize, u64::from(self.inodes.db).into());
+ self.txn
+ .set_root(Root::RevInodes as usize, self.revinodes.db.into());
+ self.txn
+ .set_root(Root::Internal as usize, self.internal.db.into());
+ self.txn
+ .set_root(Root::External as usize, self.external.db.into());
+ self.txn
+ .set_root(Root::RevDep as usize, self.revdep.db.into());
+ self.txn
+ .set_root(Root::Channels as usize, self.channels.db.into());
replacement in libpijul/src/pristine/sanakirja.rs at line 2342
[27.571729]→[27.92943:93078](∅→∅) − .set_root(Root::TouchedFiles as usize, self.touched_files.db);
− self.txn.set_root(Root::Dep as usize, self.dep.db);
+ .set_root(Root::Remotes as usize, self.remotes.db.into());
edit in libpijul/src/pristine/sanakirja.rs at line 2344
+ .set_root(Root::TouchedFiles as usize, self.touched_files.db.into());
+ self.txn.set_root(Root::Dep as usize, self.dep.db.into());
+ self.txn.set_root(
+ Root::RevTouchedFiles as usize,
+ self.rev_touched_files.db.into(),
+ );
+ self.txn
+ .set_root(Root::Partials as usize, self.partials.db.into());
replacement in libpijul/src/pristine/sanakirja.rs at line 2364
[27.48706]→[27.572161:572209](∅→∅),
[27.53620]→[27.572161:572209](∅→∅),
[27.572161]→[27.572161:572209](∅→∅),
[27.572209]→[27.93232:93300](∅→∅),
[27.93300]→[27.132:192](∅→∅),
[27.192]→[27.13580:13648](∅→∅),
[27.93384]→[27.13580:13648](∅→∅),
[27.13648]→[27.93452:93486](∅→∅),
[27.93452]→[27.93452:93486](∅→∅),
[27.93486]→[27.31606:31856](∅→∅),
[27.31856]→[27.4881:4937](∅→∅),
[27.4937]→[27.31913:32061](∅→∅),
[27.31913]→[27.31913:32061](∅→∅),
[27.26316]→[27.93824:93870](∅→∅),
[27.32061]→[27.93824:93870](∅→∅),
[27.93824]→[27.93824:93870](∅→∅) − let name = SmallString::from_str(name);
− match btree::get(&self.txn, &self.channels, &name, None)? {
− Some((name_, c)) if name.as_ref() == name_ => {
− debug!("load_const_channel = {:?} {:?}", name_, c);
− Ok(Some(Channel {
− graph: Db::from_page(c.graph.into()),
− changes: Db::from_page(c.changes.into()),
− revchanges: UDb::from_page(c.revchanges.into()),
− states: UDb::from_page(c.states.into()),
− tags: Db::from_page(c.tags.into()),
− apply_counter: c.apply_counter.into(),
− last_modified: c.last_modified.into(),
− id: c.id,
− name,
− }))
+ unsafe {
+ let name = SmallString::from_str(name);
+ match btree::get(&self.txn, &self.channels, &name, None)? {
+ Some((name_, c)) if name.as_ref() == name_ => {
+ debug!("load_const_channel = {:?} {:?}", name_, c);
+ Ok(Some(Channel {
+ graph: Db::from_page(c.graph.into()),
+ changes: Db::from_page(c.changes.into()),
+ revchanges: UDb::from_page(c.revchanges.into()),
+ states: UDb::from_page(c.states.into()),
+ tags: Db::from_page(c.tags.into()),
+ apply_counter: c.apply_counter.into(),
+ last_modified: c.last_modified.into(),
+ id: c.id,
+ name,
+ }))
+ }
+ _ => Ok(None),
edit in libpijul/src/pristine/sanakirja.rs at line 2383
[27.93884]→[27.13649:13676](∅→∅) replacement in libpijul/src/pristine/sanakirja.rs at line 2402
[27.32099]→[27.32099:32333](∅→∅) − graph: channel.graph.db.into(),
− changes: channel.changes.db.into(),
− revchanges: channel.revchanges.db.into(),
− states: channel.states.db.into(),
− tags: channel.tags.db.into(),
+ graph: u64::from(channel.graph.db).into(),
+ changes: u64::from(channel.changes.db).into(),
+ revchanges: u64::from(channel.revchanges.db).into(),
+ states: u64::from(channel.states.db).into(),
+ tags: u64::from(channel.tags.db).into(),
replacement in libpijul/src/pristine/sanakirja.rs at line 2426
[27.32678]→[27.32678:32795](∅→∅) − _remote: r.remote.db.into(),
− _rev: r.rev.db.into(),
− _states: r.states.db.into(),
+ _remote: u64::from(r.remote.db).into(),
+ _rev: u64::from(r.rev.db).into(),
+ _states: u64::from(r.states.db).into(),
replacement in libpijul/src/pristine/sanakirja.rs at line 2430
[27.32833]→[27.43445:43482](∅→∅) − _tags: r.tags.db.into(),
+ _tags: u64::from(r.tags.db).into(),
edit in libpijul/src/pristine/sanakirja.rs at line 2446
[27.576098]→[27.94946:94965](∅→∅),
[27.94965]→[27.706:748](∅→∅),
[27.748]→[27.576850:576851](∅→∅),
[27.2428]→[27.576850:576851](∅→∅),
[27.94965]→[27.576850:576851](∅→∅),
[27.576850]→[27.576850:576851](∅→∅) − direct_repr!(L64);
− impl ::sanakirja::debug::Check for L64 {}
−
replacement in libpijul/src/pristine/sanakirja.rs at line 2480
[27.580114]→[27.95644:95693](∅→∅) − unsafe fn write_to_page(&self, p: *mut u8) {
+ unsafe fn write_to_page<T: AllocPage>(&self, t: &mut T, p: *mut u8) {
replacement in libpijul/src/pristine/sanakirja.rs at line 2482
[27.95745]→[27.95745:95791](∅→∅) − self.basename.write_to_page(p.add(8))
+ self.basename.write_to_page(t, p.add(8))
replacement in libpijul/src/pristine/sanakirja.rs at line 2559
[27.584822]→[27.97617:97699](∅→∅) − unsafe fn write_to_page(&self, p: *mut u8) {
− self.a.write_to_page(p);
+ unsafe fn write_to_page<T: sanakirja::AllocPage>(&self, t: &mut T, p: *mut u8) {
+ self.a.write_to_page(t, p);
replacement in libpijul/src/pristine/sanakirja.rs at line 2562
[27.97769]→[27.97769:97811](∅→∅) − self.b.write_to_page(p.add(off));
+ self.b.write_to_page(t, p.add(off));
replacement in libpijul/src/pristine/sanakirja.rs at line 2594
[27.33816]→[27.33816:33865](∅→∅) − unsafe fn write_to_page(&self, p: *mut u8) {
+ unsafe fn write_to_page<T: sanakirja::AllocPage>(&self, _: &mut T, p: *mut u8) {
edit in libpijul/src/pristine/sanakirja.rs at line 2636
[27.571875]→[27.93079:93231](∅→∅),
[27.151]→[27.69:151](∅→∅),
[27.151]→[5.375:441](∅→∅),
[5.441]→[27.664:739](∅→∅),
[27.664]→[27.664:739](∅→∅) − .set_root(Root::RevTouchedFiles as usize, self.rev_touched_files.db);
− self.txn.set_root(Root::Partials as usize, self.partials.db);
− debug!(target: "drop_channel", "testing unused change: {:?}", p);
− for chan in self.channels("").map_err(|e| e.0)? {
− debug!(target: "drop_channel", "channel: {:?}", name);
resolve order conflict in libpijul/src/pristine/sanakirja.rs at line 2636
edit in libpijul/src/pristine/mod.rs at line 4
+ pub use ::sanakirja::L64;
edit in libpijul/src/pristine/mod.rs at line 25
[27.98674]→[27.98674:99750](∅→∅) −
− #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
− pub struct L64(pub u64);
−
− impl From<usize> for L64 {
− fn from(u: usize) -> Self {
− L64((u as u64).to_le())
− }
− }
−
− impl From<u64> for L64 {
− fn from(u: u64) -> Self {
− L64(u.to_le())
− }
− }
−
− impl From<L64> for u64 {
− fn from(u: L64) -> Self {
− u64::from_le(u.0)
− }
− }
−
− impl From<L64> for usize {
− fn from(u: L64) -> Self {
− u64::from_le(u.0) as usize
− }
− }
−
− impl L64 {
− pub fn as_u64(&self) -> u64 {
− u64::from_le(self.0)
− }
− pub fn as_usize(&self) -> usize {
− u64::from_le(self.0) as usize
− }
− }
−
− impl std::fmt::Display for L64 {
− fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
− self.0.fmt(fmt)
− }
− }
−
− impl Ord for L64 {
− fn cmp(&self, x: &Self) -> std::cmp::Ordering {
− u64::from_le(self.0).cmp(&u64::from_le(x.0))
− }
− }
−
− impl PartialOrd for L64 {
− fn partial_cmp(&self, x: &Self) -> Option<std::cmp::Ordering> {
− Some(u64::from_le(self.0).cmp(&u64::from_le(x.0)))
− }
− }
edit in libpijul/src/pristine/mod.rs at line 26
[27.99751]→[27.99751:100342](∅→∅),
[27.100342]→[27.14267:14362](∅→∅),
[27.14362]→[27.100457:100688](∅→∅),
[27.100457]→[27.100457:100688](∅→∅) − impl std::ops::Add<L64> for L64 {
− type Output = Self;
− fn add(self, x: L64) -> L64 {
− L64((u64::from_le(self.0) + u64::from_le(x.0)).to_le())
− }
− }
−
− impl std::ops::Add<usize> for L64 {
− type Output = Self;
− fn add(self, x: usize) -> L64 {
− L64((u64::from_le(self.0) + x as u64).to_le())
− }
− }
−
− impl std::ops::SubAssign<usize> for L64 {
− fn sub_assign(&mut self, x: usize) {
− self.0 = ((u64::from_le(self.0)) - x as u64).to_le()
− }
− }
−
− impl L64 {
− pub fn from_slice_le(s: &[u8]) -> Self {
− let mut u = 0u64;
− assert!(s.len() >= 8);
− unsafe { std::ptr::copy_nonoverlapping(s.as_ptr(), &mut u as *mut u64 as *mut u8, 8) }
− L64(u)
− }
− pub fn to_slice_le(&self, s: &mut [u8]) {
− assert!(s.len() >= 8);
− unsafe {
− std::ptr::copy_nonoverlapping(&self.0 as *const u64 as *const u8, s.as_mut_ptr(), 8)
− }
− }
− }
−
replacement in libpijul/src/pristine/edge.rs at line 166
[27.119378]→[27.119378:119421](∅→∅) − let pos = u64::from_le((pos.0).0);
+ let pos = pos.0.as_u64();
replacement in libpijul/src/output/archive.rs at line 267
[27.1275]→[27.5649:5681](∅→∅),
[27.5681]→[27.5221:5325](∅→∅) − let mut l =
− crate::alive::retrieve(&*txn_, txn_.graph(&channel_), output_item.pos, false)?;
+ let mut l = crate::alive::retrieve(
+ &*txn_,
+ txn_.graph(&channel_),
+ output_item.pos,
+ false,
+ )?;
replacement in libpijul/src/diff/replace.rs at line 307
replacement in libpijul/src/change.rs at line 304
[20.239]→[20.239:290](∅→∅) − return Err(MakeChangeError::InvalidChange)
+ return Err(MakeChangeError::InvalidChange);
replacement in libpijul/src/change.rs at line 343
[20.428]→[20.428:479](∅→∅) − return Err(MakeChangeError::InvalidChange)
+ return Err(MakeChangeError::InvalidChange);
replacement in libpijul/src/change.rs at line 1449
[27.140483]→[27.0:83](∅→∅) − info!("compressing with ZStd {}", zstd_seekable::version().to_str().unwrap());
+ info!(
+ "compressing with ZStd {}",
+ zstd_seekable::version().to_str().unwrap()
+ );
replacement in libpijul/src/change/text_changes.rs at line 29
[20.1212]→[20.1212:1255](∅→∅) − MakeChange(#[from]MakeChangeError<T>),
+ MakeChange(#[from] MakeChangeError<T>),
replacement in libpijul/src/change/text_changes.rs at line 202
[27.10351]→[27.122912:122944](∅→∅),
[27.59097]→[27.122912:122944](∅→∅),
[27.43188]→[27.122912:122944](∅→∅),
[27.122944]→[20.1301:1380](∅→∅) − let (mut deps, extra) =
− dependencies(txn, &channel.read(), change.hashed.changes.iter())?;
+ let (mut deps, extra) = dependencies(txn, &channel.read(), change.hashed.changes.iter())?;
replacement in libpijul/src/change/text_changes.rs at line 333
[27.13315]→[27.13315:13395](∅→∅) − start: new_vertex.start.0 .0,
− end: new_vertex.end.0 .0,
+ start: new_vertex.start.0.as_u64(),
+ end: new_vertex.end.0.as_u64(),
replacement in libpijul/src/change/text_changes.rs at line 350
[27.14013]→[27.14013:14056](∅→∅) + to_end: c.to.end.0.as_u64(),
replacement in libpijul/src/change/text_changes.rs at line 374
[27.14841]→[27.14841:14896](∅→∅) − end: ChangePosition(L64(edge.to_end)),
+ end: ChangePosition(L64(edge.to_end.to_le())),
replacement in libpijul/src/change/text_changes.rs at line 500
[27.17922]→[27.17922:18008](∅→∅) − start: n.start.0 .0,
− end: n.end.0 .0,
+ start: n.start.0.as_u64(),
+ end: n.end.0.as_u64(),
replacement in libpijul/src/change/text_changes.rs at line 598
[27.1936]→[27.1936:1981](∅→∅) + start: n.start.0.as_u64(),
replacement in libpijul/src/change/text_changes.rs at line 1184
[27.88087]→[27.36064:36103](∅→∅) − PrintablePos(change, pos.pos.0 .0)
+ PrintablePos(change, pos.pos.0.as_u64())
replacement in libpijul/src/change/parse.rs at line 396
[23.11153]→[23.11153:11262](∅→∅) − parse(i)
− .map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify)))
+ parse(i).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify)))
replacement in libpijul/src/change/parse.rs at line 408
[23.11519]→[23.11519:11628](∅→∅) − parse(i)
− .map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify)))
+ parse(i).map_err(|_| nom::Err::Error(nom::error::Error::new(i, nom::error::ErrorKind::Verify)))
replacement in libpijul/src/apply.rs at line 583
[25.319]→[25.319:345](∅→∅) edit in libpijul/src/apply.rs at line 589
[25.394]→[27.2083:2084](∅→∅),
[27.2083]→[27.2083:2084](∅→∅) replacement in libpijul/src/apply.rs at line 591
[25.512]→[25.512:533](∅→∅) replacement in libpijul/src/apply.rs at line 595
[25.581]→[25.581:640](∅→∅) − stack.push(StackElt { is_on_path: true, .. elt });
+ stack.push(StackElt {
+ is_on_path: true,
+ ..elt
+ });
replacement in libpijul/src/apply.rs at line 607
[27.2385]→[25.747:849](∅→∅) − for e in iter_adjacent(txn, channel, elt.vertex, EdgeFlags::empty(), EdgeFlags::all())? {
+ for e in iter_adjacent(
+ txn,
+ channel,
+ elt.vertex,
+ EdgeFlags::empty(),
+ EdgeFlags::all(),
+ )? {
replacement in libpijul/src/apply.rs at line 625
[26.185]→[26.185:219](∅→∅) replacement in libpijul/src/apply.rs at line 633
[25.1049]→[25.1049:1091](∅→∅) edit in libpijul/src/apply.rs at line 640
[25.1167]→[25.1167:1168](∅→∅) replacement in libpijul/src/apply.rs at line 651
[25.1615]→[25.1615:1718](∅→∅) −
− if let Some(last_on_path) = (&stack[..len - 1]).iter().rev().position(|x| x.is_on_path) {
+ if let Some(last_on_path) = (&stack[..len - 1]).iter().rev().position(|x| x.is_on_path)
+ {
replacement in libpijul/src/apply.rs at line 934
[27.8133]→[27.8133:8310](∅→∅),
[27.8310]→[27.1327:1384](∅→∅),
[27.1327]→[27.1327:1384](∅→∅) − if has_missing_context_nondeleted(
− txn,
− channel,
− change_id,
− e,
− )
− .map_err(LocalApplyError::from_missing)?
+ if has_missing_context_nondeleted(txn, channel, change_id, e)
+ .map_err(LocalApplyError::from_missing)?
edit in libpijul/src/apply.rs at line 1163
+ debug!(
+ "change position {:?} {:?}",
+ ChangePosition(1u64.into()),
+ ChangePosition(1u64.into()).0.as_u64()
+ );
replacement in libpijul/src/apply/vertex.rs at line 117
[27.378]→[27.378:434](∅→∅) − return Err(LocalApplyError::Corruption)
+ return Err(LocalApplyError::Corruption);
replacement in libpijul/src/apply/vertex.rs at line 165
[27.685]→[27.685:745](∅→∅) − return Err(LocalApplyError::Corruption)
+ return Err(LocalApplyError::Corruption);
replacement in libpijul/src/alive/retrieve.rs at line 50
[27.7881]→[27.7881:7906](∅→∅) replacement in libpijul/Cargo.toml at line 99
[27.1022980]→[15.0:82](∅→∅) − sanakirja = { version = "1.3", default-features = false, features = [ "crc32" ] }
+ sanakirja = { version = "1.4.0", default-features = false, features = [ "crc32" ] }
edit in Cargo.toml at line 3
[27.280]→[27.315972:315973](∅→∅),
[27.315972]→[27.315972:315973](∅→∅) replacement in Cargo.lock at line 2671
[27.56744]→[15.83:101](∅→∅) replacement in Cargo.lock at line 2673
[27.56828]→[15.102:180](∅→∅) − checksum = "766699f1bb95f2e358c1ec0945da82b40097ec29a3a61636833f5ff27071c392"
+ checksum = "2b783ffdf047e99d9a2fd1d50724d72e9acdd74f157168d74fd70862f8e35236"
edit in Cargo.lock at line 2682
replacement in Cargo.lock at line 2688
[27.57074]→[15.181:199](∅→∅) replacement in Cargo.lock at line 2690
[27.57158]→[15.200:278](∅→∅) − checksum = "4b18ebf28e53f067c2867f2cbae572f5e5320c1074ad2f9e6ed309df22277de6"
+ checksum = "e8278ad92194c3131827375ad63c7b59f167c0bbe83de1e63813929dd531e2c6"