Implement the Sanakirja concurrency model in a cross-process way
[?]
Jan 14, 2021, 2:24 PM
JL4WKA5PBKXRNAMETYO4I52QKASQ3COYHH2JKGA7W5YLIRZZH53ACDependencies
- [2]
WEHUTJUKLockfile update - [3]
GYXIF25TProper parsing of URLs - [4]
SQVWP4LUWhen clone fails, only remove directories we have created (not other directories) - [5]
I2D35LLFMore accurate recording of modification time - [6]
VYHHOEYHVersions and formatting - [7]
HW5Q7GGYVersion bump - [8]
WIORLB47Version bump - [9]
HKEOO4QJVersion bump - [10]
XAY4DYRRVersion bump - [11]
VQPAUKBQchannel switch as an alias to reset - [12]
4H2XTVJ2Fix some mistakes in the docs - [13]
RGJWLQWBWhen cloning, try to init *before* setting up the path Drop (pijul::commands::clone::RepoPath) - [14]
76PCXGMLPushing to, and pulling from the local repository - [15]
HMMMKONLFixing alive vertices - [16]
OUWD436AVersion bump - [17]
B5Z4IMEUGenerating Cargo.nix for pijul 1.0.0-alpha.6 - [18]
JACZWIJ6Version bump - [19]
6DOXSHWGCleanup, and version bump - [20]
AEPEFS7OWrite help for each argument - [21]
JG3MWHENcommands/change: help messages - [22]
SAGSYAPXVarious version bumps - [23]
TZVUNELWDocumentation comments - [24]
B3QWIGDEFixing the Git features with the latest Pijul (+ conflicts in Cargo.toml) - [25]
XL6Y64UPFixing a panic when iterating over the basenames of a file - [26]
BJOZ25EUDeterministic Git import - [27]
PJ7T2VFLDo not hang on locked repositories - [28]
ZTVNGFNTVersion bump - [29]
OCBM7IFENew release: pijul-1.0.0-alpha.8 - [30]
367UBQ6KForwarding SSH stderr, and progress bar for push - [31]
3AMEP2Y5More convenient interface for channels - [32]
R3H7D42UDebugging `pijul git`: proper error reporting - [33]
CCLLB7OIUpgrading to Sanakirja 0.15 + version bump - [34]
CT6FBU57SDPX license + version bump - [35]
BZSC7VMYaddress clippy lints - [36]
KUMJITTFVersion bump in the lockfiles - [37]
SNZ3OAMCuse native external subcommand support instead of hand-rolled one - [38]
SPA2OL5Ikeep-changes feature (default) to avoid deleting problematic changes - [39]
VMPAOJS2Don't output after pushing to a local channel - [40]
3WIQYEISFixing conflicts in Cargo.lock - [41]
I52XSRUHMassive cleanup, and simplification - [42]
KWAMD2KRA few fixes in the documentation comments - [43]
YX3VCEOMVersion bump - [44]
UFCZKKLXUpgrading to the latest Sanakirja/Rand - [45]
23LVKATNUse pager crate for log output - [46]
VO5OQW4WRemoving anyhow in libpijul - [47]
JN34NIMJMore specific error for unrecognized subcommands - [48]
3S4DR77ZVersion updates - [49]
NX5I5H53New published versions - [50]
WI5BS6BSNew published versions - [51]
LYTVEPH3Avoid cloning into an existing path - [52]
JRENVH5DReqwest 0.11 - [53]
XWETQ4DEUpgrading versions - [54]
N35L72XVVersions in Cargo.lock - [55]
ZQXP3HNAVersion bump - [56]
TPEH2XNB1.0.0-alpha.28, with Tokio 1.0 - [57]
5YDI33C4Fixing pager on OSX - [58]
BT2ZHPY4Version bumps - [59]
GHO6DWPIRefactoring iterators - [60]
YDKNUL6BAdd `diff --short` that lists changes without showing them - [61]
5DVRL6MFHard-unrecord - [62]
SXEYMYF7Fixing the bad changes in history (unfortunately, by rebooting). - [63]
5BRU2RRWCleanup (debugging a crash related to trees/inodes) - [64]
G6YZ7U65Version bump - [*]
L4JXJHWXpijul/*: reorganize imports and remove extern crate - [*]
VNBLGT6GDo not output unmodified files when resetting (fix) - [*]
MU5GSJAWPartial push and pull (WARNING: breaks the existing protocol) - [*]
G6S6PWZEDo not touch the channel if this is a partial record - [*]
K6GWUOD5Styling progress bars - [*]
2K7JLB4ZNo pager on Windows
Change contents
- edit in pijul/src/repository.rs at line 7
#[cfg(not(unix))]mod basic_lock;#[cfg(unix)]mod unix_lock;mod lock {#[cfg(not(unix))]pub use super::basic_lock::*;#[cfg(unix)]pub use super::unix_lock::*;use std::path::Path;pub enum Lock {Txn(TxnLock),MutTxn(MutTxnLock),} - edit in pijul/src/repository.rs at line 24
impl Lock {pub async fn mut_txn_lock<P: AsRef<Path>>(p: P) -> Result<Self, anyhow::Error> {let pp = p.as_ref().join("db_lock");Ok(Lock::MutTxn(mut_txn(&pp).await?))}pub async fn txn_lock<P: AsRef<Path>>(p: P) -> Result<Self, anyhow::Error> {let pp = p.as_ref().join("db_lock");Ok(Lock::Txn(txn(&pp).await?))}pub async fn commit(&mut self) -> Result<(), anyhow::Error> {match self {Lock::MutTxn(m) => m.commit().await,_ => Ok(()),}}}} - edit in pijul/src/repository.rs at line 45
pub lock: lock::Lock, - replacement in pijul/src/repository.rs at line 89
pub fn find_root(cur: Option<PathBuf>) -> Result<Self, anyhow::Error> {Self::find_root_with_dot_dir(cur, DOT_DIR)pub async fn find_root(cur: Option<PathBuf>) -> Result<Self, anyhow::Error> {Self::find_root_with_dot_dir(cur, DOT_DIR, true).await - replacement in pijul/src/repository.rs at line 93
pub fn find_root_with_dot_dir(pub async unsafe fn find_root_immutable(cur: Option<PathBuf>) -> Result<Self, anyhow::Error> {Self::find_root_with_dot_dir(cur, DOT_DIR, false).await}pub async fn find_root_with_dot_dir( - edit in pijul/src/repository.rs at line 100
mutable: bool, - replacement in pijul/src/repository.rs at line 120
pristine: libpijul::pristine::sanakirja::Pristine::new(&pristine_dir)?,lock: if mutable {lock::Lock::mut_txn_lock(&pristine_dir).await?} else {lock::Lock::txn_lock(&pristine_dir).await?},pristine: unsafe {libpijul::pristine::sanakirja::Pristine::new_nolock(&pristine_dir)?}, - replacement in pijul/src/repository.rs at line 138
pub fn init(path: Option<std::path::PathBuf>) -> Result<Self, anyhow::Error> {pub async fn init(path: Option<std::path::PathBuf>) -> Result<Self, anyhow::Error> { - replacement in pijul/src/repository.rs at line 153
pristine: libpijul::pristine::sanakirja::Pristine::new(&pristine_dir)?,lock: lock::Lock::mut_txn_lock(&pristine_dir).await?,pristine: unsafe {libpijul::pristine::sanakirja::Pristine::new_nolock(&pristine_dir)?}, - file addition: repository[8.21414]
- file addition: unix_lock.rs[0.1940]
use anyhow::bail;use std::io::Read;use std::path::Path;use tokio::io::{AsyncReadExt, AsyncWriteExt};use tokio::net::UnixStream;pub struct TxnLock {_stream: UnixStream,}pub struct MutTxnLock {stream: UnixStream,}const TXN_BEGIN: u8 = 0;const MUT_TXN_BEGIN: u8 = 1;const COMMIT: u8 = 2;const ACK: u8 = 3;pub async fn mut_txn<P: AsRef<Path>>(file: P) -> Result<MutTxnLock, anyhow::Error> {let cmd = std::env::args().next().unwrap();let mut process = std::process::Command::new(&cmd).args(&["lock", file.as_ref().to_str().unwrap()]).stdout(std::process::Stdio::piped()).spawn()?;let s = process.stdout.as_mut().unwrap();s.read(&mut [0u8])?;let mut stream = UnixStream::connect(file).await?;stream.writable().await?;stream.write_all(&[MUT_TXN_BEGIN]).await?;let mut t = [0u8];stream.read_exact(&mut t).await?;if t[0] == ACK {Ok(MutTxnLock { stream })} else {bail!("Pristine locked")}}pub async fn txn<P: AsRef<Path>>(file: P) -> Result<TxnLock, anyhow::Error> {let cmd = std::env::args().next().unwrap();std::process::Command::new(&cmd).args(&["lock", file.as_ref().to_str().unwrap()]).spawn()?;let mut stream = UnixStream::connect(file).await?;stream.write_all(&[TXN_BEGIN]).await?;let mut t = [0u8];stream.read_exact(&mut t).await?;if t[0] == ACK {Ok(TxnLock { _stream: stream })} else {bail!("Pristine locked")}}impl MutTxnLock {pub async fn commit(&mut self) -> Result<(), anyhow::Error> {self.stream.write_all(&[COMMIT]).await?;Ok(())}} - file addition: basic_lock.rs[0.1940]
use fs2::FileExt;use std::fs::OpenOptions;use std::path::Path;pub struct TxnLock {file: std::fs::File,}pub struct MutTxnLock {file: std::fs::File,}pub async fn mut_txn<P: AsRef<Path>>(file: P) -> Result<MutTxnLock, anyhow::Error> {let file = OpenOptions::new().write(true).create(true).open(file)?;file.lock_exclusive()?;Ok(MutTxnLock { file })}pub async fn txn<P: AsRef<Path>>(file: P) -> Result<TxnLock, anyhow::Error> {let file = OpenOptions::new().write(true).create(true).open(file)?;file.lock_shared()?;Ok(TxnLock { file })}impl MutTxnLock {pub async fn commit(&mut self) -> Result<(), anyhow::Error> {Ok(self.file.unlock()?)}}impl Drop for MutTxnLock {fn drop(&mut self) {self.file.unlock().unwrap_or(())}}impl Drop for TxnLock {fn drop(&mut self) {self.file.unlock().unwrap_or(())}} - edit in pijul/src/main.rs at line 122
#[cfg(unix)]Lock(Lock), - replacement in pijul/src/main.rs at line 187
SubCommand::Log(l) => l.run(),SubCommand::Init(init) => init.run(),SubCommand::Log(l) => l.run().await,SubCommand::Init(init) => init.run().await, - replacement in pijul/src/main.rs at line 191
SubCommand::Diff(diff) => diff.run(),SubCommand::Diff(diff) => diff.run().await, - replacement in pijul/src/main.rs at line 194
SubCommand::Change(change) => change.run(),SubCommand::Channel(channel) => channel.run(),SubCommand::Protocol(protocol) => protocol.run(),SubCommand::Change(change) => change.run().await,SubCommand::Channel(channel) => channel.run().await,SubCommand::Protocol(protocol) => protocol.run().await, - replacement in pijul/src/main.rs at line 198
SubCommand::Git(git) => git.run(),SubCommand::Mv(mv) => mv.run(),SubCommand::Ls(ls) => ls.run(),SubCommand::Add(add) => add.run(),SubCommand::Remove(remove) => remove.run(),SubCommand::Reset(reset) => reset.run(),SubCommand::Git(git) => git.run().await,SubCommand::Mv(mv) => mv.run().await,SubCommand::Ls(ls) => ls.run().await,SubCommand::Add(add) => add.run().await,SubCommand::Remove(remove) => remove.run().await,SubCommand::Reset(reset) => reset.run().await, - replacement in pijul/src/main.rs at line 205
SubCommand::Debug(debug) => debug.run(),SubCommand::Fork(fork) => fork.run(),SubCommand::Unrecord(unrecord) => unrecord.run(),SubCommand::Apply(apply) => apply.run(),SubCommand::Remote(remote) => remote.run(),SubCommand::Debug(debug) => debug.run().await,SubCommand::Fork(fork) => fork.run().await,SubCommand::Unrecord(unrecord) => unrecord.run().await,SubCommand::Apply(apply) => apply.run().await,SubCommand::Remote(remote) => remote.run().await, - replacement in pijul/src/main.rs at line 211
SubCommand::Credit(credit) => credit.run(),SubCommand::Credit(credit) => credit.run().await,#[cfg(unix)]SubCommand::Lock(lock) => lock.run().await, - replacement in pijul/src/commands/unrecord.rs at line 35
pub fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path)?;pub async fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path).await?; - edit in pijul/src/commands/unrecord.rs at line 137
repo.lock.commit().await?; - replacement in pijul/src/commands/reset.rs at line 29
pub fn run(self) -> Result<(), anyhow::Error> {self.reset(true)pub async fn run(self) -> Result<(), anyhow::Error> {self.reset(true).await - replacement in pijul/src/commands/reset.rs at line 33
pub fn switch(self) -> Result<(), anyhow::Error> {self.reset(false)pub async fn switch(self) -> Result<(), anyhow::Error> {self.reset(false).await - replacement in pijul/src/commands/reset.rs at line 37
fn reset(self, overwrite_changes: bool) -> Result<(), anyhow::Error> {async fn reset(self, overwrite_changes: bool) -> Result<(), anyhow::Error> { - replacement in pijul/src/commands/reset.rs at line 39
let mut repo = Repository::find_root(self.repo_path)?;let mut repo = Repository::find_root(self.repo_path).await?; - edit in pijul/src/commands/reset.rs at line 109
repo.lock.commit().await?; - edit in pijul/src/commands/reset.rs at line 166
repo.lock.commit().await?; - replacement in pijul/src/commands/record.rs at line 59
let mut repo = Repository::find_root(self.repo_path.clone())?;let mut repo = Repository::find_root(self.repo_path.clone()).await?; - edit in pijul/src/commands/record.rs at line 156
repo.lock.commit().await?; - edit in pijul/src/commands/record.rs at line 162
repo.lock.commit().await?; - replacement in pijul/src/commands/pushpull.rs at line 33
pub fn run(self) -> Result<(), anyhow::Error> {let repo = Repository::find_root(self.repo_path)?;pub async fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path).await?; - edit in pijul/src/commands/pushpull.rs at line 51
repo.lock.commit().await?; - replacement in pijul/src/commands/pushpull.rs at line 123
let repo = Repository::find_root(self.repo_path)?;let mut repo = Repository::find_root(self.repo_path).await?; - edit in pijul/src/commands/pushpull.rs at line 268
repo.lock.commit().await?; - replacement in pijul/src/commands/pushpull.rs at line 277
let mut repo = Repository::find_root(self.repo_path)?;let mut repo = Repository::find_root(self.repo_path).await?; - edit in pijul/src/commands/pushpull.rs at line 476
repo.lock.commit().await?; - replacement in pijul/src/commands/protocol.rs at line 49
pub fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path)?;pub async fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path).await?; - edit in pijul/src/commands/protocol.rs at line 250
repo.lock.commit().await?; - edit in pijul/src/commands/mod.rs at line 59
#[cfg(unix)]mod lock;#[cfg(unix)]pub use lock::*; - replacement in pijul/src/commands/log.rs at line 31
pub fn run(self) -> Result<(), anyhow::Error> {let repo = Repository::find_root(self.repo_path)?;pub async fn run(self) -> Result<(), anyhow::Error> {let repo = unsafe { Repository::find_root_immutable(self.repo_path).await? }; - file addition: lock.rs[8.93386]
use fs2::FileExt;use std::fs::OpenOptions;use std::io::Write;use std::path::PathBuf;use std::sync::Arc;use tokio::io::{AsyncReadExt, AsyncWriteExt};use tokio::net::UnixListener;use tokio::sync::{watch, Mutex};use clap::Clap;#[derive(Clap, Debug)]pub struct Lock {path: PathBuf,}const COMMIT: u8 = 2;const ACK: u8 = 3;const LOCKED: u8 = 4;impl Lock {pub async fn run(self) -> Result<(), anyhow::Error> {let lock = Arc::new(self.path.with_extension("lock"));let lockfile = OpenOptions::new().write(true).create(true).open(&lock.as_ref()).unwrap();if lockfile.try_lock_exclusive().is_err() {return Ok(());}let listener = UnixListener::bind(&self.path).unwrap();println!();let n_clients = Arc::new(Mutex::new(0usize));let file = Arc::new(self.path.clone());let muttxn = Arc::new(Mutex::new(()));let (tx, active_at_last_commit) = watch::channel(0);let tx = std::sync::Arc::new(tx);let clock = Arc::new(Mutex::new(0usize));let txn_counter = Arc::new(Mutex::new(0usize));let last_commit_date = Arc::new(Mutex::new(0usize));loop {let x = listener.accept().await;{let mut f = OpenOptions::new().write(true).create(true).append(true).open("log").unwrap();writeln!(f, "accepted").unwrap()}match x {Ok((mut stream, _addr)) => {*n_clients.lock().await += 1;{let mut f = OpenOptions::new().write(true).create(true).append(true).open("log").unwrap();writeln!(f, "n = {:?}", *n_clients.lock().await).unwrap();}let file = file.clone();let muttxn = muttxn.clone();let mut active_at_last_commit = active_at_last_commit.clone();let clock = clock.clone();let last_commit_date = last_commit_date.clone();let txn_counter = txn_counter.clone();let n_clients = n_clients.clone();let tx = tx.clone();let lock = lock.clone();tokio::spawn(async move {let mut t = [0u8];while let Ok(n) = stream.read(&mut t).await {if n == 0 {break;}if t[0] == 1 {// muttxnlet lock = if let Ok(guard) = muttxn.try_lock() {guard} else {stream.write_all(&[LOCKED]).await.unwrap_or(());muttxn.lock().await};while *active_at_last_commit.borrow() > 0 {stream.write_all(&[LOCKED]).await.unwrap_or(());active_at_last_commit.changed().await.unwrap();}stream.write_all(&[ACK]).await.unwrap_or(());if let Ok(n) = stream.read(&mut t).await {if n == 0 {break;}if t[0] == COMMIT {// commitlet mut clock = clock.lock().await;*clock += 1;*last_commit_date.lock().await = *clock;let counter = *txn_counter.lock().await;tx.send(counter).unwrap();}}std::mem::drop(lock);} else {// txn*txn_counter.lock().await += 1;let start_date = *clock.lock().await;stream.write_all(&[ACK]).await.unwrap_or(());let n = stream.read(&mut t).await.unwrap_or(0);if n == 0 {break;}*txn_counter.lock().await -= 1;if start_date < *last_commit_date.lock().await {let last = *active_at_last_commit.borrow();tx.send(last - 1).unwrap();}}}{let mut f = OpenOptions::new().write(true).create(true).append(true).open("log").unwrap();writeln!(f, "n = {:?}", *n_clients.lock().await).unwrap();}if *n_clients.lock().await == 1 {tokio::time::sleep(std::time::Duration::from_secs(1)).await;if *n_clients.lock().await == 1 {std::fs::remove_file(file.as_ref()).unwrap_or(());let lockfile = OpenOptions::new().write(true).create(true).open(lock.as_ref()).unwrap();lockfile.unlock().unwrap_or(());std::process::exit(0)}}*n_clients.lock().await -= 1});}Err(_) => break,}}std::fs::remove_file(file.as_ref()).unwrap_or(());let lockfile = OpenOptions::new().write(true).create(true).open(lock.as_ref()).unwrap();lockfile.unlock().unwrap_or(());std::process::exit(0)}} - replacement in pijul/src/commands/init.rs at line 18
pub fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::init(self.path)?;pub async fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::init(self.path).await?; - edit in pijul/src/commands/init.rs at line 28
repo.lock.commit().await?; - replacement in pijul/src/commands/git.rs at line 37
pub fn run(self) -> Result<(), anyhow::Error> {let repo = if let Ok(repo) = Repository::find_root(self.repo_path.clone()) {pub async fn run(self) -> Result<(), anyhow::Error> {let repo = if let Ok(repo) = Repository::find_root(self.repo_path.clone()).await { - replacement in pijul/src/commands/git.rs at line 41
Repository::init(self.repo_path.clone())?Repository::init(self.repo_path.clone()).await? - replacement in pijul/src/commands/git.rs at line 65
import(&git, &mut env_git, &mut repo, &dag)?;import(&git, &mut env_git, &mut repo, &dag).await?; - replacement in pijul/src/commands/git.rs at line 219
fn import(async fn import( - edit in pijul/src/commands/git.rs at line 312
repo.repo.lock.commit().await?; - replacement in pijul/src/commands/fork.rs at line 25
pub fn run(self) -> Result<(), anyhow::Error> {let repo = Repository::find_root(self.repo_path)?;pub async fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path).await?; - edit in pijul/src/commands/fork.rs at line 40
repo.lock.commit().await?; - replacement in pijul/src/commands/file_operations.rs at line 24
pub fn run(mut self) -> Result<(), anyhow::Error> {let repo = Repository::find_root(self.repo_path.clone())?;pub async fn run(mut self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path.clone()).await?; - edit in pijul/src/commands/file_operations.rs at line 57
repo.lock.commit().await?; - replacement in pijul/src/commands/file_operations.rs at line 78
pub fn run(self) -> Result<(), anyhow::Error> {let repo = Repository::find_root(self.repo_path)?;pub async fn run(self) -> Result<(), anyhow::Error> {let repo = unsafe { Repository::find_root_immutable(self.repo_path).await? }; - replacement in pijul/src/commands/file_operations.rs at line 104
pub fn run(self) -> Result<(), anyhow::Error> {let repo = Repository::find_root(self.repo_path.clone())?;pub async fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path.clone()).await?; - edit in pijul/src/commands/file_operations.rs at line 151
repo.lock.commit().await?; - replacement in pijul/src/commands/file_operations.rs at line 166
pub fn run(self) -> Result<(), anyhow::Error> {let repo = Repository::find_root(self.repo_path.clone())?;pub async fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path.clone()).await?; - edit in pijul/src/commands/file_operations.rs at line 193
repo.lock.commit().await?; - replacement in pijul/src/commands/diff.rs at line 35
pub fn run(mut self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path.clone())?;pub async fn run(mut self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path.clone()).await?; - replacement in pijul/src/commands/debug.rs at line 18
pub fn run(self) -> Result<(), anyhow::Error> {let repo = Repository::find_root(self.repo_path)?;pub async fn run(self) -> Result<(), anyhow::Error> {let repo = Repository::find_root(self.repo_path).await?; - replacement in pijul/src/commands/credit.rs at line 26
pub fn run(self) -> Result<(), anyhow::Error> {pub async fn run(self) -> Result<(), anyhow::Error> { - replacement in pijul/src/commands/credit.rs at line 28
let mut repo = Repository::find_root(self.repo_path)?;let mut repo = unsafe { Repository::find_root_immutable(self.repo_path).await? }; - replacement in pijul/src/commands/clone.rs at line 68
let mut repo = Repository::init(Some(path))?;let mut repo = Repository::init(Some(path)).await?; - edit in pijul/src/commands/clone.rs at line 108
repo.lock.commit().await?; - replacement in pijul/src/commands/channel.rs at line 35
pub fn run(self) -> Result<(), anyhow::Error> {pub async fn run(self) -> Result<(), anyhow::Error> { - replacement in pijul/src/commands/channel.rs at line 39
let repo = Repository::find_root(self.repo_path)?;let repo = Repository::find_root(self.repo_path).await?; - replacement in pijul/src/commands/channel.rs at line 54
let repo = Repository::find_root(self.repo_path)?;let mut repo = Repository::find_root(self.repo_path).await?; - edit in pijul/src/commands/channel.rs at line 64
repo.lock.commit().await?; - replacement in pijul/src/commands/channel.rs at line 73
.switch()?;.switch().await?; - replacement in pijul/src/commands/channel.rs at line 77
let repo = Repository::find_root(self.repo_path)?;let mut repo = Repository::find_root(self.repo_path).await?; - edit in pijul/src/commands/channel.rs at line 94
repo.lock.commit().await?; - replacement in pijul/src/commands/change.rs at line 21
pub fn run(self) -> Result<(), anyhow::Error> {let repo = Repository::find_root(self.repo_path.clone())?;pub async fn run(self) -> Result<(), anyhow::Error> {let repo = unsafe { Repository::find_root_immutable(self.repo_path.clone()).await? }; - replacement in pijul/src/commands/archive.rs at line 85
if let Ok(repo) = Repository::find_root(self.repo_path.clone()) {if let Ok(repo) = Repository::find_root(self.repo_path.clone()).await { - replacement in pijul/src/commands/apply.rs at line 27
pub fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path)?;pub async fn run(self) -> Result<(), anyhow::Error> {let mut repo = Repository::find_root(self.repo_path).await?; - edit in pijul/src/commands/apply.rs at line 91
repo.lock.commit().await?; - replacement in pijul/Cargo.toml at line 4
version = "1.0.0-alpha.32"version = "1.0.0-alpha.33" - edit in pijul/Cargo.toml at line 32
"src/commands/lock.rs", - edit in pijul/Cargo.toml at line 35
"src/repository/unix_lock.rs","src/repository/basic_lock.rs", - replacement in pijul/Cargo.toml at line 53
libpijul = { path = "../libpijul", version = "1.0.0-alpha.29", features = [ "tarball" ] }libpijul = { path = "../libpijul", version = "1.0.0-alpha.30", features = [ "tarball" ] } - edit in pijul/Cargo.toml at line 87[3.2300][71.309]
fs2 = "0.4" - replacement in libpijul/Cargo.toml at line 4
version = "1.0.0-alpha.29"version = "1.0.0-alpha.30" - replacement in Cargo.lock at line 519
version = "0.3.9"version = "0.3.10" - replacement in Cargo.lock at line 521
checksum = "c70be434c505aee38639abccb918163b63158a4b4bb791b45b7023044bdc3c9c"checksum = "309f13e3f4be6d5917178c84db67c0b9a09177ac16d4f9a7313a767a68adaa77" - replacement in Cargo.lock at line 534
version = "0.3.9"version = "0.3.10" - replacement in Cargo.lock at line 536
checksum = "f01c61843314e95f96cc9245702248733a3a3d744e43e2e755e3c7af8348a0a9"checksum = "7a3b03bd32f6ec7885edeb99acd1e47e20e34fd4dfd3c6deed6fcac8a9d28f6a" - replacement in Cargo.lock at line 544
version = "0.3.9"version = "0.3.10" - replacement in Cargo.lock at line 546
checksum = "db8d3b0917ff63a2a96173133c02818fac4a746b0a57569d3baca9ec0e945e08"checksum = "ed8aeae2b6ab243ebabe6f54cd4cf53054d98883d5d326128af7d57a9ca5cd3d" - replacement in Cargo.lock at line 550
version = "0.3.9"version = "0.3.10" - replacement in Cargo.lock at line 552
checksum = "9ee9ca2f7eb4475772cf39dd1cd06208dce2670ad38f4d9c7262b3e15f127068"checksum = "3f7836b36b7533d16fd5937311d98ba8965ab81030de8b0024c299dd5d51fb9b" - replacement in Cargo.lock at line 561
version = "0.3.9"version = "0.3.10" - replacement in Cargo.lock at line 563
checksum = "e37c1a51b037b80922864b8eed90692c5cd8abd4c71ce49b77146caa47f3253b"checksum = "d41234e71d5e8ca73d01563974ef6f50e516d71e18f1a2f1184742e31f5d469f" - replacement in Cargo.lock at line 567
version = "0.3.9"version = "0.3.10" - replacement in Cargo.lock at line 569
checksum = "0f8719ca0e1f3c5e34f3efe4570ef2c0610ca6da85ae7990d472e9cbfba13664"checksum = "3520e0eb4e704e88d771b92d51273ee212997f0d8282f17f5d8ff1cb39104e42" - replacement in Cargo.lock at line 579
version = "0.3.9"version = "0.3.10" - replacement in Cargo.lock at line 581
checksum = "f6adabac1290109cfa089f79192fb6244ad2c3f1cc2281f3e1dd987592b71feb"checksum = "c72d188479368953c6c8c7140e40d7a4401674ab3b98a41e60e515d6cbdbe5de" - replacement in Cargo.lock at line 585
version = "0.3.9"version = "0.3.10" - replacement in Cargo.lock at line 587
checksum = "a92a0843a2ff66823a8f7c77bffe9a09be2b64e533562c412d63075643ec0038"checksum = "08944cea9021170d383287169859c0ca8147d9ec285978393109954448f33cc7" - replacement in Cargo.lock at line 594
version = "0.3.9"version = "0.3.10" - replacement in Cargo.lock at line 596
checksum = "036a2107cdeb57f6d7322f1b6c363dad67cd63ca3b7d1b925bdf75bd5d96cda9"checksum = "d3dd206efbe2ca683b2ce138ccdf61e1b0a63f5816dcedc9d8654c500ba0cea6" - replacement in Cargo.lock at line 778
version = "2.0.1"version = "2.1.0" - replacement in Cargo.lock at line 780
checksum = "3c1ad908cc71012b7bea4d0c53ba96a8cba9962f048fa68d143376143d863b7a"checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - replacement in Cargo.lock at line 937
version = "1.0.0-alpha.29"version = "1.0.0-alpha.30" - replacement in Cargo.lock at line 1288
version = "1.0.0-alpha.32"version = "1.0.0-alpha.33" - edit in Cargo.lock at line 1301
"fs2", - replacement in Cargo.lock at line 1437
version = "0.1.6"version = "0.1.7" - replacement in Cargo.lock at line 1439
checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a"checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"