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