{"record":{"id":"e5cce79e35e09cd7","repo":"gitbutlerapp/gitbutler","slug":"this-will-be-replaced-with-gitbutler-s-but-comma","errorCode":null,"errorMessage":"This will be replaced with GitButler's 'but' command","messagePattern":"This will be replaced with GitButler's 'but' command","errorType":"console","errorClass":null,"httpStatus":null,"severity":"info","filePath":"crates/but-installer/src/install_macos.rs","lineNumber":156,"sourceCode":"        ));\n    } else if but_symlink.is_symlink() {\n        let existing_target = fs::read_link(&but_symlink)?;\n        let existing_target_str = existing_target.to_string_lossy();\n\n        // Detect channel switching\n        let previous_channel = if existing_target_str.contains(\"Nightly\") {\n            Some(Channel::Nightly)\n        } else if existing_target_str.contains(\"/GitButler.app/\") {\n            Some(Channel::Release)\n        } else {\n            None\n        };\n\n        if previous_channel.is_none() {\n            warn(&format!(\n                \"Found existing 'but' symlink pointing to: {existing_target_str}\"\n            ));\n            warn(\"This will be replaced with GitButler's 'but' command\");\n            info(\n                \"Note: Your custom symlink setup will be overwritten. The original target is not a GitButler installation.\",\n            );\n        }\n    }\n\n    // Create temporary symlink to test the new installation\n    let new_app_macos_dir = install_app_new.join(\"Contents/MacOS/gitbutler-tauri\");\n    let _ = fs::remove_file(&but_new);\n\n    unix_fs::symlink(&new_app_macos_dir, &but_new)?;\n\n    // Verify the new installation works\n    let verify_status = Command::new(&but_new)\n        .arg(\"--version\")\n        .stdout(Stdio::null())\n        .stderr(Stdio::null())\n        .status();","sourceCodeStart":138,"sourceCodeEnd":174,"githubUrl":"https://github.com/gitbutlerapp/gitbutler/blob/58e5313667b857ef39a730e380af31816a7b1768/crates/but-installer/src/install_macos.rs#L138-L174","documentation":"Companion warning emitted by install_app in the same previous_channel.is_none() branch of install_macos.rs. It tells the user that GitButler will replace the existing non-GitButler 'but' symlink with its own command. It is purely informational and always follows the 'Found existing ... symlink' warning.","triggerScenarios":"Same as error 910: running download_and_install_app -> install_app on macOS when a 'but' symlink exists whose target is not a GitButler channel installation.","commonSituations":"First-time GitButler installs on machines that already used the name 'but' for another CLI; users upgrading from a manual install who no longer remember what the symlink pointed to.","solutions":["Allow the replacement if the symlink is stale or no longer needed.","Back up the current symlink (`ln -s $(readlink /usr/local/bin/but) ~/but-backup`) if you still need the old target.","Choose a custom install location to avoid clobbering the existing symlink."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Same pre-check as 910; accept replacement only if target is stale/unneeded.\nconst target = fs.existsSync('/usr/local/bin/but') ? fs.readlinkSync('/usr/local/bin/but') : null;\nconsole.log(target ? `installer will replace -> ${target}` : 'no existing symlink');","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Audit your PATH for commands named 'but' before installing GitButler.","Preserve the old target explicitly if you still need it; the replacement is unconditional.","Prefer unique binary names for personal scripts to avoid name collisions."],"tags":["symlink","installer","macos","cli-conflict"],"backgroundTag":"file-already-exists","analyzedSha":"58e5313667b857ef39a730e380af31816a7b1768","analyzedAt":"2026-09-18T06:50:32.052Z","contentChangedAt":"2026-09-18T06:50:32.052Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}