Fixing a conflict

pmeunier
Jan 30, 2026, 7:29 PM
7JTKP74VPC3DMOE3TFNGBQ5JPIHYOMELOR5FSSIZJPX22JL4MDJAC

Dependencies

  • [2] CRLBACYQ Fixing conflicts
  • [3] AZM7VL5Z Support for sub-transactions
  • [4] C55NBE2R Version bump
  • [5] MBIKZPCC Add flags to disable the use of the system keyring, asking to prompt the key password directly instead
  • [6] HGJETVAN Create `pijul_config::global_config_directory()`
  • [7] HKHMES6T Solving conflicts
  • [8] YJXRCXOS Disallow overwriting existing identities via `pijul id edit`
  • [9] 4OJWMSOW Fully replace crate::Identity
  • [10] KKNMDXAI Tweak identity subcommand
  • [11] FDEVV5NG Tag check
  • [12] 4KJ45IJL Implement new identity management
  • [13] 5Z2Y7VGV Migrate `pijul::identity::Complete::prove` to `pijul::remote::prove`
  • [14] 44RUBHRE Only re-prove identity when credentials change
  • [15] DOEG3V7U Only re-write identity data when changed
  • [16] 4RV7T4SR Migrate from `pijul::config` to `pijul-config`
  • [17] YW6NICQV Migrate codebase to refactored `pijul_config` crate
  • [18] BV4PLHOV Remove dependency on `once_cell`
  • [19] Q7LEDPIW Refactor tag command's handling of repo and channel
  • [20] DWSAYGVE Update codebase to use new identity management
  • [21] EVDH2ECT Migrate from `pijul::identity` to `pijul_identity`
  • [22] 67GIAQEU Handle named remotes in pijul remote and remote delete
  • [23] N26HD5PF Replace `chrono` with `jiff`
  • [24] WTPFQPO5 Add global `no_prompt` flag
  • [25] HJVWPKWV Migrate crates to edition 2024
  • [26] 32G3GOK7 Migrate from `dialoguer` to `pijul-interaction`
  • [27] EEBKW7VT Keys and identities
  • [28] A3RM526Y Integrating identity malleability
  • [29] 5WERCJKL Check if any identities exist before removal
  • [30] QL6K2ZM3 Tags
  • [*] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).
  • [*] XYTAZR36 Solving conflicts

