Commit 6d8e1ab
fix: clear the attention banner after a passing run and make source removal backend-aware (#310)
## Summary
Two independent, unrelated bug fixes (PR6 of the v2.12.0 wave).
**Issue #271 - drill/scrub attention banner stuck red**
`needsAttention` (and the count it displays) summed failures across the
whole loaded 10-run history window. At the monthly drill cadence, one
bad run kept the red "N files could not be restored" banner up for ~10
subsequent passing drills, with no way for a later success to ever clear
it (each drill draws a fresh time-seeded sample, so it can never "prove"
an old failure is fine again by evidence). Applied the fix the linked
review recommended: key the banner on the NEWEST loaded run only. The
scrub panel used the identical sum-across-window pattern, so it got the
same fix per the issue's explicit note that it applies there too.
- `ui/src/stores/drill.ts`, `ui/src/stores/scrub.ts`:
`failedTotal`/`unrecoverableTotal` (and therefore `needsAttention`) now
read off `latest` only, not a `.reduce()` over the whole window.
- Tests extended in `ui/src/__tests__/drill-panel.test.ts` and
`ui/src/__tests__/scrub-panel.test.ts` covering both the panel and the
store layer, including the exact failed-then-succeeded regression
sequence from the issue.
**Issue #227 - source removal + "delete backed-up files" broke on every
non-Drive destination**
`remove_source(delete_remote: true)` unconditionally rejected the
request with `drive.unreachable` and Drive-specific wording ("Remove it
from Google Drive directly"), on EVERY destination, not just S3 as
reported - the feature was simply never implemented. Every `RemoteStore`
implementation (Google Drive, S3, the local folder, SFTP) already
provides `list_source_object_ids` + `trash` - the same primitives the
integrity scrub and the executor's remote-existence audit already use -
so this is now implemented for every backend rather than gated behind a
capability flag; there was nothing backend-specific left to gate.
- `src-tauri/src/commands/sources.rs`: `remove_source` now deletes the
source's live remote objects FIRST (before any local row is touched)
when `delete_remote` is set. Enumeration failure aborts with zero
deletions (mirrors the audit's "abort with zero writes" rule); `trash`
is idempotent, so a retry after a partial failure only re-deletes what's
still actually there. The core logic
(`delete_source_remote_objects_via`) is decoupled from `AppState` so
it's directly unit-testable against a `RemoteStore` fake.
- `ui/src/components/SourceTable.vue`: the remove-confirm flow
previously failed *silently* on error (the promise rejection was simply
unhandled). It now surfaces the stable error code inline and keeps the
confirm panel open with the checkbox still ticked for a one-click retry,
instead of leaving the user staring at an unremoved source with no
explanation.
- The checkbox label (`settings.sources.deleteRemoteLabel`, "Also delete
the backed-up files from the destination") was already backend-neutral
from an earlier pass; no copy change needed there.
## Test plan
- [x] `cargo test -p driven-app --lib` - 445 passed, including 3 new
tests covering: skip-when-nothing-recorded, delete-every-live-object
across all four `BackendKind` values against a `RemoteStore` fake, and
abort-with-zero-deletions on an enumeration failure.
- [x] `cargo clippy -p driven-app --all-targets --all-features -- -D
warnings` - clean.
- [x] `cargo fmt -p driven-app -- --check` - clean.
- [x] `pnpm -C ui run test:unit` - 794 passed (up from 793), including 3
new/extended tests for the banner fix and 1 new test for the
removal-failure UI surface.
- [x] `pnpm -C ui exec vue-tsc --noEmit` - clean.
- [x] `pnpm -C ui run lint` - 0 errors (35 pre-existing unused-i18n-key
warnings, unrelated to this change).
- [x] `pnpm -C ui run format:check` - clean.
README: checked, no changes needed (no user-visible feature list,
destination table, or setting-location claim referenced either bug; the
checkbox copy was already backend-neutral).
Closes #271, closes #227
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
https://claude.ai/code/session_019xKUm9vH4ifb5LHR5szy1v
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>1 parent 2bb1e3d commit 6d8e1ab
7 files changed
Lines changed: 444 additions & 47 deletions
File tree
- src-tauri/src/commands
- ui/src
- __tests__
- components
- stores
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
630 | 630 | | |
631 | 631 | | |
632 | 632 | | |
633 | | - | |
634 | | - | |
635 | | - | |
636 | | - | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
637 | 640 | | |
638 | 641 | | |
639 | 642 | | |
| |||
647 | 650 | | |
648 | 651 | | |
649 | 652 | | |
650 | | - | |
651 | | - | |
652 | | - | |
653 | | - | |
654 | | - | |
655 | | - | |
656 | | - | |
657 | | - | |
658 | 653 | | |
659 | 654 | | |
660 | 655 | | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
661 | 665 | | |
662 | 666 | | |
663 | 667 | | |
| |||
722 | 726 | | |
723 | 727 | | |
724 | 728 | | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + | |
| 753 | + | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
| 761 | + | |
| 762 | + | |
| 763 | + | |
| 764 | + | |
| 765 | + | |
| 766 | + | |
| 767 | + | |
| 768 | + | |
| 769 | + | |
| 770 | + | |
| 771 | + | |
| 772 | + | |
| 773 | + | |
| 774 | + | |
| 775 | + | |
| 776 | + | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + | |
| 791 | + | |
| 792 | + | |
| 793 | + | |
| 794 | + | |
| 795 | + | |
| 796 | + | |
| 797 | + | |
| 798 | + | |
| 799 | + | |
| 800 | + | |
| 801 | + | |
| 802 | + | |
| 803 | + | |
| 804 | + | |
| 805 | + | |
725 | 806 | | |
726 | 807 | | |
727 | 808 | | |
| |||
2918 | 2999 | | |
2919 | 3000 | | |
2920 | 3001 | | |
| 3002 | + | |
| 3003 | + | |
| 3004 | + | |
| 3005 | + | |
| 3006 | + | |
| 3007 | + | |
| 3008 | + | |
| 3009 | + | |
| 3010 | + | |
| 3011 | + | |
| 3012 | + | |
| 3013 | + | |
| 3014 | + | |
| 3015 | + | |
| 3016 | + | |
| 3017 | + | |
| 3018 | + | |
| 3019 | + | |
| 3020 | + | |
| 3021 | + | |
| 3022 | + | |
| 3023 | + | |
| 3024 | + | |
| 3025 | + | |
| 3026 | + | |
| 3027 | + | |
| 3028 | + | |
| 3029 | + | |
| 3030 | + | |
| 3031 | + | |
| 3032 | + | |
| 3033 | + | |
| 3034 | + | |
| 3035 | + | |
| 3036 | + | |
| 3037 | + | |
| 3038 | + | |
| 3039 | + | |
| 3040 | + | |
| 3041 | + | |
| 3042 | + | |
| 3043 | + | |
| 3044 | + | |
| 3045 | + | |
| 3046 | + | |
| 3047 | + | |
| 3048 | + | |
| 3049 | + | |
| 3050 | + | |
| 3051 | + | |
| 3052 | + | |
| 3053 | + | |
| 3054 | + | |
| 3055 | + | |
| 3056 | + | |
| 3057 | + | |
| 3058 | + | |
| 3059 | + | |
| 3060 | + | |
| 3061 | + | |
| 3062 | + | |
| 3063 | + | |
| 3064 | + | |
| 3065 | + | |
| 3066 | + | |
| 3067 | + | |
| 3068 | + | |
| 3069 | + | |
| 3070 | + | |
| 3071 | + | |
| 3072 | + | |
| 3073 | + | |
| 3074 | + | |
| 3075 | + | |
| 3076 | + | |
| 3077 | + | |
| 3078 | + | |
| 3079 | + | |
| 3080 | + | |
| 3081 | + | |
| 3082 | + | |
| 3083 | + | |
| 3084 | + | |
| 3085 | + | |
| 3086 | + | |
| 3087 | + | |
| 3088 | + | |
| 3089 | + | |
| 3090 | + | |
| 3091 | + | |
| 3092 | + | |
| 3093 | + | |
| 3094 | + | |
| 3095 | + | |
| 3096 | + | |
| 3097 | + | |
| 3098 | + | |
| 3099 | + | |
| 3100 | + | |
| 3101 | + | |
| 3102 | + | |
| 3103 | + | |
| 3104 | + | |
| 3105 | + | |
| 3106 | + | |
| 3107 | + | |
| 3108 | + | |
| 3109 | + | |
| 3110 | + | |
| 3111 | + | |
| 3112 | + | |
| 3113 | + | |
| 3114 | + | |
| 3115 | + | |
| 3116 | + | |
| 3117 | + | |
| 3118 | + | |
| 3119 | + | |
| 3120 | + | |
| 3121 | + | |
| 3122 | + | |
| 3123 | + | |
| 3124 | + | |
| 3125 | + | |
| 3126 | + | |
| 3127 | + | |
| 3128 | + | |
| 3129 | + | |
| 3130 | + | |
| 3131 | + | |
| 3132 | + | |
| 3133 | + | |
| 3134 | + | |
| 3135 | + | |
| 3136 | + | |
| 3137 | + | |
| 3138 | + | |
| 3139 | + | |
| 3140 | + | |
| 3141 | + | |
| 3142 | + | |
| 3143 | + | |
| 3144 | + | |
| 3145 | + | |
| 3146 | + | |
| 3147 | + | |
| 3148 | + | |
| 3149 | + | |
| 3150 | + | |
| 3151 | + | |
| 3152 | + | |
| 3153 | + | |
| 3154 | + | |
| 3155 | + | |
| 3156 | + | |
| 3157 | + | |
| 3158 | + | |
| 3159 | + | |
| 3160 | + | |
| 3161 | + | |
| 3162 | + | |
| 3163 | + | |
| 3164 | + | |
| 3165 | + | |
| 3166 | + | |
| 3167 | + | |
| 3168 | + | |
| 3169 | + | |
| 3170 | + | |
| 3171 | + | |
| 3172 | + | |
| 3173 | + | |
2921 | 3174 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
123 | 123 | | |
124 | 124 | | |
125 | 125 | | |
126 | | - | |
| 126 | + | |
127 | 127 | | |
128 | 128 | | |
129 | 129 | | |
130 | 130 | | |
131 | | - | |
132 | | - | |
133 | | - | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
134 | 146 | | |
135 | 147 | | |
136 | 148 | | |
| |||
182 | 194 | | |
183 | 195 | | |
184 | 196 | | |
185 | | - | |
| 197 | + | |
186 | 198 | | |
187 | 199 | | |
188 | 200 | | |
| |||
192 | 204 | | |
193 | 205 | | |
194 | 206 | | |
195 | | - | |
| 207 | + | |
| 208 | + | |
196 | 209 | | |
197 | 210 | | |
198 | 211 | | |
199 | 212 | | |
200 | 213 | | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
201 | 234 | | |
202 | 235 | | |
203 | 236 | | |
| |||
0 commit comments