Skip to content

Rename cpx → copy, flatten the CLI, and add Nix/AUR/Guix packaging#1

Merged
UnbreakableMJ merged 3 commits into
mainfrom
rename-cpx-to-copy
Jun 16, 2026
Merged

Rename cpx → copy, flatten the CLI, and add Nix/AUR/Guix packaging#1
UnbreakableMJ merged 3 commits into
mainfrom
rename-cpx-to-copy

Conversation

@UnbreakableMJ

@UnbreakableMJ UnbreakableMJ commented Jun 16, 2026

Copy link
Copy Markdown
Owner

Summary

Rebrands the tool cpx → copy, flattens the CLI, and adds first-party Nix / AUR / Guix packaging. Two commits:

1. Rename cpxcopy and flatten the CLI (14d054a)

  • copy <src> <dst> is now the root command; config is the only subcommand (copy config show). The old explicit copy subcommand and the argv-injection hack are gone.
  • Because the copy sources positional is a greedy variadic that would swallow config show, parse() intercepts a leading config and routes it through a dedicated parser; the command field stays on CLIArgs so --help still lists config. (A source literally named config as the first arg must be written ./config.)
  • Full rename: Cargo package + explicit [[bin]] name = "copy", library crate copy::, CpxError/CpxResultCliError/CliResult, config paths (~/.config/copy/copyconfig.toml, /etc/copy/...), install.sh, bench.sh, release.yml, docs, and the GNU test scripts (cpx-*.shcopy-*.sh).
  • Dropped the obsolete copy copy ... integration test; fixed a pre-existing clippy lint.

2. Add Nix flake, AUR PKGBUILD, and Guix package (808f26d)

  • Nix: flake.nix + nix/package.nix (single callPackage derivation shared by packages.default and overlays.default, built from local src with cargoLock.lockFile = ./Cargo.lock), plus apps.default and a devShell.
  • AUR: packaging/aur/PKGBUILD (+ .SRCINFO), build-from-source with cargo --frozen.
  • Guix: guix.scm builds offline against a locally vendored guix/vendor dir (cargo vendor guix/vendor first; gitignored).
  • README install sections rewritten to first-party usage; .gitignore and CLAUDE.md updated. No crates.io anywhere.

Verification

  • cargo fmt --check, cargo clippy --all-targets -D warnings, cargo testall green (67 unit + 65 integration).
  • Manual CLI smoke: single/recursive/multi copy, config init|show|path, ./config-as-file, --version, --help.
  • Nix (live): nix buildresult/bin/copy --version = copy 0.1.4, nix run, nix develop, nix flake check all pass.
  • AUR PKGBUILD: bash -n clean (full makepkg not run — needs an Arch host + published tag).
  • Guix: Scheme syntax validated (no guix available to build end-to-end; needs rustc ≥ 1.85).

Follow-ups (out of scope, external)

  • Rename the GitHub repo cpxcopy, publish the v0.1.4 tag (fills the AUR sha256sums), and upload to AUR / nixpkgs as desired.

🤖 Generated with Claude Code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added Linux packaging via Nix flakes (including dev shell) and Guix package definitions.
    • Added Arch Linux AUR package support.
  • Bug Fixes

    • Fixed CLI argument parsing for config show so it no longer gets mistaken for a source/positional.
  • Documentation

    • Rebranded docs, examples, configuration guides, and benchmark reports to use copy.
    • Added repository usage/architecture documentation.
  • Chores

    • Renamed project references from CPX to Copy across binaries, installer, config (copyconfig.toml), and tests.

UnbreakableMJ and others added 2 commits June 16, 2026 10:00
Rebrand the tool from cpx to copy, and make copy the root command
(`copy <src> <dst>`) with `config` as the only subcommand — removing the
former explicit `copy` subcommand and the argv-injection hack.

- Cargo package + explicit [[bin]] name = "copy"; library crate `copy::`
- CpxError/CpxResult -> CliError/CliResult (CopyError is the domain error)
- Flatten CopyArgs into CLIArgs. Intercept a leading `config` argument and
  route it through a dedicated parser so the greedy `sources` variadic
  cannot swallow `config <sub>`; keep the subcommand field so `--help`
  still lists `config`. A source literally named `config` as the first arg
  must be written `./config`.
- Rebrand config paths: ~/.config/copy/copyconfig.toml, /etc/copy/copyconfig.toml
  (also fixes the pre-existing /etc/cpx/config.toml inconsistency)
