Added REAPER to FMA - #46428
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #46428 +/- ##
==========================================
+ Coverage 66.90% 66.91% +0.01%
==========================================
Files 2834 2837 +3
Lines 224862 225011 +149
Branches 11512 11614 +102
==========================================
+ Hits 150435 150562 +127
- Misses 60772 60785 +13
- Partials 13655 13664 +9
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
WalkthroughThis PR integrates REAPER, a macOS application, into Fleet's maintained apps system. It defines Homebrew input metadata, registers REAPER in the app registry, creates a Darwin-specific installation manifest with embedded bash scripts for DMG-based installation and uninstall with GUI session awareness, and adds a corresponding frontend SVG icon component registered in the software icon map. Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 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 `@ee/maintained-apps/outputs/reaper/darwin.json`:
- Line 19: The install script currently moves existing REAPER.app to a backup
(TMPDIR/REAPER.app.bkp) then blindly copies the new bundle and leaves the app
missing on copy failure; update the replacement logic around the sudo mv and
sudo cp -R calls to (1) introduce a backup_path variable (e.g.,
backup_path="$TMPDIR/REAPER.app.bkp"), (2) move APPDIR/REAPER.app to that
backup_path if present, (3) attempt sudo cp -R "$TMPDIR/REAPER.app" "$APPDIR"
and if that cp fails immediately restore the backup by moving backup_path back
to "$APPDIR/REAPER.app" and exit non-zero, and (4) on successful copy remove the
backup; also consider enabling strict failure handling (set -euo pipefail) at
the top of the script to fail fast.
In `@frontend/pages/SoftwarePage/components/icons/Reaper.tsx`:
- Around line 5-12: The SVG lacks a viewBox so changing the root size via props
can crop the inner 32×32 <image>; update the Reaper component's root <svg>
element to include viewBox="0 0 32 32" before spreading {...props} (i.e. set
viewBox on the <svg> in the Reaper function so scaling works while still
allowing width/height to be overridden by props).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: b6e24a81-3b7c-4152-8147-a8e6fd5b0566
⛔ Files ignored due to path filters (1)
website/assets/images/app-icon-reaper-60x60@2x.pngis excluded by!**/*.png
📒 Files selected for processing (5)
ee/maintained-apps/inputs/homebrew/reaper.jsonee/maintained-apps/outputs/apps.jsonee/maintained-apps/outputs/reaper/darwin.jsonfrontend/pages/SoftwarePage/components/icons/Reaper.tsxfrontend/pages/SoftwarePage/components/icons/index.ts
| } | ||
| ], | ||
| "refs": { | ||
| "4c045ce8": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_and_track_application 'com.cockos.reaper'\nif [ -d \"$APPDIR/REAPER.app\" ]; then\n\tsudo mv \"$APPDIR/REAPER.app\" \"$TMPDIR/REAPER.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/REAPER.app\" \"$APPDIR\"\nrelaunch_application 'com.cockos.reaper'\n", |
There was a problem hiding this comment.
Restore the existing app if the replacement copy fails.
The install script moves /Applications/REAPER.app to a backup and then copies the new bundle into place without any rollback. If that copy fails, the machine is left with no app in /Applications, which turns a transient install error into a broken state. Guard the replace step with fail-fast error handling and restore the backup on failure.
Suggested hardening
set -euo pipefail
backup_path="$TMPDIR/REAPER.app.bkp"
if [ -d "$APPDIR/REAPER.app" ]; then
sudo mv "$APPDIR/REAPER.app" "$backup_path"
fi
if ! sudo cp -R "$TMPDIR/REAPER.app" "$APPDIR"; then
if [ -d "$backup_path" ]; then
sudo mv "$backup_path" "$APPDIR/REAPER.app"
fi
exit 1
fi
if [ -d "$backup_path" ]; then
sudo rm -rf "$backup_path"
fi🤖 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 `@ee/maintained-apps/outputs/reaper/darwin.json` at line 19, The install script
currently moves existing REAPER.app to a backup (TMPDIR/REAPER.app.bkp) then
blindly copies the new bundle and leaves the app missing on copy failure; update
the replacement logic around the sudo mv and sudo cp -R calls to (1) introduce a
backup_path variable (e.g., backup_path="$TMPDIR/REAPER.app.bkp"), (2) move
APPDIR/REAPER.app to that backup_path if present, (3) attempt sudo cp -R
"$TMPDIR/REAPER.app" "$APPDIR" and if that cp fails immediately restore the
backup by moving backup_path back to "$APPDIR/REAPER.app" and exit non-zero, and
(4) on successful copy remove the backup; also consider enabling strict failure
handling (set -euo pipefail) at the top of the script to fail fast.
| const Reaper = (props: SVGProps<SVGSVGElement>) => ( | ||
| <svg xmlns="http://www.w3.org/2000/svg" width={32} height={32} {...props}> | ||
| <image | ||
| width={32} | ||
| height={32} | ||
| href="data:image/png;base64,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" | ||
| /> | ||
| </svg> |
There was a problem hiding this comment.
Add a viewBox before forwarding size props.
...props can override the root SVG size, but the inner <image> stays 32×32. Without a viewBox, any non-32 render size can crop the icon instead of scaling it.
Suggested fix
const Reaper = (props: SVGProps<SVGSVGElement>) => (
- <svg xmlns="http://www.w3.org/2000/svg" width={32} height={32} {...props}>
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ width={32}
+ height={32}
+ viewBox="0 0 32 32"
+ {...props}
+ >🤖 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 `@frontend/pages/SoftwarePage/components/icons/Reaper.tsx` around lines 5 - 12,
The SVG lacks a viewBox so changing the root size via props can crop the inner
32×32 <image>; update the Reaper component's root <svg> element to include
viewBox="0 0 32 32" before spreading {...props} (i.e. set viewBox on the <svg>
in the Reaper function so scaling works while still allowing width/height to be
overridden by props).
|
@desmonet Please make the necessary changes to get this to pass the |
Addition of REAPER to the Fleet-Maintained apps list.
Product information: https://www.reaper.fm/
Homebrew formula: https://formulae.brew.sh/cask/reaper#default
Thanks!
@allenhouchins
Summary by CodeRabbit