Change contents

  • replacement in pijul-remote/src/lib.rs at line 104
    [7.1130][7.1130:1222](),[7.1222][5.24:72](),[7.1222][7.1814:1857]()
    let (key, _password) = identity
    .credentials
    .clone()
    .unwrap()
    .decrypt(&identity.name, use_keyring)?;
    .decrypt(config, &identity.name)?;
    [7.1130]
    [7.1257]
    let (key, _password) =
    identity
    .credentials
    .clone()
    .unwrap()
    .decrypt(config, &identity.name, use_keyring)?;
  • replacement in pijul-identity/src/repair.rs at line 42
    [7.3347][5.73:151](),[7.3347][5.73:151](),[7.3347][7.2724:2814]()
    pub async fn fix_identities(use_keyring: bool) -> Result<(), anyhow::Error> {
    pub async fn fix_identities(config: &pijul_config::Config) -> Result<(), anyhow::Error> {
    [7.3347]
    [6.0]
    pub async fn fix_identities(
    config: &pijul_config::Config,
    use_keyring: bool,
    ) -> Result<(), anyhow::Error> {
  • replacement in pijul-identity/src/repair.rs at line 57
    [7.3880][5.152:224](),[7.3880][7.2933:3000]()
    let extraction_result = Complete::from_old_format(use_keyring);
    let extraction_result = Complete::from_old_format(config);
    [7.3880]
    [7.3945]
    let extraction_result = Complete::from_old_format(config, use_keyring);
  • replacement in pijul-identity/src/repair.rs at line 67
    [7.4220][5.225:296](),[7.4220][7.3001:3067](),[7.69][7.4888:4889](),[5.296][7.4888:4889](),[7.458][7.4888:4889](),[7.3067][7.4888:4889](),[7.4888][7.4888:4889]()
    old_identity.clone().create(true, use_keyring).await?;
    old_identity.clone().create(config, true).await?;
    [7.4220]
    [7.4889]
    old_identity
    .clone()
    .create(config, true, use_keyring)
    .await?;
  • replacement in pijul-identity/src/repair.rs at line 95
    [7.6256][5.297:376](),[7.6256][7.3068:3148]()
    Complete::default()?.create(true, use_keyring).await?;
    Complete::default(config)?.create(config, true).await?;
    [7.6256]
    [7.6333]
    Complete::default(config)?
    .create(config, true, use_keyring)
    .await?;
  • replacement in pijul-identity/src/repair.rs at line 109
    [7.6618][5.377:420](),[7.6618][7.3149:3187]()
    identity.valid_keys(use_keyring)?;
    identity.valid_keys(config)?;
    [7.6618]
    [7.6650]
    identity.valid_keys(config, use_keyring)?;
  • replacement in pijul-identity/src/repair.rs at line 117
    [7.6735][5.421:498](),[7.6735][7.3188:3277]()
    fn valid_keys(&self, use_keyring: bool) -> Result<bool, anyhow::Error> {
    fn valid_keys(&self, config: &pijul_config::Config) -> Result<bool, anyhow::Error> {
    [7.6735]
    [7.520]
    fn valid_keys(
    &self,
    config: &pijul_config::Config,
    use_keyring: bool,
    ) -> Result<bool, anyhow::Error> {
  • replacement in pijul-identity/src/repair.rs at line 123
    [7.563][5.499:576](),[7.563][7.3278:3350]()
    let decryped_public_key = self.decrypt(use_keyring)?.0.public_key();
    let decryped_public_key = self.decrypt(config)?.0.public_key();
    [7.563]
    [7.7160]
    let decryped_public_key = self.decrypt(config, use_keyring)?.0.public_key();
  • replacement in pijul-identity/src/repair.rs at line 186
    [7.9995][5.577:657](),[7.9995][5.577:657](),[7.9995][7.3437:3529]()
    fn from_old_format(use_keyring: bool) -> Result<Self, IdentityParseError> {
    fn from_old_format(config: &pijul_config::Config) -> Result<Self, IdentityParseError> {
    [7.9995]
    [6.69]
    fn from_old_format(
    config: &pijul_config::Config,
    use_keyring: bool,
    ) -> Result<Self, IdentityParseError> {
  • replacement in pijul-identity/src/repair.rs at line 304
    [7.15446][5.658:705](),[7.15446][7.4139:4181]()
    if identity.valid_keys(use_keyring)? {
    if identity.valid_keys(config)? {
    [7.15446]
    [7.15482]
    if identity.valid_keys(config, use_keyring)? {
  • replacement in pijul-identity/src/load.rs at line 68
    [7.24577][5.706:794](),[7.24577][7.4564:4664]()
    pub async fn choose_identity_name(use_keyring: bool) -> Result<String, anyhow::Error> {
    pub async fn choose_identity_name(config: &pijul_config::Config) -> Result<String, anyhow::Error> {
    [7.24577]
    [7.24663]
    pub async fn choose_identity_name(
    config: &pijul_config::Config,
    use_keyring: bool,
    ) -> Result<String, anyhow::Error> {
  • replacement in pijul-identity/src/load.rs at line 78
    [7.24848][5.795:839](),[7.24848][7.4665:4704]()
    fix_identities(use_keyring).await?;
    fix_identities(config).await?;
    [7.24848]
    [7.24890]
    fix_identities(config, use_keyring).await?;
  • edit in pijul-identity/src/lib.rs at line 105
    [5.879]
    [5.879]
    config: &pijul_config::Config,
  • edit in pijul-identity/src/lib.rs at line 109
    [7.3255][7.5059:5214]()
    pub fn decrypt(
    &mut self,
    config: &pijul_config::Config,
    name: &str,
    ) -> Result<(SKey, Option<String>), anyhow::Error> {
  • resolve order conflict in pijul-identity/src/lib.rs at line 109
    [5.983]
    [7.3348]
  • edit in pijul-identity/src/lib.rs at line 251
    [7.6972][5.1223:1433]()
    pub fn decrypt(&self, use_keyring: bool) -> Result<(SKey, Option<String>), anyhow::Error> {
    self.credentials
    .clone()
    .unwrap()
    .decrypt(&self.name, use_keyring)
  • edit in pijul-identity/src/lib.rs at line 254
    [7.6110]
    [7.6110]
    use_keyring: bool,
  • replacement in pijul-identity/src/lib.rs at line 260
    [7.6235][7.6235:6276]()
    .decrypt(config, &self.name)
    [7.6235]
    [7.7111]
    .decrypt(config, &self.name, use_keyring)
  • replacement in pijul-identity/src/lib.rs at line 263
    [7.7118][5.1434:1578](),[7.7118][7.6277:6428]()
    fn change_password(&mut self, use_keyring: bool) -> Result<(), anyhow::Error> {
    let (decryped_key, _) = self.decrypt(use_keyring)?;
    fn change_password(&mut self, config: &pijul_config::Config) -> Result<(), anyhow::Error> {
    let (decryped_key, _) = self.decrypt(config)?;
    [7.7118]
    [7.7232]
    fn change_password(
    &mut self,
    config: &pijul_config::Config,
    use_keyring: bool,
    ) -> Result<(), anyhow::Error> {
    let (decryped_key, _) = self.decrypt(config, use_keyring)?;
  • replacement in pijul-identity/src/create.rs at line 98
    [7.10379][5.1607:1663](),[7.10379][7.6825:6876]()
    new_identity.change_password(use_keyring)?;
    new_identity.change_password(config)?;
    [7.10379]
    [7.10424]
    new_identity.change_password(config, use_keyring)?;
  • edit in pijul-identity/src/create.rs at line 272
    [7.38529][5.1664:1764]()
    pub async fn create(&self, link_remote: bool, use_keyring: bool) -> Result<(), anyhow::Error> {
  • edit in pijul-identity/src/create.rs at line 276
    [7.7866]
    [7.7866]
    use_keyring: bool,
  • replacement in pijul-identity/src/create.rs at line 279
    [7.14076][5.1765:1858](),[7.14076][7.7904:7992]()
    let confirmed_identity = self.prompt_changes(None, link_remote, use_keyring).await?;
    let confirmed_identity = self.prompt_changes(config, None, link_remote).await?;
    [7.14076]
    [7.1007]
    let confirmed_identity = self
    .prompt_changes(config, None, link_remote, use_keyring)
    .await?;
  • replacement in pijul/src/commands/tag.rs at line 119
    [7.2976][5.1952:2048](),[7.2976][7.9665:9756]()
    let header = header(author.as_deref(), message, timestamp, !no_keyring).await?;
    let header = header(config, author.as_deref(), message, timestamp).await?;
    [7.2976]
    [7.1031]
    let header =
    header(config, author.as_deref(), message, timestamp, !no_keyring).await?;
  • replacement in pijul/src/commands/tag.rs at line 255
    [7.788][5.2073:2189]()
    let k =
    pijul_identity::public_key(&pijul_identity::choose_identity_name(use_keyring).await?)?;
    [7.13668]
    [7.9832]
    let k = pijul_identity::public_key(
    &pijul_identity::choose_identity_name(config, use_keyring).await?,
    )?;
  • replacement in pijul/src/commands/tag.rs at line 259
    [7.9845][7.9845:9926]()
    let identity_name = pijul_identity::choose_identity_name(config).await?;
    [7.9845]
    [7.9926]
    let identity_name = pijul_identity::choose_identity_name(config, use_keyring).await?;
  • replacement in pijul/src/commands/record.rs at line 148
    [5.2365][5.2365:2441]()
    &pijul_identity::choose_identity_name(!self.no_keyring).await?,
    [5.2365]
    [5.2441]
    &pijul_identity::choose_identity_name(config, !self.no_keyring).await?,
  • edit in pijul/src/commands/record.rs at line 150
    [7.75][7.10497:10596](),[7.75][7.10497:10596]()
    pijul_identity::Complete::load(&pijul_identity::choose_identity_name(config).await?)?;
  • resolve order conflict in pijul/src/commands/record.rs at line 150
    [5.2453]
    [7.168]
  • replacement in pijul/src/commands/record.rs at line 151
    [7.169][5.2454:2517](),[7.169][7.10597:10650]()
    let (secret, _) = complete.decrypt(!self.no_keyring)?;
    let (secret, _) = complete.decrypt(config)?;
    [7.169]
    [7.1910]
    let (secret, _) = complete.decrypt(config, !self.no_keyring)?;
  • replacement in pijul/src/commands/record.rs at line 222
    [7.387][5.2518:2609](),[7.387][7.10751:10832]()
    .unwrap_or(pijul_identity::choose_identity_name(!self.no_keyring).await?);
    .unwrap_or(pijul_identity::choose_identity_name(config).await?);
    [7.387]
    [7.462]
    .unwrap_or(pijul_identity::choose_identity_name(config, !self.no_keyring).await?);
  • edit in pijul/src/commands/pushpull.rs at line 312
    [7.8269]
    [3.1464]
    local_config: &mut pijul_config::local::Local,
  • edit in pijul/src/commands/pushpull.rs at line 314
    [7.8269][7.11798:11865](),[7.8269][7.11798:11865]()
    local_config: &mut pijul_config::local::Local,
  • resolve order conflict in pijul/src/commands/pushpull.rs at line 314
    [3.1505]
    [7.8354]
  • replacement in pijul/src/commands/identity.rs at line 275
    [5.3099][5.3099:3166]()
    .create(!options.no_link, !options.no_keyring)
    [5.3099]
    [5.3166]
    .create(config, !options.no_link, !options.no_keyring)
  • edit in pijul/src/commands/identity.rs at line 277
    [7.49307][7.13749:13815]()
    identity.create(config, !options.no_link).await?;
  • resolve order conflict in pijul/src/commands/identity.rs at line 277
    [5.3195]
    [7.1971]
  • replacement in pijul/src/commands/identity.rs at line 278
    [7.1972][5.3196:3326]()
    if let Err(_) =
    remote::prove(&identity, None, self.no_cert_check, !options.no_keyring).await
    [7.1972]
    [5.3326]
    if let Err(_) = remote::prove(
    config,
    &identity,
    None,
    self.no_cert_check,
    !options.no_keyring,
    )
    .await
  • edit in pijul/src/commands/identity.rs at line 287
    [7.1972][7.13816:13915]()
    if let Err(_) = remote::prove(config, &identity, None, self.no_cert_check).await {
  • resolve order conflict in pijul/src/commands/identity.rs at line 287
    [5.3344]
    [7.4055]
  • replacement in pijul/src/commands/identity.rs at line 295
    [7.49398][5.3345:3430](),[7.49398][7.13916:13981]()
    SubCommand::Repair { no_keyring } => fix_identities(!no_keyring).await?,
    SubCommand::Repair => fix_identities(config).await?,
    [7.49398]
    [7.49480]
    SubCommand::Repair { no_keyring } => fix_identities(config, !no_keyring).await?,
  • edit in pijul/src/commands/identity.rs at line 302
    [5.3496][5.3496:3584](),[7.49589][7.13982:14081]()
    &identity_name.unwrap_or(choose_identity_name(!no_keyring).await?);
    let identity_name = &identity_name.unwrap_or(choose_identity_name(config).await?);
  • resolve order conflict in pijul/src/commands/identity.rs at line 302
    [5.3496]
  • edit in pijul/src/commands/identity.rs at line 302
    [0.2994]
    [7.2656]
    &identity_name.unwrap_or(choose_identity_name(config, !no_keyring).await?);
  • edit in pijul/src/commands/identity.rs at line 305
    [5.3616]
    [5.3616]
    config,
  • edit in pijul/src/commands/identity.rs at line 312
    [7.2726][7.14082:14301]()
    remote::prove(
    config,
    &loaded_identity,
    server.as_deref(),
    self.no_cert_check,
    )
    .await?;
  • resolve order conflict in pijul/src/commands/identity.rs at line 312
    [5.3809]
    [7.49763]
  • replacement in pijul/src/commands/identity.rs at line 426
    [7.54509][5.3810:3879](),[7.54509][7.14302:14358]()
    choose_identity_name(!options.no_keyring).await?
    choose_identity_name(config).await?
    [7.54509]
    [7.54576]
    choose_identity_name(config, !options.no_keyring).await?
  • edit in pijul/src/commands/identity.rs at line 448
    [5.3921]
    [5.3921]
    config,
  • edit in pijul/src/commands/identity.rs at line 453
    [7.1054][7.14388:14487]()
    .prompt_changes(config, Some(old_identity.name.clone()), !options.no_link)
  • resolve order conflict in pijul/src/commands/identity.rs at line 453
    [5.4103]
    [7.1138]
  • edit in pijul/src/commands/identity.rs at line 466
    [5.4162]
    [5.4162]
    config,
  • edit in pijul/src/commands/identity.rs at line 473
    [7.3303][7.14488:14586](),[7.3303][7.14488:14586]()
    remote::prove(config, &new_identity, None, self.no_cert_check).await;
  • resolve order conflict in pijul/src/commands/identity.rs at line 473
    [5.4394]
    [7.3393]
  • resurrect zombie in pijul/src/commands/identity.rs at line 498
    [7.176][5.4424:4471](),[7.176][5.4424:4471]()
    let identity = Complete::load(
  • replacement in pijul/src/commands/identity.rs at line 499
    [5.4471][5.4471:4559](),[5.4471][5.4471:4559]()
    &identity_name.unwrap_or(choose_identity_name(!no_keyring).await?),
    [5.4471]
    [5.4559]
    &identity_name.unwrap_or(choose_identity_name(config, !no_keyring).await?),
  • edit in pijul/src/commands/identity.rs at line 501
    [7.1375][7.14587:14687](),[7.1375][7.14587:14687]()
    Complete::load(&identity_name.unwrap_or(choose_identity_name(config).await?))?;
  • resurrect zombie in pijul/src/commands/identity.rs at line 501
    [7.14687][6.1954:2021](),[7.14687][6.1954:2021](),[6.2021][7.14736:14766](),[7.14736][7.14736:14766](),[7.14736][7.14736:14766]()
    let path = pijul_config::global_config_directory()
    .unwrap()
  • resolve order conflict in pijul/src/commands/identity.rs at line 501
    [5.4579]
    [6.1954]
  • edit in Cargo.lock at line 115
    [33.3302]
    [33.3302]
    [[package]]
    name = "atomic"
    version = "0.6.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340"
    dependencies = [
    "bytemuck",
    ]
  • edit in Cargo.lock at line 286
    [2.196]
    [33.7536]
    [[package]]
    name = "bytemuck"
    version = "1.24.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4"
  • edit in Cargo.lock at line 900
    [4.1200]
    [33.21860]
    [[package]]
    name = "figment"
    version = "0.10.19"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3"
    dependencies = [
    "atomic",
    "serde",
    "toml 0.8.23",
    "uncased",
    "version_check",
    ]
  • edit in Cargo.lock at line 2251
    [33.57752]
    [33.57752]
    "figment",
  • edit in Cargo.lock at line 2292
    [33.58287]
    [33.58287]
    "figment",
    "libpijul",
  • edit in Cargo.lock at line 3506
    [33.85478]
    [33.85478]
    [[package]]
    name = "uncased"
    version = "0.9.10"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697"
    dependencies = [
    "version_check",
    ]