Hard-unrecord
[?]
Nov 30, 2020, 9:57 PM
5DVRL6MFXQOCPOZMYSKBERMRRVUTYRL2SRGRTU2MH4IEOFCDKM3QCDependencies
- [2]
I52XSRUHMassive cleanup, and simplification - [3]
AEPEFS7OWrite help for each argument - [4]
7L32EXDWWhen pulling, treating the pending change as a local change - [5]
Q45QHPO4Feedback on network stuff - [6]
SXEYMYF7Fixing the bad changes in history (unfortunately, by rebooting). - [7]
YAJAXIV5Unrecording changes atomically - [8]
L4JXJHWXpijul/*: reorganize imports and remove extern crate
Change contents
- edit in pijul/src/commands/unrecord.rs at line 3
use anyhow::bail; - replacement in pijul/src/commands/unrecord.rs at line 5
use libpijul::{MutTxnT, MutTxnTExt, TxnT};use libpijul::changestore::ChangeStore;use libpijul::{Base32, MutTxnT, MutTxnTExt, TxnT}; - edit in pijul/src/commands/unrecord.rs at line 19
/// Undo the change in the working copy (preserving unrecorded changes if there are any)#[clap(long = "reset")]reset: bool, - replacement in pijul/src/commands/unrecord.rs at line 29
let repo = Repository::find_root(self.repo_path)?;let mut repo = Repository::find_root(self.repo_path)?; - edit in pijul/src/commands/unrecord.rs at line 34
let pending_hash = if self.reset {super::pending(&mut txn, &mut channel, &mut repo)?} else {None}; - replacement in pijul/src/commands/unrecord.rs at line 60
return Err((crate::Error::CannotUnrecord {change: c,dep: txn.get_external(d).unwrap(),}).into());let dep = txn.get_external(d).unwrap();if Some(dep) == pending_hash {bail!("Cannot unrecord change {} because unrecorded changes depend on it",c);} else {bail!("Cannot unrecord change {} because {} depend on it",c,dep.to_base32());} - edit in pijul/src/commands/unrecord.rs at line 78
if let Some(h) = pending_hash {txn.output_repository_no_pending(&mut repo.working_copy,&repo.changes,&mut channel,"",true,)?;txn.unrecord(&repo.changes, &mut channel, &h)?;repo.changes.del_change(&h)?;} - replacement in pijul/src/commands/pushpull.rs at line 358[5.119533]→[5.119533:119819](∅→∅),[5.119819]→[4.0:896](∅→∅),[4.896]→[5.119896:119907](∅→∅),[5.119896]→[5.119896:119907](∅→∅)
let recorded = txn.record_all(libpijul::Algorithm::default(),&mut channel,&mut repo.working_copy,&repo.changes,"",)?;let hash = if recorded.actions.is_empty() {None} else {let actions = recorded.actions.into_iter().map(|rec| rec.globalize(&txn)).collect();let mut pending_change = libpijul::change::Change::make_change(&txn,&channel,actions,recorded.contents,libpijul::change::ChangeHeader::default(),Vec::new(),);let (dependencies, extra_known) =libpijul::change::dependencies(&txn, &channel, pending_change.changes.iter());pending_change.dependencies = dependencies;pending_change.extra_known = extra_known;let hash = repo.changes.save_change(&pending_change).unwrap();txn.apply_local_change(&mut channel, &pending_change, hash, &recorded.updatables)?;Some(hash)};let hash = super::pending(&mut txn, &mut channel, &mut repo)?; - edit in pijul/src/commands/mod.rs at line 61[5.134366]
/// Record the pending change (i.e. any unrecorded modifications in/// the working copy), returning its hash.fn pending<T: libpijul::MutTxnTExt + libpijul::TxnT>(txn: &mut T,channel: &mut libpijul::ChannelRef<T>,repo: &mut crate::repository::Repository,) -> Result<Option<libpijul::Hash>, anyhow::Error> {use libpijul::changestore::ChangeStore;let recorded = txn.record_all(libpijul::Algorithm::default(),channel,&mut repo.working_copy,&repo.changes,"",)?;if recorded.actions.is_empty() {return Ok(None);}let actions = recorded.actions.into_iter().map(|rec| rec.globalize(txn)).collect();let mut pending_change = libpijul::change::Change::make_change(txn,channel,actions,recorded.contents,libpijul::change::ChangeHeader::default(),Vec::new(),);let (dependencies, extra_known) =libpijul::change::dependencies(txn, channel, pending_change.changes.iter());pending_change.dependencies = dependencies;pending_change.extra_known = extra_known;let hash = repo.changes.save_change(&pending_change).unwrap();txn.apply_local_change(channel, &pending_change, hash, &recorded.updatables)?;Ok(Some(hash))}