Unrecording changes atomically

[?]
Nov 20, 2020, 3:21 PM
YAJAXIV5VL263Z6FYLKFPROB3MQPRPH22P44GRGRVGEP56HOMBOAC

Dependencies

  • [2] AN7IDX26 pijul: added ChangesNotFound error variant
  • [3] L4JXJHWX pijul/*: reorganize imports and remove extern crate
  • [4] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).

Change contents

  • edit in pijul/src/main.rs at line 11
    [3.716]
    [3.716]
    use libpijul::pristine::Base32;
  • edit in pijul/src/main.rs at line 158
    [2.93]
    [4.88054]
    #[error("Cannot unrecord change {}, because change {} depends on it", change, dep.to_base32())]
    CannotUnrecord { change: String, dep: libpijul::pristine::Hash },
  • edit in pijul/src/commands/unrecord.rs at line 0
    [4.95741][4.95741:95761]()
    use std::io::Write;
  • replacement in pijul/src/commands/unrecord.rs at line 3
    [3.1160][3.1160:1209]()
    use libpijul::pristine::{Base32, MutTxnT, TxnT};
    [3.1160]
    [3.1209]
    use libpijul::pristine::{MutTxnT, TxnT};
  • replacement in pijul/src/commands/unrecord.rs at line 28
    [4.96409][4.96409:96673]()
    let mut stderr = std::io::stderr();
    for c in self.change_id.iter() {
    let (hash, change_id) = txn.hash_from_prefix(c)?;
    if let Some(mut channel) = txn.load_channel(channel_name) {
    let mut can_unrecord = true;
    [4.96409]
    [4.96673]
    if let Some(mut channel) = txn.load_channel(channel_name) {
    let mut changes = Vec::new();
    let channel_ = channel.borrow();
    for c in self.change_id {
    let (hash, change_id) = txn.hash_from_prefix(&c)?;
    let n = txn.get_changeset(&channel_.changes, change_id, None).unwrap();
    changes.push((hash, change_id, n, c))
    }
    std::mem::drop(channel_);
    changes.sort_by(|a, b| b.2.cmp(&a.2));
    for (hash, change_id, _, c) in changes {
  • replacement in pijul/src/commands/unrecord.rs at line 47
    [4.97034][4.97034:97363]()
    if can_unrecord {
    writeln!(stderr, "Cannot unrecord change {}, because the following changes depend on it:", c)?
    }
    can_unrecord = false;
    writeln!(stderr, " {}", txn.get_external(d).unwrap().to_base32())?
    [4.97034]
    [4.97363]
    return Err((crate::Error::CannotUnrecord {
    change: c,
    dep: txn.get_external(d).unwrap(),
    }).into())
  • replacement in pijul/src/commands/unrecord.rs at line 54
    [4.97445][4.97445:97568]()
    if can_unrecord {
    txn.unrecord(&repo.changes, &mut channel, &hash)?;
    }
    [4.97445]
    [4.97568]
    txn.unrecord(&repo.changes, &mut channel, &hash)?;