mirror of
https://github.com/octoleo/restic.git
synced 2024-11-02 19:49:44 +00:00
Refactor tag
to use FindFilteredSnapshots()
This commit is contained in:
parent
3c6c17abcd
commit
3432e7edcd
@ -1,6 +1,8 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
"restic"
|
"restic"
|
||||||
@ -45,22 +47,14 @@ func init() {
|
|||||||
tagFlags.StringSliceVar(&tagOptions.AddTags, "add", nil, "`tag` which will be added to the existing tags (can be given multiple times)")
|
tagFlags.StringSliceVar(&tagOptions.AddTags, "add", nil, "`tag` which will be added to the existing tags (can be given multiple times)")
|
||||||
tagFlags.StringSliceVar(&tagOptions.RemoveTags, "remove", nil, "`tag` which will be removed from the existing tags (can be given multiple times)")
|
tagFlags.StringSliceVar(&tagOptions.RemoveTags, "remove", nil, "`tag` which will be removed from the existing tags (can be given multiple times)")
|
||||||
|
|
||||||
tagFlags.StringVarP(&tagOptions.Host, "host", "H", "", `only consider snapshots for this host, when no snapshot ID is given`)
|
tagFlags.StringVarP(&tagOptions.Host, "host", "H", "", "only consider snapshots for this `host`, when no snapshot ID is given")
|
||||||
tagFlags.StringSliceVar(&tagOptions.Tags, "tag", nil, "only consider snapshots which include this `tag`, when no snapshot-ID is given")
|
tagFlags.StringSliceVar(&tagOptions.Tags, "tag", nil, "only consider snapshots which include this `tag`, when no snapshot-ID is given")
|
||||||
tagFlags.StringSliceVar(&tagOptions.Paths, "path", nil, "only consider snapshots which include this (absolute) `path`, when no snapshot-ID is given")
|
tagFlags.StringSliceVar(&tagOptions.Paths, "path", nil, "only consider snapshots which include this (absolute) `path`, when no snapshot-ID is given")
|
||||||
}
|
}
|
||||||
|
|
||||||
func changeTags(repo *repository.Repository, snapshotID restic.ID, setTags, addTags, removeTags, tags, paths []string, host string) (bool, error) {
|
func changeTags(repo *repository.Repository, sn *restic.Snapshot, setTags, addTags, removeTags []string) (bool, error) {
|
||||||
var changed bool
|
var changed bool
|
||||||
|
|
||||||
sn, err := restic.LoadSnapshot(repo, snapshotID)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
if (host != "" && host != sn.Hostname) || !sn.HasTags(tags) || !sn.HasPaths(paths) {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(setTags) != 0 {
|
if len(setTags) != 0 {
|
||||||
// Setting the tag to an empty string really means no tags.
|
// Setting the tag to an empty string really means no tags.
|
||||||
if len(setTags) == 1 && setTags[0] == "" {
|
if len(setTags) == 1 && setTags[0] == "" {
|
||||||
@ -126,37 +120,13 @@ func runTag(opts TagOptions, gopts GlobalOptions, args []string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var ids restic.IDs
|
|
||||||
if len(args) != 0 {
|
|
||||||
// When explit snapshot-IDs are given, the filtering does not matter anymore.
|
|
||||||
opts.Host = ""
|
|
||||||
opts.Tags = nil
|
|
||||||
opts.Paths = nil
|
|
||||||
|
|
||||||
// Process all snapshot IDs given as arguments.
|
|
||||||
for _, s := range args {
|
|
||||||
snapshotID, err := restic.FindSnapshot(repo, s)
|
|
||||||
if err != nil {
|
|
||||||
Warnf("could not find a snapshot for ID %q, ignoring: %v\n", s, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
ids = append(ids, snapshotID)
|
|
||||||
}
|
|
||||||
ids = ids.Uniq()
|
|
||||||
} else {
|
|
||||||
// If there were no arguments, just get all snapshots.
|
|
||||||
done := make(chan struct{})
|
|
||||||
defer close(done)
|
|
||||||
for snapshotID := range repo.List(restic.SnapshotFile, done) {
|
|
||||||
ids = append(ids, snapshotID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
changeCnt := 0
|
changeCnt := 0
|
||||||
for _, id := range ids {
|
ctx, cancel := context.WithCancel(gopts.ctx)
|
||||||
changed, err := changeTags(repo, id, opts.SetTags, opts.AddTags, opts.RemoveTags, opts.Tags, opts.Paths, opts.Host)
|
defer cancel()
|
||||||
|
for sn := range FindFilteredSnapshots(ctx, repo, opts.Host, opts.Tags, opts.Paths, args) {
|
||||||
|
changed, err := changeTags(repo, sn, opts.SetTags, opts.AddTags, opts.RemoveTags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Warnf("unable to modify the tags for snapshot ID %q, ignoring: %v\n", id, err)
|
Warnf("unable to modify the tags for snapshot ID %q, ignoring: %v\n", sn.ID(), err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if changed {
|
if changed {
|
||||||
|
Loading…
Reference in New Issue
Block a user