Files
kopia/cli/command_snapshot_delete.go
Jarek Kowalski e3854f7773 BREAKING: changed how hostname/username are handled
The hostname/username are now persisted when connecting to repository
in a local config file.

This prevents weird behavior changes when hostname is suddenly changed,
such as when moving between networks.

repo.Repository will now expose Hostname/Username properties which
are always guarnateed to be set, and are used throughout.

Removed --hostname/--username overrides when taking snapshot et.al.
2020-02-25 20:40:23 -08:00

68 lines
2.1 KiB
Go

package cli
import (
"context"
"github.com/pkg/errors"
"github.com/kopia/kopia/repo"
"github.com/kopia/kopia/repo/manifest"
)
var (
snapshotDeleteCommand = snapshotCommands.Command("delete", "Explicitly delete a snapshot by providing a snapshot ID.")
snapshotDeleteID = snapshotDeleteCommand.Arg("id", "Snapshot ID to be deleted").Required().String()
snapshotDeletePath = snapshotDeleteCommand.Flag("path", "Specify the path of the snapshot to be deleted").String()
snapshotDeleteHostname = snapshotDeleteCommand.Flag("hostname", "Specify the hostname of the snapshot to be deleted").String()
snapshotDeleteUsername = snapshotDeleteCommand.Flag("username", "Specify the username of the snapshot to be deleted").String()
snapshotDeleteIgnoreSource = snapshotDeleteCommand.Flag("unsafe-ignore-source", "Override the requirement to specify source info for the delete to succeed").Bool()
)
func runDeleteCommand(ctx context.Context, rep *repo.Repository) error {
if !*snapshotDeleteIgnoreSource && *snapshotDeletePath == "" {
return errors.New("path is required")
}
manifestID := manifest.ID(*snapshotDeleteID)
manifestMeta, err := rep.Manifests.GetMetadata(ctx, manifestID)
if err != nil {
return err
}
labels := manifestMeta.Labels
if labels["type"] != "snapshot" {
return errors.Errorf("snapshot ID provided (%v) did not reference a snapshot", manifestID)
}
if !*snapshotDeleteIgnoreSource {
h := *snapshotDeleteHostname
if h == "" {
h = rep.Hostname
}
if labels["hostname"] != h {
return errors.Errorf("host name does not match for deleting requested snapshot ID (got %q, expected %q)", h, labels["hostname"])
}
u := *snapshotDeleteUsername
if u == "" {
u = rep.Username
}
if labels["username"] != u {
return errors.Errorf("user name does not match for deleting requested snapshot ID (got %q, expected %q)", u, labels["username"])
}
if labels["path"] != *snapshotDeletePath {
return errors.New("path does not match for deleting requested snapshot ID")
}
}
return rep.Manifests.Delete(ctx, manifestID)
}
func init() {
snapshotDeleteCommand.Action(repositoryAction(runDeleteCommand))
}