forget json output: added id's in snapshots within reasons object

In order to evaluate the keep reasons for snapshots, there should be also the id's
to compare it with snapshots within the keep object. (See also Issue #3117)

In order to avoid output parameters also changed function addJSONSnapshots to asJSONSnapshots
This commit is contained in:
Stephan Paul 2024-03-25 15:42:15 +01:00
parent 510f6f06b0
commit df07814ec2
3 changed files with 47 additions and 18 deletions

View file

@ -0,0 +1,5 @@
Enhancement: include snapshot id in reason field of forget JSON output
The JSON output of the `forget` command now includes the `id` and `short_id` of a snapshot in the `reason` field.
https://github.com/restic/restic/pull/4737

View file

@ -245,16 +245,16 @@ func runForget(ctx context.Context, opts ForgetOptions, pruneOptions PruneOption
PrintSnapshots(globalOptions.stdout, keep, reasons, opts.Compact) PrintSnapshots(globalOptions.stdout, keep, reasons, opts.Compact)
Printf("\n") Printf("\n")
} }
addJSONSnapshots(&fg.Keep, keep) fg.Keep = asJSONSnapshots(keep)
if len(remove) != 0 && !gopts.Quiet && !gopts.JSON { if len(remove) != 0 && !gopts.Quiet && !gopts.JSON {
Printf("remove %d snapshots:\n", len(remove)) Printf("remove %d snapshots:\n", len(remove))
PrintSnapshots(globalOptions.stdout, remove, nil, opts.Compact) PrintSnapshots(globalOptions.stdout, remove, nil, opts.Compact)
Printf("\n") Printf("\n")
} }
addJSONSnapshots(&fg.Remove, remove) fg.Remove = asJSONSnapshots(remove)
fg.Reasons = reasons fg.Reasons = asJSONKeeps(reasons)
jsonGroups = append(jsonGroups, &fg) jsonGroups = append(jsonGroups, &fg)
@ -307,18 +307,42 @@ type ForgetGroup struct {
Paths []string `json:"paths"` Paths []string `json:"paths"`
Keep []Snapshot `json:"keep"` Keep []Snapshot `json:"keep"`
Remove []Snapshot `json:"remove"` Remove []Snapshot `json:"remove"`
Reasons []restic.KeepReason `json:"reasons"` Reasons []KeepReason `json:"reasons"`
} }
func addJSONSnapshots(js *[]Snapshot, list restic.Snapshots) { func asJSONSnapshots(list restic.Snapshots) []Snapshot {
var resultList []Snapshot
for _, sn := range list { for _, sn := range list {
k := Snapshot{ k := Snapshot{
Snapshot: sn, Snapshot: sn,
ID: sn.ID(), ID: sn.ID(),
ShortID: sn.ID().Str(), ShortID: sn.ID().Str(),
} }
*js = append(*js, k) resultList = append(resultList, k)
} }
return resultList
}
// KeepReason helps to print KeepReasons as JSON with Snapshots with their ID included.
type KeepReason struct {
Snapshot Snapshot `json:"snapshot"`
Matches []string `json:"matches"`
}
func asJSONKeeps(list []restic.KeepReason) []KeepReason {
var resultList []KeepReason
for _, keep := range list {
k := KeepReason{
Snapshot: Snapshot{
Snapshot: keep.Snapshot,
ID: keep.Snapshot.ID(),
ShortID: keep.Snapshot.ID().Str(),
},
Matches: keep.Matches,
}
resultList = append(resultList, k)
}
return resultList
} }
func printJSONForget(stdout io.Writer, forgets []*ForgetGroup) error { func printJSONForget(stdout io.Writer, forgets []*ForgetGroup) error {

View file

@ -367,13 +367,13 @@ Snapshot object
Reason object Reason object
+----------------+---------------------------------------------------------+ +----------------+-----------------------------------------------------------+
| ``snapshot`` | Snapshot object, without ``id`` and ``short_id`` fields | | ``snapshot`` | Snapshot object, including ``id`` and ``short_id`` fields |
+----------------+---------------------------------------------------------+ +----------------+-----------------------------------------------------------+
| ``matches`` | Array containing descriptions of the matching criteria | | ``matches`` | Array containing descriptions of the matching criteria |
+----------------+---------------------------------------------------------+ +----------------+-----------------------------------------------------------+
| ``counters`` | Object containing counters used by the policies | | ``counters`` | Object containing counters used by the policies |
+----------------+---------------------------------------------------------+ +----------------+-----------------------------------------------------------+
init init