- Update install.sh, benchmarks/bench.sh, release.yml, docs, and CLAUDE.md;
  rename GNU test scripts cpx-*.sh -> copy-*.sh
- Drop the obsolete `copy copy ...` integration test; fix a pre-existing
  clippy lint in preprocess.rs

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
First-party packaging for `copy`, all building from this source tree (no
crates.io).

- Nix (flake): flake.nix + nix/package.nix (a single callPackage derivation
  shared by packages.default and overlays.default, built from a filtered
  local src with cargoLock.lockFile = ./Cargo.lock); apps.default for
  `nix run` and a devShell with the Rust toolchain. Verified: nix build,
  nix run, nix develop, nix flake check.
- AUR: packaging/aur/PKGBUILD (+ .SRCINFO), pkgname `copy`, build-from-source
  with cargo --frozen and the committed lockfile; sha256sums=SKIP until the
  v0.1.4 tag is published.
- Guix: guix.scm builds offline against a locally vendored guix/vendor dir
  (run `cargo vendor guix/vendor` first; gitignored). Needs rustc >= 1.85.
- Wire-up: .gitignore (result, result-*, guix/vendor); README/README_CRATES
  install sections rewritten to first-party Nix/AUR/Guix usage; CLAUDE.md
  packaging note.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a888f444-79bf-463a-8e62-5fe09f2386a3

📥 Commits

Reviewing files that changed from the base of the PR and between 808f26d and a32a819.

📒 Files selected for processing (3)
  • benchmarks/bench.sh
  • src/config/config_command.rs
  • tests/gnu/capability.sh
🚧 Files skipped from review as they are similar to previous changes (3)
  • tests/gnu/capability.sh
  • src/config/config_command.rs
  • benchmarks/bench.sh

📝 Walkthrough

Walkthrough

The project is renamed from cpx to copy across the entire repository. This includes updating the Rust package name and binary target in Cargo.toml, renaming the top-level error type from CpxError to CliError, restructuring the CLI argument model to flatten CopyArgs directly onto CLIArgs, updating config file paths, overhauling packaging (Nix, Guix, AUR, install script, CI release assets), and doing a mechanical find-replace across all tests, documentation, and benchmark files.

Changes

cpx → copy project rename

