Skip to content

fix: use /bin/cp on macos#9656

Merged
jdx merged 1 commit intojdx:mainfrom
pdehlke:fix_macos_cp
May 6, 2026
Merged

fix: use /bin/cp on macos#9656
jdx merged 1 commit intojdx:mainfrom
pdehlke:fix_macos_cp

Conversation

@pdehlke
Copy link
Copy Markdown
Contributor

@pdehlke pdehlke commented May 6, 2026

When running mise sync on MacOS, mise execs cp -cR. On macs where the user has installed gnu cp (usually as part of homebrew) and prepends the gnu utils in $PATH, this fails, as gnu cp lacks the -c option:

❯ mise sync python --uv
Synced python@3.15 from uv to mise
Synced python@3.15.0a7 from uv to mise
cp: invalid option -- 'c'
Try 'cp --help' for more information.
mise ERROR command ["cp", "-cR", "/Users/pde/.local/share/mise/installs/python/3.14.3", "/Users/pde/.local/share/uv/python/cpython-3.14.3-macos-aarch64-none"] exited with code 1
mise ERROR Run with --verbose or MISE_VERBOSE=1 for more information

We fix that here by hard coding /bin/cp

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 6, 2026

Greptile Summary

This PR fixes a one-line bug in clone_dir where macOS users with GNU coreutils (e.g. from Homebrew) prepended to $PATH would see cp: invalid option -- 'c' because GNU cp does not support the -c (APFS clone) flag. The fix hard-codes /bin/cp, which is the standard macOS system binary protected by SIP, bypassing any user PATH overrides.

  • Replaces cmd!(\"cp\", ...) with cmd!(\"/bin/cp\", ...) inside the cfg!(macos) branch of clone_dir in src/file.rs.
  • cfg!(macos) is a project-level cfg alias for target_os = \"macos\" (defined in build.rs), so the conditional compiles and targets correctly.

Confidence Score: 4/5

The change is minimal and correct for the standard macOS case; the only caveat is that /bin/cp is assumed to always exist, which may not hold in containers or non-standard macOS environments.

The fix directly addresses the reported failure mode and follows macOS convention. The small concern is that hard-coding /bin/cp silently assumes the path is present, which could produce an opaque error in non-standard macOS environments such as Docker containers or restricted CI images.

No files require special attention beyond the single changed line in src/file.rs.

Comments Outside Diff (1)

  1. src/file.rs, line 1219 (link)

    P2 Hard-coded path may fail in non-standard macOS environments

    /bin/cp is protected by SIP on standard macOS installs and this is the conventional way to bypass Homebrew PATH overrides, so the fix works for the reported case. However, in sandboxed environments (e.g. macOS Docker containers, Nix/sandbox builds, or CI images that remap /bin) the path may not exist, producing a less helpful error than the current one. Consider wrapping the command execution in a fallback or documenting the assumption that /bin/cp is always present. Alternatively, the cp -c semantics (APFS cloning) could be replicated with std::fs::copy plus a reflink fallback, removing the external-process dependency entirely.

Reviews (1): Last reviewed commit: "Use /bin/cp on macos" | Re-trigger Greptile

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the clone_dir function in src/file.rs to use the absolute path /bin/cp on macOS, ensuring the system version is used to avoid compatibility issues with the -c flag. Feedback suggests correcting the configuration check from cfg!(macos) to cfg!(target_os = "macos") for better portability and consistency with standard Rust practices.

I am having trouble creating individual review comments. Click here to see my feedback.

src/file.rs (1219)

medium

Using the absolute path /bin/cp is an appropriate fix to ensure the system version of cp is used, avoiding conflicts with GNU cp which does not support the macOS-specific -c (clonefile) flag.

However, please note that the condition if cfg!(macos) on line 1218 is inconsistent with the rest of the file (e.g., line 323 uses target_os = "macos"). In standard Rust, macos is not a built-in configuration flag; the correct one is target_os = "macos". While this appears to be working in your current environment (possibly due to a custom configuration), it is recommended to update line 1218 to if cfg!(target_os = "macos") for better portability and consistency.

@jdx jdx merged commit 1c86c5b into jdx:main May 6, 2026
33 of 35 checks passed
mise-en-dev added a commit that referenced this pull request May 7, 2026
### 🚀 Features

- **(aqua)** support registry libc variants by @jdx in
[#9652](#9652)
- **(bin-paths)** add executable names output by @risu729 in
[#9617](#9617)

### 🐛 Bug Fixes

- **(aqua)** preserve configured file extensions by @risu729 in
[#9611](#9611)
- **(aqua)** support registry file links by @risu729 in
[#9610](#9610)
- **(backend)** reject bare package backend names by @risu729 in
[#9608](#9608)
- **(backend)** apply inline tool option overrides by @risu729 in
[#9306](#9306)
- **(backend)** skip versions host for local tool opts by @risu729 in
[#9568](#9568)
- **(github)** chmod explicit archive bin by @risu729 in
[#9609](#9609)
- **(install)** skip remote-versions refresh in prefer-offline mode by
@jdx in [#9627](#9627)
- **(lock)** scope targets to active project root by @risu729 in
[#9319](#9319)
- **(lockfile)** respect existing platforms during auto-lock by @jdx in
[#9621](#9621)
- **(pipx)** filter yanked pypi releases by @risu729 in
[#9607](#9607)
- **(pipx)** declare python as a backend dependency by @jdx in
[#9678](#9678)
- **(schema)** update refs to $defs in mise-registry-tool.json by
@risu729 in [#9671](#9671)
- **(task)** terminate parallel siblings on failure via process groups
by @jdx in [#9655](#9655)
- **(task)** stable MISE_PROJECT_ROOT for monorepo tasks, add
MISE_MONOREPO_ROOT by @jdx in
[#9657](#9657)
- **(trust)** run enter hooks after trusting config by @risu729 in
[#9634](#9634)
- **(ui)** stop clearing screen for prompts by @jdx in
[#9619](#9619)
- use /bin/cp on macos by @pdehlke in
[#9656](#9656)

### 🚜 Refactor

- **(aqua)** store aqua var defaults as strings by @risu729 in
[#9645](#9645)
- **(config)** support structured TOML values in registry backend
options by @risu729 in [#9584](#9584)
- **(deps)** remove serde_derive dependency by @risu729 in
[#9670](#9670)
- **(deps)** remove anyhow dependency by @risu729 in
[#9661](#9661)
- **(deps)** use std::sync::LazyLock instead of once_cell::Lazy by
@risu729 in [#9668](#9668)
- **(schema)** generate task schema from mise schema by @risu729 in
[#9581](#9581)
- **(schema)** reuse task props with unevaluatedProperties by @risu729
in [#9582](#9582)
- **(schema)** reuse registry common types by @risu729 in
[#9648](#9648)
- **(schema)** reuse plugin script config by @risu729 in
[#9647](#9647)
- **(schema)** use $defs in schema files by @risu729 in
[#9646](#9646)

### 📚 Documentation

- **(node)** add tips for enabling node idiomatic by @fu050409 in
[#9675](#9675)

### 🧪 Testing

- **(cli)** remove nondeterministic tool depends assertion by @risu729
in [#9633](#9633)
- **(e2e)** pin uv to 0.11.8 around astral-sh/uv#19278 by @jdx in
[#9618](#9618)
- **(e2e)** wait for docker env cleanup by @risu729 in
[#9631](#9631)
- **(zig)** use official zig instead of mach mirror by @jdx in
[#9659](#9659)

### 📦️ Dependency Updates

- fall through to hash check when providers have no outputs by @jdx in
[#9622](#9622)
- bump Cargo.lock by @jdx in
[#9625](#9625)

### 📦 Registry

- remove registry depends by @risu729 in
[#9571](#9571)
- add code-review-graph (pipx:code-review-graph) by @chautruonglong in
[#9673](#9673)

### Chore

- **(ci)** split large registry test-tool changes by @risu729 in
[#9628](#9628)
- **(ci)** make perf script robust to runner noise by @jdx in
[#9635](#9635)
- **(ci)** skip hyperfine comments without permission by @risu729 in
[#9629](#9629)

### New Contributors

- @chautruonglong made their first contribution in
[#9673](#9673)
- @pdehlke made their first contribution in
[#9656](#9656)

## 📦 Aqua Registry Updates

### New Packages (5)

-
[`anthropics/anthropic-cli`](https://github.com/anthropics/anthropic-cli)
- [`crates.io/wasmi_cli`](https://github.com/wasmi-labs/wasmi)
- [`openclaw/gogcli`](https://github.com/openclaw/gogcli)
- `racket-lang.org/racket-minimal`
- [`runs-on/cli`](https://github.com/runs-on/cli)

### Updated Packages (13)

- [`UpCloudLtd/upcloud-cli`](https://github.com/UpCloudLtd/upcloud-cli)
- [`aristocratos/btop`](https://github.com/aristocratos/btop)
- [`dprint/dprint`](https://github.com/dprint/dprint)
- [`j178/prek`](https://github.com/j178/prek)
- [`jdx/hk`](https://github.com/jdx/hk)
- [`jdx/mise`](https://github.com/jdx/mise)
- [`jdx/usage`](https://github.com/jdx/usage)
- [`jreleaser/jreleaser`](https://github.com/jreleaser/jreleaser)
-
[`jreleaser/jreleaser/standalone`](https://github.com/jreleaser/jreleaser)
- [`pnpm/pnpm`](https://github.com/pnpm/pnpm)
- [`suzuki-shunsuke/cmdx`](https://github.com/suzuki-shunsuke/cmdx)
- [`suzuki-shunsuke/ghir`](https://github.com/suzuki-shunsuke/ghir)
- [`twpayne/chezmoi`](https://github.com/twpayne/chezmoi)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants