Hard-unrecord

[?]
Nov 30, 2020, 9:57 PM
5DVRL6MFXQOCPOZMYSKBERMRRVUTYRL2SRGRTU2MH4IEOFCDKM3QC

Dependencies

  • [2] I52XSRUH Massive cleanup, and simplification
  • [3] AEPEFS7O Write help for each argument
  • [4] 7L32EXDW When pulling, treating the pending change as a local change
  • [5] L4JXJHWX pijul/*: reorganize imports and remove extern crate
  • [6] YAJAXIV5 Unrecording changes atomically
  • [7] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).
  • [8] Q45QHPO4 Feedback on network stuff

Change contents

  • edit in pijul/src/commands/unrecord.rs at line 3
    [5.1144]
    [5.1144]
    use anyhow::bail;
  • replacement in pijul/src/commands/unrecord.rs at line 5
    [5.1160][2.1811:1854]()
    use libpijul::{MutTxnT, MutTxnTExt, TxnT};
    [5.1160]
    [5.1235]
    use libpijul::changestore::ChangeStore;
    use libpijul::{Base32, MutTxnT, MutTxnTExt, TxnT};
  • edit in pijul/src/commands/unrecord.rs at line 19
    [5.95955]
    [3.375]
    /// 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
    [5.96177][5.96177:96236]()
    let repo = Repository::find_root(self.repo_path)?;
    [5.96177]
    [5.96236]
    let mut repo = Repository::find_root(self.repo_path)?;
  • edit in pijul/src/commands/unrecord.rs at line 34
    [5.314]
    [5.314]
    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
    [5.97034][5.805:974](),[5.974][2.1986:2047]()
    return Err((crate::Error::CannotUnrecord {
    change: c,
    dep: txn.get_external(d).unwrap(),
    })
    .into());
    [5.97034]
    [5.97363]
    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
    [5.97582]
    [5.97582]
    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)
    };
    [5.119533]
    [5.119907]
    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))
    }