Commit a82323e
authored
Fix GetStructDiff to dereference non-nil pointers when the other side is omitted (#4766)
## Changes
Fix GetStructDiff to dereference non-nil pointers when the other side is
omitted
## Why
When comparing a non-nil pointer field against a nil/omitted side (due
to json omitempty), diffValues was storing the pointer value directly.
But when both sides are non-nil, it recursively dereferences via the
Pointer case. This inconsistency caused type mismatches (e.g., bool vs
*bool) when comparing changes from two different diff calls.
`localDiff` compares saved state vs current config. Both sides have
`Started = *bool(false) (non-nil)`, so `diffValues` hits the case
`reflect.Pointer` path and dereferences both:
`diffValues(*bool(false), *bool(true)) → diffValues(bool(false),
bool(true)) → Change{New: bool(true)}`
`remoteDiff` compares remote state vs current config. The remote has no
started field — in diffStruct, a nil *bool with omitempty gets replaced
with `reflect.Value{}` (invalid). But the current config side is
`*bool(true) (non-nil, non-zero)`, so it
stays as a pointer. Then diffValues stores the pointer without
dereferencing: `diffValues(invalid, *bool(true)) → Change{New:
*bool(true)}`
So localDiff produces `Change{New: bool(true)}` and remoteDiff produces
`Change{New: *bool(true)}` for the same path.
## Tests
<!-- How have you tested the changes? -->
<!-- If your PR needs to be included in the release notes for next
release,
add a separate entry in NEXT_CHANGELOG.md as part of your PR. -->1 parent 7b71d68 commit a82323e
File tree
6 files changed
+22
-17
lines changed- libs/structs
- structaccess
- structdiff
6 files changed
+22
-17
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
141 | 141 | | |
142 | 142 | | |
143 | 143 | | |
144 | | - | |
145 | | - | |
146 | | - | |
147 | | - | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
148 | 149 | | |
149 | 150 | | |
150 | 151 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
690 | 690 | | |
691 | 691 | | |
692 | 692 | | |
693 | | - | |
694 | | - | |
| 693 | + | |
| 694 | + | |
| 695 | + | |
695 | 696 | | |
696 | 697 | | |
697 | 698 | | |
| |||
725 | 726 | | |
726 | 727 | | |
727 | 728 | | |
728 | | - | |
| 729 | + | |
729 | 730 | | |
730 | 731 | | |
731 | 732 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
177 | 177 | | |
178 | 178 | | |
179 | 179 | | |
180 | | - | |
181 | | - | |
| 180 | + | |
| 181 | + | |
182 | 182 | | |
183 | 183 | | |
184 | 184 | | |
| |||
494 | 494 | | |
495 | 495 | | |
496 | 496 | | |
497 | | - | |
498 | | - | |
499 | | - | |
500 | | - | |
501 | 497 | | |
502 | 498 | | |
503 | 499 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
107 | 107 | | |
108 | 108 | | |
109 | 109 | | |
110 | | - | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
111 | 115 | | |
112 | 116 | | |
113 | 117 | | |
114 | 118 | | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
115 | 122 | | |
116 | 123 | | |
117 | 124 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
136 | 136 | | |
137 | 137 | | |
138 | 138 | | |
139 | | - | |
| 139 | + | |
140 | 140 | | |
141 | 141 | | |
142 | 142 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
497 | 497 | | |
498 | 498 | | |
499 | 499 | | |
500 | | - | |
| 500 | + | |
501 | 501 | | |
502 | 502 | | |
503 | 503 | | |
| |||
516 | 516 | | |
517 | 517 | | |
518 | 518 | | |
519 | | - | |
| 519 | + | |
520 | 520 | | |
521 | 521 | | |
522 | 522 | | |
| |||
0 commit comments