Layer / File(s) Summary
Error type rename and Cargo manifest update
Cargo.toml, src/error.rs
Renames package from cpx to copy with an explicit [[bin]] target; renames CpxError/CpxResult to CliError/CliResult with updated Display, Error::source, and From<...> impls.
CLI argument model restructure
src/cli/args.rs
Removes CopyArgs struct and Commands::Copy(CopyArgs) variant; flattens copy option fields onto CLIArgs with command: Option<Commands>. Introduces ConfigInvocation to separate config routing. Updates parse(), validate(), and all helper signatures. Four unit tests rebuilt to construct CLIArgs directly.
main.rs wiring and config path updates
src/main.rs, src/config/config_command.rs, src/config/loader.rs, src/utility/preprocess.rs
Switches main.rs imports and error mapping to CliError::Io; updates resume hint text. Config command and loader now resolve copyconfig.toml under copy-scoped directories for project/user/system paths. Sorts CopyPlan.files via sort_by_key(Reverse).
Packaging, installer, and CI release assets
.gitignore, .github/workflows/release.yml, install.sh, nix/package.nix, flake.nix, guix.scm, packaging/aur/PKGBUILD, packaging/aur/.SRCINFO
Release workflow matrix renames artifact/asset names to copy*. Installer targets UnbreakableMJ/copy with install_copy(). New nix/package.nix and flake.nix define reproducible Linux builds. New guix.scm defines an offline vendored build. New AUR PKGBUILD/.SRCINFO for Arch packaging. .gitignore adds /target, /result*, /guix/vendor.
Integration and GNU compatibility tests
tests/intergration.rs, tests/gnu/*.sh
All integration test invocations switch from cpx to copy; config path expectations updated to .config/copy/copyconfig.toml. GNU shell tests (abuse, acl, capability, copy-HL, copy-deref, copy-i) updated to locate and invoke copy.
Documentation and benchmarks
README.md, README_CRATES.md, CONTRIBUTING.md, CLAUDE.md, docs/*, benchmarks/*
Mechanical rename of all cpx references to copy across READMEs, configuration/examples docs, benchmark reports, and the benchmark shell script. Adds CLAUDE.md with architecture and CI guidance.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

🐇 From cpx to copy I hop,
A rename that'll never stop —
Each file, each test, each doc and line,
Now bears my new and shinier sign!
copy --resume, off I go! 🌟

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately captures the three main changes: renaming cpx to copy, flattening the CLI structure, and adding packaging support for Nix/AUR/Guix. It is concise, specific, and directly reflects the primary objectives of the changeset.
Docstring Coverage ✅ Passed Docstring coverage is 94.85% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch rename-cpx-to-copy

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
install.sh (1)

39-40: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fix installer/release artifact name mismatch for ARM targets.

detect_platform() returns linux-aarch64-musl and linux-armv7-musl, but the release workflow publishes copy-linux-aarch64.tar.gz and copy-linux-armv7.tar.gz. ARM installs will 404.

Suggested patch
 detect_platform() {
@@
-                aarch64|arm64) echo "linux-aarch64-musl" ;;
-                armv7l) echo "linux-armv7-musl" ;;
+                aarch64|arm64) echo "linux-aarch64" ;;
+                armv7l) echo "linux-armv7" ;;
                 *) error "Unsupported architecture: $arch" ;;
             esac

Also applies to: 75-76

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@install.sh` around lines 39 - 40, The detect_platform() function returns
platform identifiers with the `-musl` suffix (linux-aarch64-musl and
linux-armv7-musl) for ARM targets, but the actual release artifacts are named
without this suffix (copy-linux-aarch64.tar.gz and copy-linux-armv7.tar.gz),
causing 404 errors during ARM installs. Remove the `-musl` suffix from the echo
statements in the aarch64|arm64 and armv7l cases at the indicated locations so
the returned platform strings match the published artifact names exactly.
src/cli/args.rs (1)

472-474: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Inconsistent error messages reference --continue instead of --resume.

Both conflict validation messages use --continue but the actual CLI flag is --resume (defined at line 112).

  • src/cli/args.rs#L472-L474: Change --continue to --resume in symbolic-link conflict message.
  • src/cli/args.rs#L483-L485: Change --continue to --resume in hard-link conflict message.
Proposed fix
@@ -470,13 +470,13 @@ fn validate_conflicts(options: &CopyOptions) -> Result<(), String> {
         if options.hard_link {
             return Err("--symbolic-link and --link cannot be used together".to_string());
         }
         if options.resume {
-            return Err("--symbolic-link and --continue cannot be used together".to_string());
+            return Err("--symbolic-link and --resume cannot be used together".to_string());
         }
         if options.attributes_only {
             return Err(
                 "--symbolic-link and --attributes-only cannot be used together".to_string(),
             );
         }
     }

     if options.hard_link {
         if options.resume {
-            return Err("--link and --continue cannot be used together".to_string());
+            return Err("--link and --resume cannot be used together".to_string());
         }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/cli/args.rs` around lines 472 - 474, The error messages in the
symbolic-link and hard-link conflict validation checks incorrectly reference the
`--continue` flag, but the actual CLI flag is named `--resume` (as defined at
line 112). Update the error string in the symbolic-link conflict check at lines
472-474 to replace `--continue` with `--resume` in the message "--symbolic-link
and --continue cannot be used together". Similarly, update the error string in
the hard-link conflict check at lines 483-485 to replace `--continue` with
`--resume` in the corresponding message for hard-link conflicts. Both changes
ensure error messages accurately reflect the actual flag names available to
users.
🧹 Nitpick comments (6)
README_CRATES.md (1)

130-176: 💤 Low value

Add language specifier to fenced code block.

Line 130 opens a code block without a language tag. Add bash for syntax highlighting and consistency.

-```
+```bash
 copy [OPTIONS] <SOURCE>... <DESTINATION>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README_CRATES.md` around lines 130 - 176, The fenced code block starting at
line 130 in README_CRATES.md is missing a language specifier, which prevents
syntax highlighting and is inconsistent with documentation best practices. Add
the `bash` language identifier to the opening code fence (the triple backticks
before the "copy [OPTIONS]" line) to enable proper syntax highlighting and
maintain consistency with other code blocks in the document.

Source: Linters/SAST tools

README.md (1)

116-162: 💤 Low value

Add language specifier to fenced code block.

Line 116 opens a code block without a language tag. Add bash for syntax highlighting and consistency.

-```
+```bash
 copy [OPTIONS] <SOURCE>... <DESTINATION>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 116 - 162, The fenced code block at line 116 in
README.md is missing a language specifier for syntax highlighting. Add "bash"
immediately after the opening triple backticks (change ``` to ```bash) on the
line that precedes the "copy [OPTIONS]" command documentation to enable proper
syntax highlighting and maintain consistency with other code blocks in the
document.

Source: Linters/SAST tools

CLAUDE.md (1)

43-43: 💤 Low value

Add language specifier to fenced code blocks.

Three fenced code blocks lack language tags, triggering MD040 warnings. All are bash examples and should declare the language for syntax highlighting and consistency.

  • CLAUDE.md#L43-L43: Fenced code block showing main.rs architecture — add bash language tag
  • README.md#L116-L116: Fenced code block showing copy command help — add bash language tag
  • README_CRATES.md#L130-L130: Fenced code block showing copy command help (mirrors README.md) — add bash language tag
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@CLAUDE.md` at line 43, Add language specifiers to three fenced code blocks
that currently lack language tags. In CLAUDE.md at line 43, add `bash` language
tag to the fenced code block showing main.rs architecture. In README.md at line
116, add `bash` language tag to the fenced code block showing the copy command
help. In README_CRATES.md at line 130, add `bash` language tag to the fenced
code block showing the copy command help. Change each opening backtick sequence
from triple backticks (```) to triple backticks followed by the word bash
(```bash).

Source: Linters/SAST tools

benchmarks/benchmarked_xcp.md (1)

17-87: ⚡ Quick win

Add blank lines before and after each table per Markdown linting rules (MD058).

Each of the 10 tables in this file needs a blank line immediately before the table header and immediately after the table content. This is required by markdownlint (MD058) and improves readability.

For example, before line 17 (OpenImageIO section header) and after line 20 (last table row), add blank lines.

🔧 Fix by adding blank lines around tables

Apply this pattern to all 10 tables (lines 17–86):

 ## OpenImageIO
+
 | Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
 |:---|---:|---:|---:|---:|
 | `/home/happy/copy/copy -r -j=16 /home/happy/copy_multi_bench/repos/OpenImageIO /home/happy/copy_multi_bench/dest_copy` | 122.7 ± 5.1 | 119.0 | 132.9 | 1.04 ± 0.04 |
 | `/home/happy/.cargo/bin/xcp -r /home/happy/copy_multi_bench/repos/OpenImageIO /home/happy/copy_multi_bench/dest_cp` | 118.5 ± 0.8 | 117.1 | 119.3 | 1.00 |
+
 ## chromium

Repeat for all 10 section headers (OpenImageIO, chromium, kubernetes, node, openexr, linux, vscode, go, rust, godot, tensorflow, Full Dataset).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@benchmarks/benchmarked_xcp.md` around lines 17 - 87, The markdown file
requires blank lines before and after each table to comply with MD058 linting
rules. For all 10 tables in the file (covering the sections: OpenImageIO,
chromium, kubernetes, node, openexr, linux, vscode, go, rust, godot, tensorflow,
and Full Dataset), add a blank line immediately before each table header and
immediately after the final row of each table. This improves both linting
compliance and readability without modifying any table content or section
headers.

Source: Linters/SAST tools

docs/benchmarks.md (1)

21-70: ⚡ Quick win

Add blank lines before and after tables per Markdown linting rules (MD058).

The three tables (cp, rsync, and per-repository results) each need a blank line immediately before the table header and immediately after the final row.

🔧 Fix by adding blank lines around tables
 cp:
+
 | Tool | Mean Time | Speedup |
 |------|-----------|---------|
 | copy | **28.72s ± 1.46s** | **2.81× faster** |
 | cp | 80.56s ± 2.79s | baseline |
+
 **Time Saved:** 51.84 seconds

Apply the same pattern to the rsync table (around line 29) and the per-repository tables (around lines 42 and 57).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/benchmarks.md` around lines 21 - 70, Add blank lines before and after
each of the three tables in the document to comply with Markdown linting rule
MD058. Insert a blank line immediately before each table header row (the rows
starting with "| Tool |" for the cp and rsync summary tables, and "| Repository
|" for the per-repository result tables), and insert a blank line immediately
after the final data row of each table. This includes adding blank lines before
the cp table header, after the cp baseline row, before the rsync table header,
after the rsync baseline row, before the per-repository cp table header, after
the OpenEXR row in the per-repository cp table, before the per-repository rsync
table header, and after the OpenEXR row in the per-repository rsync table.

Source: Linters/SAST tools

tests/intergration.rs (1)

1301-1317: ⚡ Quick win

Add coverage for a literal first source named config.

Line 1301 currently verifies implicit root copy, but it doesn’t cover the parser edge case where the first positional is literally config. Add a regression test asserting copy ./config <dst> is treated as a file copy (not config subcommand parsing).

As per coding guidelines, “Special-case a leading 'config' argument in CLIArgs::parse() to route through ConfigInvocation parser.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/intergration.rs` around lines 1301 - 1317, Add a regression test to
verify the parser edge case where a file literally named "config" is passed as
the first source argument. Create a new test function (or extend
test_implicit_copy_command) that writes a file named "config" to the temp
directory and asserts that the command copy ./config <dst> successfully copies
the file content (treating it as a file path, not as a config subcommand
invocation). This ensures the special-case handling in CLIArgs::parse()
correctly routes the literal "config" argument through ConfigInvocation parser
and doesn't interfere with actual file copying operations.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@benchmarks/bench.sh`:
- Line 93: The echo statement that provides the fallback installation hint
references an incorrect package name. Change the package name from `copy-cli` to
`copy` in the echo statement to match the actual package name defined in
Cargo.toml, ensuring users receive the correct installation command when
following the hint.

In `@src/config/config_command.rs`:
- Around line 172-173: The documentation URL in the header string of the
config_command.rs file is malformed. The GitHub URL at the comment section needs
to be corrected to include the proper blob path format required by GitHub.
Replace the incorrect path
`https://github.com/UnbreakableMJ/copy/docs/configuration.md` with the correct
format that includes `/blob/main/` (or the appropriate branch name) between the
repository name and the file path so the documentation link works properly.

In `@tests/gnu/capability.sh`:
- Line 14: The precondition check for the COPY binary in the capability.sh test
script currently exits with status code 0 when the binary is not found, which
reports a pass instead of a skip to GNU-style test runners. Change the exit code
from 0 to 77 in the conditional block that checks if the COPY binary is
executable, so that missing dependencies properly signal a skip status rather
than a successful test run.

---

Outside diff comments:
In `@install.sh`:
- Around line 39-40: The detect_platform() function returns platform identifiers
with the `-musl` suffix (linux-aarch64-musl and linux-armv7-musl) for ARM
targets, but the actual release artifacts are named without this suffix
(copy-linux-aarch64.tar.gz and copy-linux-armv7.tar.gz), causing 404 errors
during ARM installs. Remove the `-musl` suffix from the echo statements in the
aarch64|arm64 and armv7l cases at the indicated locations so the returned
platform strings match the published artifact names exactly.

In `@src/cli/args.rs`:
- Around line 472-474: The error messages in the symbolic-link and hard-link
conflict validation checks incorrectly reference the `--continue` flag, but the
actual CLI flag is named `--resume` (as defined at line 112). Update the error
string in the symbolic-link conflict check at lines 472-474 to replace
`--continue` with `--resume` in the message "--symbolic-link and --continue
cannot be used together". Similarly, update the error string in the hard-link
conflict check at lines 483-485 to replace `--continue` with `--resume` in the
corresponding message for hard-link conflicts. Both changes ensure error
messages accurately reflect the actual flag names available to users.

---

Nitpick comments:
In `@benchmarks/benchmarked_xcp.md`:
- Around line 17-87: The markdown file requires blank lines before and after
each table to comply with MD058 linting rules. For all 10 tables in the file
(covering the sections: OpenImageIO, chromium, kubernetes, node, openexr, linux,
vscode, go, rust, godot, tensorflow, and Full Dataset), add a blank line
immediately before each table header and immediately after the final row of each
table. This improves both linting compliance and readability without modifying
any table content or section headers.

In `@CLAUDE.md`:
- Line 43: Add language specifiers to three fenced code blocks that currently
lack language tags. In CLAUDE.md at line 43, add `bash` language tag to the
fenced code block showing main.rs architecture. In README.md at line 116, add
`bash` language tag to the fenced code block showing the copy command help. In
README_CRATES.md at line 130, add `bash` language tag to the fenced code block
showing the copy command help. Change each opening backtick sequence from triple
backticks (```) to triple backticks followed by the word bash (```bash).

In `@docs/benchmarks.md`:
- Around line 21-70: Add blank lines before and after each of the three tables
in the document to comply with Markdown linting rule MD058. Insert a blank line
immediately before each table header row (the rows starting with "| Tool |" for
the cp and rsync summary tables, and "| Repository |" for the per-repository
result tables), and insert a blank line immediately after the final data row of
each table. This includes adding blank lines before the cp table header, after
the cp baseline row, before the rsync table header, after the rsync baseline
row, before the per-repository cp table header, after the OpenEXR row in the
per-repository cp table, before the per-repository rsync table header, and after
the OpenEXR row in the per-repository rsync table.

In `@README_CRATES.md`:
- Around line 130-176: The fenced code block starting at line 130 in
README_CRATES.md is missing a language specifier, which prevents syntax
highlighting and is inconsistent with documentation best practices. Add the
`bash` language identifier to the opening code fence (the triple backticks
before the "copy [OPTIONS]" line) to enable proper syntax highlighting and
maintain consistency with other code blocks in the document.

In `@README.md`:
- Around line 116-162: The fenced code block at line 116 in README.md is missing
a language specifier for syntax highlighting. Add "bash" immediately after the
opening triple backticks (change ``` to ```bash) on the line that precedes the
"copy [OPTIONS]" command documentation to enable proper syntax highlighting and
maintain consistency with other code blocks in the document.

In `@tests/intergration.rs`:
- Around line 1301-1317: Add a regression test to verify the parser edge case
where a file literally named "config" is passed as the first source argument.
Create a new test function (or extend test_implicit_copy_command) that writes a
file named "config" to the temp directory and asserts that the command copy
./config <dst> successfully copies the file content (treating it as a file path,
not as a config subcommand invocation). This ensures the special-case handling
in CLIArgs::parse() correctly routes the literal "config" argument through
ConfigInvocation parser and doesn't interfere with actual file copying
operations.
🪄 Autofix (Beta)

✅ Autofix completed


ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b916ec9d-29ef-4963-8a38-d01a9892f0c1

📥 Commits

Reviewing files that changed from the base of the PR and between 6ddb322 and 808f26d.

⛔ Files ignored due to path filters (2)
  • Cargo.lock is excluded by !**/*.lock
  • flake.lock is excluded by !**/*.lock
📒 Files selected for processing (34)
  • .github/workflows/release.yml
  • .gitignore
  • CLAUDE.md
  • CONTRIBUTING.md
  • Cargo.toml
  • README.md
  • README_CRATES.md
  • benchmarks/bench.sh
  • benchmarks/benchmark_single_thread.md
  • benchmarks/benchmarked.md
  • benchmarks/benchmarked_rsync.md
  • benchmarks/benchmarked_xcp.md
  • docs/benchmarks.md
  • docs/configuration.md
  • docs/examples.md
  • flake.nix
  • guix.scm
  • install.sh
  • nix/package.nix
  • packaging/aur/.SRCINFO
  • packaging/aur/PKGBUILD
  • src/cli/args.rs
  • src/config/config_command.rs
  • src/config/loader.rs
  • src/error.rs
  • src/main.rs
  • src/utility/preprocess.rs
  • tests/gnu/abuse.sh
  • tests/gnu/acl.sh
  • tests/gnu/capability.sh
  • tests/gnu/copy-HL.sh
  • tests/gnu/copy-deref.sh
  • tests/gnu/copy-i.sh
  • tests/intergration.rs

Comment thread benchmarks/bench.sh Outdated
Comment thread src/config/config_command.rs Outdated
Comment thread tests/gnu/capability.sh Outdated
@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Fixes Applied Successfully

Fixed 3 file(s) based on 3 unresolved review comments.

Files modified:

  • benchmarks/bench.sh
  • src/config/config_command.rs
  • tests/gnu/capability.sh

Commit: a32a8197bf6e22d9a37b0ed1dfb0a3906c6eedb2

The changes have been pushed to the rename-cpx-to-copy branch.

Time taken: 2m 29s

Fixed 3 file(s) based on 3 unresolved review comments.

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
@UnbreakableMJ UnbreakableMJ merged commit 558a034 into main Jun 16, 2026
2 checks passed
@UnbreakableMJ UnbreakableMJ deleted the rename-cpx-to-copy branch June 16, 2026 13:20
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.

1 participant