Skip to content

Conversation

@julio-lopez
Copy link
Collaborator

@julio-lopez julio-lopez commented Oct 24, 2025

The omitempty JSON tag is ineffective on fields of struct type, among others.

The fields with tags changed from omitempty to omitzero can be classified into 2 categories:

  • fields for which the intent was to avoid serializing the value when it was zero or empty (such as structs with the zero value for the struct);
  • policy-definition fields that have the omitempty to match the corresponding policy fields.

The fields are changed such that

  • the fields are not serialized when they have the zero (or empty) value; and
  • consistency is maintained between policy fields and the corresponding policy definition fields.

In the context of policy definitions:

Fields of type struct:
In some cases, the fields in the policy definition and values are of type struct, such as is the case for the policy.Policy and policy.Definition structs.
In these cases, the omitzero JSON tag avoids marshaling empty fields, making the serialized representation more compact and less noisy, while preserving the same behavior and thus semantic when unmarshaling omitted fields.

Fields of pointer types:
The omitempty and omitzero have practically the same effect on fields of pointer types:

  • the field is omitted when it is null
  • the field is included when it is not null, even if the value that it points to is "the zero value" for the non-pointer type.

Note: when the pointer type defines an IsZero() member function, then that field would also be omitted during marshaling. There are no defined IsZero() function for these pointers, so
the semantics are preserved in this case.

The omitzero JSON tag in the fields definition structs, such as the ActionPolicyDefinition struct, does not change the semantics, it simply makes the marshaled representation more compact.

Fields of type slice:

The behavior for omitempty and omitzero differs for slices, and maps as well.

The struct fields of slice type, such as []string, are left with the omitempty tag to be able to tell the difference between a nil slice and a non-nil, zero-length slice. Even though, currently most code paths do not explicitly differentiate between a nil slice and an empty slice, the omitempty tag is left unmodified out of abundance of caution.


Ref:

@julio-lopez julio-lopez requested a review from Copilot October 24, 2025 16:43
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR refactors JSON struct tags across policy definition structs by replacing omitempty with omitzero. This change affects how zero-valued fields are serialized in JSON output, ensuring that zero values of structs are omitted rather than just nil/empty values.

Key Changes:

  • Updated all *PolicyDefinition struct JSON tags from omitempty to omitzero
  • Updated nested policy fields in the main Policy and Definition structs

Reviewed Changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated no comments.

Show a summary per file
File Description
snapshot/policy/upload_policy.go Updated JSON tags in UploadPolicyDefinition struct
snapshot/policy/splitter_policy.go Updated JSON tags in SplitterPolicyDefinition struct
snapshot/policy/scheduling_policy.go Updated JSON tags in SchedulingPolicyDefinition struct
snapshot/policy/retention_policy.go Updated JSON tags in RetentionPolicyDefinition struct
snapshot/policy/policy.go Updated JSON tags in Policy and Definition structs
snapshot/policy/os_snapshot_policy.go Updated JSON tags in OSSnapshotPolicyDefinition and VolumeShadowCopyPolicyDefinition structs
snapshot/policy/logging_policy.go Updated JSON tags in LoggingPolicy, LoggingPolicyDefinition, DirLoggingPolicyDefinition, and EntryLoggingPolicyDefinition structs
snapshot/policy/files_policy.go Updated JSON tags in FilesPolicyDefinition struct
snapshot/policy/error_handling_policy.go Updated JSON tags in ErrorHandlingPolicyDefinition struct
snapshot/policy/compression_policy.go Updated JSON tags in CompressionPolicyDefinition and MetadataCompressionPolicyDefinition structs
snapshot/policy/actions_policy.go Updated JSON tags in ActionsPolicyDefinition struct

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@julio-lopez julio-lopez force-pushed the refactor/policy-omitzero branch from fb3fbe4 to bd0fe1e Compare October 24, 2025 18:22
@codecov
Copy link

codecov bot commented Oct 24, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 78.03%. Comparing base (cb455c6) to head (581bd2a).
⚠️ Report is 749 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #4910      +/-   ##
==========================================
+ Coverage   75.86%   78.03%   +2.16%     
==========================================
  Files         470      548      +78     
  Lines       37301    31412    -5889     
==========================================
- Hits        28299    24512    -3787     
+ Misses       7071     4851    -2220     
- Partials     1931     2049     +118     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@julio-lopez julio-lopez requested a review from Copilot October 24, 2025 18:42
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@julio-lopez julio-lopez force-pushed the refactor/policy-omitzero branch 2 times, most recently from cf22a99 to 653a1e7 Compare October 24, 2025 21:02
@kopia kopia deleted a comment from Copilot AI Oct 24, 2025
@julio-lopez julio-lopez requested a review from jkowalski October 24, 2025 23:40
@julio-lopez julio-lopez marked this pull request as ready for review October 24, 2025 23:40
The fields in `policy.Policy` and `policy.Definition` are of
type `struct`.
The `omitempty` JSON tag is ineffective for structs.
The `omitzero` JSON tag avoids marshaling empty fields, making the
serialized representation more compact and less noisy, while
preserving the same behavior and thus semantic when unmarshaling
ommitted fields.
The `omitempty` and `omitzero` have practically the same effect on
fields of pointer types:
- the field is omitted when it is null
- the field is included when it is not null, even if the value
  that it points to is "the zero value" for the non-pointer type.

Note: when the pointer type defines an `IsZero` member function,
then that field would also be omitted during marshaling.
There is no defined `IsZero` function for these pointers, so
the sematics are preserved in this case.

The `omitzero` JSON tag in the fields in `ActionPolicyDefinition`
does not change the semantics, it simply makes the marshaled
representation more compact.
The behavior for `omitempty` and `omitzero` differs for slices, and
maps as well.

The struct fields of slice type (e.g., []string) are tagged with
`omitempty` to be able to tell the difference between a nil slice
and a non-nil zero-length slice.
The behavior for `omitempty` and `omitzero` differs for slices, and
maps as well.

The struct fields of slice type (e.g., []string) are tagged with
`omitempty` to be able to tell the difference between a nil slice
and a non-nil zero-length slice.
@julio-lopez julio-lopez force-pushed the refactor/policy-omitzero branch from 653a1e7 to 581bd2a Compare November 12, 2025 23:38
Copilot AI review requested due to automatic review settings November 12, 2025 23:38
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated no new comments.

@julio-lopez julio-lopez merged commit 033b4b1 into kopia:master Nov 13, 2025
35 of 36 checks passed
@julio-lopez julio-lopez deleted the refactor/policy-omitzero branch November 13, 2025 02:33
@julio-lopez julio-lopez changed the title refactor(general): omitzero JSON tag in policy structs refactor(general): omitzero JSON tag in policy structs Nov 13, 2025
julio-lopez added a commit to julio-lopez/kopia that referenced this pull request Nov 25, 2025
julio-lopez added a commit that referenced this pull request Nov 25, 2025
- Revert "chore(ci): enable modernize:omitzero linter setting (#4981)"
   reverts 06845c7
- Revert "refactor(general): omitzero JSON tag in policy structs (#4910)"
  reverts 033b4b1
- Revert "refactor(general): `omitzero` JSON tag (#4907)"
   reverts 5bc467e
- Ref: #5006
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