From df07814ec266d641466885318b6ed7889b4c889a Mon Sep 17 00:00:00 2001 From: Stephan Paul Date: Mon, 25 Mar 2024 15:42:15 +0100 Subject: [PATCH] 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 --- changelog/unreleased/pull-4737 | 5 ++++ cmd/restic/cmd_forget.go | 46 ++++++++++++++++++++++++++-------- doc/075_scripting.rst | 14 +++++------ 3 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 changelog/unreleased/pull-4737 diff --git a/changelog/unreleased/pull-4737 b/changelog/unreleased/pull-4737 new file mode 100644 index 000000000..2637c8f83 --- /dev/null +++ b/changelog/unreleased/pull-4737 @@ -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 diff --git a/cmd/restic/cmd_forget.go b/cmd/restic/cmd_forget.go index f2fc1da8c..d634576c0 100644 --- a/cmd/restic/cmd_forget.go +++ b/cmd/restic/cmd_forget.go @@ -245,16 +245,16 @@ func runForget(ctx context.Context, opts ForgetOptions, pruneOptions PruneOption PrintSnapshots(globalOptions.stdout, keep, reasons, opts.Compact) Printf("\n") } - addJSONSnapshots(&fg.Keep, keep) + fg.Keep = asJSONSnapshots(keep) if len(remove) != 0 && !gopts.Quiet && !gopts.JSON { Printf("remove %d snapshots:\n", len(remove)) PrintSnapshots(globalOptions.stdout, remove, nil, opts.Compact) Printf("\n") } - addJSONSnapshots(&fg.Remove, remove) + fg.Remove = asJSONSnapshots(remove) - fg.Reasons = reasons + fg.Reasons = asJSONKeeps(reasons) jsonGroups = append(jsonGroups, &fg) @@ -302,23 +302,47 @@ func runForget(ctx context.Context, opts ForgetOptions, pruneOptions PruneOption // ForgetGroup helps to print what is forgotten in JSON. type ForgetGroup struct { - Tags []string `json:"tags"` - Host string `json:"host"` - Paths []string `json:"paths"` - Keep []Snapshot `json:"keep"` - Remove []Snapshot `json:"remove"` - Reasons []restic.KeepReason `json:"reasons"` + Tags []string `json:"tags"` + Host string `json:"host"` + Paths []string `json:"paths"` + Keep []Snapshot `json:"keep"` + Remove []Snapshot `json:"remove"` + Reasons []KeepReason `json:"reasons"` } -func addJSONSnapshots(js *[]Snapshot, list restic.Snapshots) { +func asJSONSnapshots(list restic.Snapshots) []Snapshot { + var resultList []Snapshot for _, sn := range list { k := Snapshot{ Snapshot: sn, ID: sn.ID(), 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 { diff --git a/doc/075_scripting.rst b/doc/075_scripting.rst index d51516cbe..28419c292 100644 --- a/doc/075_scripting.rst +++ b/doc/075_scripting.rst @@ -367,13 +367,13 @@ Snapshot object Reason object -+----------------+---------------------------------------------------------+ -| ``snapshot`` | Snapshot object, without ``id`` and ``short_id`` fields | -+----------------+---------------------------------------------------------+ -| ``matches`` | Array containing descriptions of the matching criteria | -+----------------+---------------------------------------------------------+ -| ``counters`` | Object containing counters used by the policies | -+----------------+---------------------------------------------------------+ ++----------------+-----------------------------------------------------------+ +| ``snapshot`` | Snapshot object, including ``id`` and ``short_id`` fields | ++----------------+-----------------------------------------------------------+ +| ``matches`` | Array containing descriptions of the matching criteria | ++----------------+-----------------------------------------------------------+ +| ``counters`` | Object containing counters used by the policies | ++----------------+-----------------------------------------------------------+ init