mirror of
https://github.com/kopia/kopia.git
synced 2026-01-25 23:08:01 -05:00
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.
68 lines
2.1 KiB
Go
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))
|
|
}
|