mirror of
https://github.com/restic/restic.git
synced 2025-08-13 09:37:39 +00:00
Support specifying multiple host flags for various commands
The `dump`, `find`, `forget`, `ls`, `mount`, `restore`, `snapshots`, `stats` and `tag` commands will now take into account multiple `--host` and `-H` flags.
This commit is contained in:
@@ -19,7 +19,7 @@ import (
|
||||
// Config holds settings for the fuse mount.
|
||||
type Config struct {
|
||||
OwnerIsRoot bool
|
||||
Host string
|
||||
Hosts []string
|
||||
Tags []restic.TagList
|
||||
Paths []string
|
||||
SnapshotTemplate string
|
||||
|
@@ -234,7 +234,7 @@ func updateSnapshots(ctx context.Context, root *Root) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
snapshots, err := restic.FindFilteredSnapshots(ctx, root.repo, root.cfg.Host, root.cfg.Tags, root.cfg.Paths)
|
||||
snapshots, err := restic.FindFilteredSnapshots(ctx, root.repo, root.cfg.Hosts, root.cfg.Tags, root.cfg.Paths)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@@ -162,8 +162,10 @@ func (sn *Snapshot) HasTags(l []string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// HasTagList returns true if the snapshot satisfies at least one TagList,
|
||||
// so there is a TagList in l for which all tags are included in sn.
|
||||
// HasTagList returns true if either
|
||||
// - the snapshot satisfies at least one TagList, so there is a TagList in l
|
||||
// for which all tags are included in sn, or
|
||||
// - l is empty
|
||||
func (sn *Snapshot) HasTagList(l []TagList) bool {
|
||||
debug.Log("testing snapshot with tags %v against list: %v", sn.Tags, l)
|
||||
|
||||
@@ -201,6 +203,23 @@ func (sn *Snapshot) HasPaths(paths []string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// HasHostname returns true if either
|
||||
// - the snapshot hostname is in the list of the given hostnames, or
|
||||
// - the list of given hostnames is empty
|
||||
func (sn *Snapshot) HasHostname(hostnames []string) bool {
|
||||
if len(hostnames) == 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
for _, hostname := range hostnames {
|
||||
if sn.Hostname == hostname {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Snapshots is a list of snapshots.
|
||||
type Snapshots []*Snapshot
|
||||
|
||||
|
@@ -14,7 +14,7 @@ import (
|
||||
var ErrNoSnapshotFound = errors.New("no snapshot found")
|
||||
|
||||
// FindLatestSnapshot finds latest snapshot with optional target/directory, tags and hostname filters.
|
||||
func FindLatestSnapshot(ctx context.Context, repo Repository, targets []string, tagLists []TagList, hostname string) (ID, error) {
|
||||
func FindLatestSnapshot(ctx context.Context, repo Repository, targets []string, tagLists []TagList, hostnames []string) (ID, error) {
|
||||
var err error
|
||||
absTargets := make([]string, 0, len(targets))
|
||||
for _, target := range targets {
|
||||
@@ -38,7 +38,12 @@ func FindLatestSnapshot(ctx context.Context, repo Repository, targets []string,
|
||||
if err != nil {
|
||||
return errors.Errorf("Error loading snapshot %v: %v", snapshotID.Str(), err)
|
||||
}
|
||||
if snapshot.Time.Before(latest) || (hostname != "" && hostname != snapshot.Hostname) {
|
||||
|
||||
if snapshot.Time.Before(latest) {
|
||||
return nil
|
||||
}
|
||||
|
||||
if !snapshot.HasHostname(hostnames) {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -82,7 +87,7 @@ func FindSnapshot(repo Repository, s string) (ID, error) {
|
||||
|
||||
// FindFilteredSnapshots yields Snapshots filtered from the list of all
|
||||
// snapshots.
|
||||
func FindFilteredSnapshots(ctx context.Context, repo Repository, host string, tags []TagList, paths []string) (Snapshots, error) {
|
||||
func FindFilteredSnapshots(ctx context.Context, repo Repository, hosts []string, tags []TagList, paths []string) (Snapshots, error) {
|
||||
results := make(Snapshots, 0, 20)
|
||||
|
||||
err := repo.List(ctx, SnapshotFile, func(id ID, size int64) error {
|
||||
@@ -92,7 +97,7 @@ func FindFilteredSnapshots(ctx context.Context, repo Repository, host string, ta
|
||||
return nil
|
||||
}
|
||||
|
||||
if (host != "" && host != sn.Hostname) || !sn.HasTagList(tags) || !sn.HasPaths(paths) {
|
||||
if !sn.HasHostname(hosts) || !sn.HasTagList(tags) || !sn.HasPaths(paths) {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user