chore: mark clippy fixes as completed in PLAN.md

Co-authored-by: aider (openai/andrew/openrouter/sonoma-sky-alpha) <aider@aider.chat>
This commit is contained in:
Andrew Phillips
2025-09-11 12:34:49 -03:00
parent fb70b7cc0b
commit d27776ac23

69
PLAN.md
View File

@@ -8,304 +8,373 @@ This document outlines the current state of the codebase and planned changes, pa
- **Issue**: Empty line after doc comment at line 32. - **Issue**: Empty line after doc comment at line 32.
- **Description**: The doc comment for the `impl CompressionService` block ends with a code example, followed by an empty line. Clippy flags this as unnecessary. - **Description**: The doc comment for the `impl CompressionService` block ends with a code example, followed by an empty line. Clippy flags this as unnecessary.
- **Fix**: Remove the empty line after the doc comment example. - **Fix**: Remove the empty line after the doc comment example.
- **Status**: COMPLETED
### src/filter_plugin/mod.rs ### src/filter_plugin/mod.rs
- **Issue**: Empty line after doc comment at line 194. - **Issue**: Empty line after doc comment at line 194.
- **Description**: Similar to above, the doc comment for `impl Clone for FilterChain` has an empty line. - **Description**: Similar to above, the doc comment for `impl Clone for FilterChain` has an empty line.
- **Fix**: Remove the empty line. - **Fix**: Remove the empty line.
- **Status**: COMPLETED
### src/common/is_binary.rs ### src/common/is_binary.rs
- **Issue**: Collapsible if statements at lines 15-17. - **Issue**: Collapsible if statements at lines 15-17.
- **Description**: Nested if for UTF-16 BOM check can be flattened. - **Description**: Nested if for UTF-16 BOM check can be flattened.
- **Fix**: Combine into a single condition. - **Fix**: Combine into a single condition.
- **Status**: COMPLETED
- **Issue**: Let binding returned immediately at line 218. - **Issue**: Let binding returned immediately at line 218.
- **Description**: The `has_reasonable_structure` let binding is returned directly; unnecessary. - **Description**: The `has_reasonable_structure` let binding is returned directly; unnecessary.
- **Fix**: Return the expression directly without the binding. - **Fix**: Return the expression directly without the binding.
- **Status**: COMPLETED
- **Issue**: Needless range loop at line 192. - **Issue**: Needless range loop at line 192.
- **Description**: Loop variable `i` only used for indexing; use iterator instead. - **Description**: Loop variable `i` only used for indexing; use iterator instead.
- **Fix**: Replace with `data[100..108].iter()`. - **Fix**: Replace with `data[100..108].iter()`.
- **Status**: COMPLETED
- **Issue**: Needless range loop at line 199. - **Issue**: Needless range loop at line 199.
- **Description**: Similar to above for checksum field. - **Description**: Similar to above for checksum field.
- **Fix**: Replace with `data[148..156].iter()`. - **Fix**: Replace with `data[148..156].iter()`.
- **Status**: COMPLETED
- **Issue**: Manual range contains at line 216. - **Issue**: Manual range contains at line 216.
- **Description**: `(b >= b'0' && b <= b'7')` can use `RangeInclusive::contains`. - **Description**: `(b >= b'0' && b <= b'7')` can use `RangeInclusive::contains`.
- **Fix**: Change to `(b'0'..=b'7').contains(&b)`. - **Fix**: Change to `(b'0'..=b'7').contains(&b)`.
- **Status**: COMPLETED
### src/common/status.rs ### src/common/status.rs
- **Issue**: Borrowed box instead of slice at line 59. - **Issue**: Borrowed box instead of slice at line 59.
- **Description**: `&Vec<MetaPluginType>` can be `&[MetaPluginType]`. - **Description**: `&Vec<MetaPluginType>` can be `&[MetaPluginType]`.
- **Fix**: Update the parameter type. - **Fix**: Update the parameter type.
- **Status**: COMPLETED
- **Issue**: Unnecessary map_or at line 91. - **Issue**: Unnecessary map_or at line 91.
- **Description**: `as_ref().map_or(false, |ct| *ct == compression_type)` can be simplified. - **Description**: `as_ref().map_or(false, |ct| *ct == compression_type)` can be simplified.
- **Fix**: Use `is_some_and(|ct| *ct == compression_type)`. - **Fix**: Use `is_some_and(|ct| *ct == compression_type)`.
- **Status**: COMPLETED
### src/config.rs ### src/config.rs
- **Issue**: Match result_ok at line 198. - **Issue**: Match result_ok at line 198.
- **Description**: `std::env::var("HOME").ok()` is redundant. - **Description**: `std::env::var("HOME").ok()` is redundant.
- **Fix**: Change to `if let Ok(home_dir) = std::env::var("HOME")`. - **Fix**: Change to `if let Ok(home_dir) = std::env::var("HOME")`.
- **Status**: COMPLETED
### src/services/async_item_service.rs ### src/services/async_item_service.rs
- **Issue**: Redundant local binding at line 214. - **Issue**: Redundant local binding at line 214.
- **Description**: `let item_id = item_id;` is unnecessary. - **Description**: `let item_id = item_id;` is unnecessary.
- **Fix**: Remove the redundant let. - **Fix**: Remove the redundant let.
- **Status**: COMPLETED
### src/services/compression_service.rs ### src/services/compression_service.rs
- **Issue**: Four forward slashes in comment at line 8. - **Issue**: Four forward slashes in comment at line 8.
- **Description**: `////` looks like a doc comment but isn't. - **Description**: `////` looks like a doc comment but isn't.
- **Fix**: Change to `///` and ensure it's a proper doc comment. - **Fix**: Change to `///` and ensure it's a proper doc comment.
- **Status**: COMPLETED
### src/services/filter_service.rs ### src/services/filter_service.rs
- **Issue**: New without default at line 35. - **Issue**: New without default at line 35.
- **Description**: `FilterService` has `new()` but no `Default` impl. - **Description**: `FilterService` has `new()` but no `Default` impl.
- **Fix**: Add `impl Default for FilterService { fn default() -> Self { Self::new() } }`. - **Fix**: Add `impl Default for FilterService { fn default() -> Self { Self::new() } }`.
- **Status**: COMPLETED
- **Issue**: Type complexity at line 161. - **Issue**: Type complexity at line 161.
- **Description**: The static `FILTER_PLUGIN_REGISTRY` type is too complex. - **Description**: The static `FILTER_PLUGIN_REGISTRY` type is too complex.
- **Fix**: Factor into a type alias. - **Fix**: Factor into a type alias.
- **Status**: COMPLETED
### src/services/meta_service.rs ### src/services/meta_service.rs
- **Issue**: Unwrap or default at line 84. - **Issue**: Unwrap or default at line 84.
- **Description**: `or_insert_with(Vec::new)` can be `or_default()`. - **Description**: `or_insert_with(Vec::new)` can be `or_default()`.
- **Fix**: Replace with `or_default()`. - **Fix**: Replace with `or_default()`.
- **Status**: COMPLETED
- **Issue**: Borrowed box at line 164. - **Issue**: Borrowed box at line 164.
- **Description**: `&Box<dyn MetaPlugin>` can be `&dyn MetaPlugin`. - **Description**: `&Box<dyn MetaPlugin>` can be `&dyn MetaPlugin`.
- **Fix**: Update to `&dyn MetaPlugin`. - **Fix**: Update to `&dyn MetaPlugin`.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 199. - **Issue**: Collapsible if at line 199.
- **Description**: Nested if for hostname insertion. - **Description**: Nested if for hostname insertion.
- **Fix**: Combine conditions. - **Fix**: Combine conditions.
- **Status**: COMPLETED
### src/db.rs ### src/db.rs
- **Issue**: Unwrap or default at line 1209. - **Issue**: Unwrap or default at line 1209.
- **Description**: `or_insert_with(Vec::new)` for tags. - **Description**: `or_insert_with(Vec::new)` for tags.
- **Fix**: Use `or_default()`. - **Fix**: Use `or_default()`.
- **Status**: COMPLETED
- **Issue**: Unwrap or default at line 1264. - **Issue**: Unwrap or default at line 1264.
- **Description**: `or_insert_with(std::collections::HashMap::new)` for meta. - **Description**: `or_insert_with(std::collections::HashMap::new)` for meta.
- **Fix**: Use `or_default()`. - **Fix**: Use `or_default()`.
- **Status**: COMPLETED
### src/meta_plugin/magic_file.rs ### src/meta_plugin/magic_file.rs
- **Issue**: Io other error at line 70. - **Issue**: Io other error at line 70.
- **Description**: Manual `io::Error::new(io::ErrorKind::Other, ...)` can be `io::Error::other`. - **Description**: Manual `io::Error::new(io::ErrorKind::Other, ...)` can be `io::Error::other`.
- **Fix**: Replace with `io::Error::other(format!(...))`. - **Fix**: Replace with `io::Error::other(format!(...))`.
- **Status**: COMPLETED
- **Issue**: Io other error at line 73. - **Issue**: Io other error at line 73.
- **Description**: Similar to above. - **Description**: Similar to above.
- **Fix**: Replace with `io::Error::other(format!(...))`. - **Fix**: Replace with `io::Error::other(format!(...))`.
- **Status**: COMPLETED
- **Issue**: Io other error at line 89. - **Issue**: Io other error at line 89.
- **Description**: Manual error creation. - **Description**: Manual error creation.
- **Fix**: Replace with `io::Error::other(...)`. - **Fix**: Replace with `io::Error::other(...)`.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 105. - **Issue**: Collapsible if at line 105.
- **Description**: Nested if for magic result processing. - **Description**: Nested if for magic result processing.
- **Fix**: Combine into single condition. - **Fix**: Combine into single condition.
- **Status**: COMPLETED
### src/meta_plugin/exec.rs ### src/meta_plugin/exec.rs
- **Issue**: Collapsible if at line 281. - **Issue**: Collapsible if at line 281.
- **Description**: Nested if for writing to stdin. - **Description**: Nested if for writing to stdin.
- **Fix**: Combine conditions. - **Fix**: Combine conditions.
- **Status**: COMPLETED
- **Issue**: Collapsible if at lines 380-383. - **Issue**: Collapsible if at lines 380-383.
- **Description**: Nested if for command parsing. - **Description**: Nested if for command parsing.
- **Fix**: Collapse nested lets and ifs. - **Fix**: Collapse nested lets and ifs.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 390. - **Issue**: Collapsible if at line 390.
- **Description**: Nested if for split_whitespace. - **Description**: Nested if for split_whitespace.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 395. - **Issue**: Collapsible if at line 395.
- **Description**: Nested if for name. - **Description**: Nested if for name.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
### src/meta_plugin/digest.rs ### src/meta_plugin/digest.rs
- **Issue**: Derivable impls at line 69. - **Issue**: Derivable impls at line 69.
- **Description**: `Default` impl can be derived. - **Description**: `Default` impl can be derived.
- **Fix**: Add `#[derive(Default)]` to `DigestMetaPlugin`. - **Fix**: Add `#[derive(Default)]` to `DigestMetaPlugin`.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 137. - **Issue**: Collapsible if at line 137.
- **Description**: Nested if for updating outputs. - **Description**: Nested if for updating outputs.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
### src/meta_plugin/text.rs ### src/meta_plugin/text.rs
- **Issue**: Collapsible if at line 388. - **Issue**: Collapsible if at line 388.
- **Description**: Nested if for median length. - **Description**: Nested if for median length.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 389. - **Issue**: Collapsible if at line 389.
- **Description**: Nested if for lengths check. - **Description**: Nested if for lengths check.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 608. - **Issue**: Collapsible if at line 608.
- **Description**: Nested if for binary content check. - **Description**: Nested if for binary content check.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 609. - **Issue**: Collapsible if at line 609.
- **Description**: Nested if for buffer check. - **Description**: Nested if for buffer check.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 649. - **Issue**: Collapsible if at line 649.
- **Description**: Nested if for enabled outputs. - **Description**: Nested if for enabled outputs.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
### src/meta_plugin/hostname.rs ### src/meta_plugin/hostname.rs
- **Issue**: Collapsible if at line 37. - **Issue**: Collapsible if at line 37.
- **Description**: Nested if for hostname option handling. - **Description**: Nested if for hostname option handling.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 155. - **Issue**: Collapsible if at line 155.
- **Description**: Nested if for domainname command. - **Description**: Nested if for domainname command.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 168. - **Issue**: Collapsible if at line 168.
- **Description**: Nested if for hostname -f command. - **Description**: Nested if for hostname -f command.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 268. - **Issue**: Collapsible if at line 268.
- **Description**: Nested if for hostname_enabled. - **Description**: Nested if for hostname_enabled.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 277. - **Issue**: Collapsible if at line 277.
- **Description**: Nested if for hostname_full_enabled. - **Description**: Nested if for hostname_full_enabled.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 286. - **Issue**: Collapsible if at line 286.
- **Description**: Nested if for hostname_short_enabled. - **Description**: Nested if for hostname_short_enabled.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
### src/meta_plugin/mod.rs ### src/meta_plugin/mod.rs
- **Issue**: Redundant closure at line 208. - **Issue**: Redundant closure at line 208.
- **Description**: `Lazy::new(|| HashMap::new())` unnecessary closure. - **Description**: `Lazy::new(|| HashMap::new())` unnecessary closure.
- **Fix**: Use `HashMap::new()` directly. - **Fix**: Use `HashMap::new()` directly.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 228. - **Issue**: Collapsible if at line 228.
- **Description**: Nested if for output disabling. - **Description**: Nested if for output disabling.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Redundant closure at line 374. - **Issue**: Redundant closure at line 374.
- **Description**: Similar to above. - **Description**: Similar to above.
- **Fix**: Use directly. - **Fix**: Use directly.
- **Status**: COMPLETED
- **Issue**: Redundant closure at line 395. - **Issue**: Redundant closure at line 395.
- **Description**: Similar. - **Description**: Similar.
- **Fix**: Use directly. - **Fix**: Use directly.
- **Status**: COMPLETED
- **Issue**: Type complexity at line 431. - **Issue**: Type complexity at line 431.
- **Description**: Complex static type. - **Description**: Complex static type.
- **Fix**: Factor into type alias. - **Fix**: Factor into type alias.
- **Status**: COMPLETED
- **Issue**: Type complexity at line 442. - **Issue**: Type complexity at line 442.
- **Description**: Complex fn type in registry. - **Description**: Complex fn type in registry.
- **Fix**: Factor into type alias. - **Fix**: Factor into type alias.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 466. - **Issue**: Collapsible if at line 466.
- **Description**: Nested if for command parsing. - **Description**: Nested if for command parsing.
- **Fix**: Collapse. - **Fix**: Collapse.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 476. - **Issue**: Collapsible if at line 476.
- **Description**: Nested if for split_whitespace. - **Description**: Nested if for split_whitespace.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 481. - **Issue**: Collapsible if at line 481.
- **Description**: Nested if for name. - **Description**: Nested if for name.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
### src/modes/common.rs ### src/modes/common.rs
- **Issue**: Should implement trait at line 175. - **Issue**: Should implement trait at line 175.
- **Description**: `from_str` method shadows trait; implement FromStr. - **Description**: `from_str` method shadows trait; implement FromStr.
- **Fix**: Add `impl FromStr for ColumnType` with the method. - **Fix**: Add `impl FromStr for ColumnType` with the method.
- **Status**: COMPLETED
### src/modes/delete.rs ### src/modes/delete.rs
- **Issue**: Ptr arg at line 51. - **Issue**: Ptr arg at line 51.
- **Description**: `&mut Vec<i64>` can be `&mut [i64]`. - **Description**: `&mut Vec<i64>` can be `&mut [i64]`.
- **Fix**: Update parameter. - **Fix**: Update parameter.
- **Status**: COMPLETED
- **Issue**: Ptr arg at line 52. - **Issue**: Ptr arg at line 52.
- **Description**: `&mut Vec<String>` can be `&mut [String]`. - **Description**: `&mut Vec<String>` can be `&mut [String]`.
- **Fix**: Update parameter. - **Fix**: Update parameter.
- **Status**: COMPLETED
### src/modes/diff.rs ### src/modes/diff.rs
- **Issue**: Ptr arg at line 11. - **Issue**: Ptr arg at line 11.
- **Description**: `&Vec<i64>` can be `&[i64]`. - **Description**: `&Vec<i64>` can be `&[i64]`.
- **Fix**: Update. - **Fix**: Update.
- **Status**: COMPLETED
- **Issue**: Ptr arg at line 11. - **Issue**: Ptr arg at line 11.
- **Description**: `&Vec<String>` can be `&[String]`. - **Description**: `&Vec<String>` can be `&[String]`.
- **Fix**: Update. - **Fix**: Update.
- **Status**: COMPLETED
- **Issue**: Ptr arg at line 37. - **Issue**: Ptr arg at line 37.
- **Description**: `&Vec<i64>` can be `&[i64]`. - **Description**: `&Vec<i64>` can be `&[i64]`.
- **Fix**: Update. - **Fix**: Update.
- **Status**: COMPLETED
### src/modes/get.rs ### src/modes/get.rs
- **Issue**: Ptr arg at line 32. - **Issue**: Ptr arg at line 32.
- **Description**: `&mut Vec<i64>` can be `&mut [i64]`. - **Description**: `&mut Vec<i64>` can be `&mut [i64]`.
- **Fix**: Update. - **Fix**: Update.
- **Status**: COMPLETED
- **Issue**: Ptr arg at line 33. - **Issue**: Ptr arg at line 33.
- **Description**: `&mut Vec<String>` can be `&mut [String]`. - **Description**: `&mut Vec<String>` can be `&mut [String]`.
- **Fix**: Update. - **Fix**: Update.
- **Status**: COMPLETED
### src/modes/info.rs ### src/modes/info.rs
- **Issue**: Ptr arg at line 45. - **Issue**: Ptr arg at line 45.
- **Description**: `&mut Vec<i64>` can be `&mut [i64]`. - **Description**: `&mut Vec<i64>` can be `&mut [i64]`.
- **Fix**: Update. - **Fix**: Update.
- **Status**: COMPLETED
- **Issue**: Ptr arg at line 46. - **Issue**: Ptr arg at line 46.
- **Description**: `&mut Vec<String>` can be `&mut [String]`. - **Description**: `&mut Vec<String>` can be `&mut [String]`.
- **Fix**: Update. - **Fix**: Update.
- **Status**: COMPLETED
- **Issue**: Needless borrows for generic args at line 142. - **Issue**: Needless borrows for generic args at line 142.
- **Description**: `&item_id.to_string()` unnecessary borrow. - **Description**: `&item_id.to_string()` unnecessary borrow.
- **Fix**: Use `item_id.to_string()` directly. - **Fix**: Use `item_id.to_string()` directly.
- **Status**: COMPLETED
### src/modes/list.rs ### src/modes/list.rs
- **Issue**: Ptr arg at line 164. - **Issue**: Ptr arg at line 164.
- **Description**: `&mut Vec<i64>` can be `&mut [i64]`. - **Description**: `&mut Vec<i64>` can be `&mut [i64]`.
- **Fix**: Update. - **Fix**: Update.
- **Status**: COMPLETED
- **Issue**: Ptr arg at line 165. - **Issue**: Ptr arg at line 165.
- **Description**: `&Vec<String>` can be `&[String]`. - **Description**: `&Vec<String>` can be `&[String]`.
- **Fix**: Update. - **Fix**: Update.
- **Status**: COMPLETED
### src/modes/save.rs ### src/modes/save.rs
- **Issue**: Ptr arg at line 21. - **Issue**: Ptr arg at line 21.
- **Description**: `&Vec<i64>` can be `&[i64]`. - **Description**: `&Vec<i64>` can be `&[i64]`.
- **Fix**: Update. - **Fix**: Update.
- **Status**: COMPLETED
### src/modes/status_plugins.rs ### src/modes/status_plugins.rs
- **Issue**: Ptr arg at line 175. - **Issue**: Ptr arg at line 175.
- **Description**: `&Vec<FilterPluginInfo>` can be `&[FilterPluginInfo]`. - **Description**: `&Vec<FilterPluginInfo>` can be `&[FilterPluginInfo]`.
- **Fix**: Update. - **Fix**: Update.
- **Status**: COMPLETED
### src/filter_plugin/strip_ansi.rs ### src/filter_plugin/strip_ansi.rs
- **Issue**: New without default at line 14. - **Issue**: New without default at line 14.
- **Description**: `StripAnsiFilter` has `new()` but no `Default` impl. - **Description**: `StripAnsiFilter` has `new()` but no `Default` impl.
- **Fix**: Add `impl Default for StripAnsiFilter { fn default() -> Self { Self::new() } }`. - **Fix**: Add `impl Default for StripAnsiFilter { fn default() -> Self { Self::new() } }`.
- **Status**: COMPLETED
### src/filter_plugin/mod.rs ### src/filter_plugin/mod.rs
- **Issue**: New without default at line 235. - **Issue**: New without default at line 235.
- **Description**: `FilterChain` has `new()` but no `Default` impl. - **Description**: `FilterChain` has `new()` but no `Default` impl.
- **Fix**: Add `impl Default for FilterChain { fn default() -> Self { Self::new() } }`. - **Fix**: Add `impl Default for FilterChain { fn default() -> Self { Self::new() } }`.
- **Status**: COMPLETED
- **Issue**: Collapsible if at line 586. - **Issue**: Collapsible if at line 586.
- **Description**: Nested if for f64 parsing. - **Description**: Nested if for f64 parsing.
- **Fix**: Combine. - **Fix**: Combine.
- **Status**: COMPLETED
### src/meta_plugin/mod.rs ### src/meta_plugin/mod.rs
- **Issue**: Borrowed box at line 164? Wait, no specific line, but earlier note. - **Issue**: Borrowed box at line 164? Wait, no specific line, but earlier note.
- **Description**: Ensure no unnecessary borrows. - **Description**: Ensure no unnecessary borrows.
- **Status**: COMPLETED
## General Changes ## General Changes
- Ensure all `Default` impls are derived where possible (e.g., add derives). - Ensure all `Default` impls are derived where possible (e.g., add derives).
- Remove redundant locals and unnecessary let bindings. - Remove redundant locals and unnecessary let bindings.
- Update all parameter types from `&Vec<T>` to `&[T]` and `&mut Vec<T>` to `&mut [T]` where appropriate (function signatures). - Update all parameter types from `&Vec<T>` to `&[T]` and `&mut Vec<T>` to `&mut [T]` where appropriate (function signatures).
- **Status**: COMPLETED
## Next Steps ## Next Steps
1. Apply the fixes above. 1. Apply the fixes above.