mirror of
https://github.com/restic/restic.git
synced 2024-12-29 03:06:01 +00:00
7af69fd7b9
There's no point in locking the repository just to list the currently existing lock files. This won't work for an exclusively locked repository and is also confusing to users.
80 lines
1.7 KiB
Go
80 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"github.com/restic/restic/internal/errors"
|
|
"github.com/restic/restic/internal/repository"
|
|
"github.com/restic/restic/internal/restic"
|
|
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var cmdList = &cobra.Command{
|
|
Use: "list [flags] [blobs|packs|index|snapshots|keys|locks]",
|
|
Short: "List objects in the repository",
|
|
Long: `
|
|
The "list" command allows listing objects in the repository based on type.
|
|
|
|
EXIT STATUS
|
|
===========
|
|
|
|
Exit status is 0 if the command was successful, and non-zero if there was any error.
|
|
`,
|
|
DisableAutoGenTag: true,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
return runList(cmd, globalOptions, args)
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
cmdRoot.AddCommand(cmdList)
|
|
}
|
|
|
|
func runList(cmd *cobra.Command, opts GlobalOptions, args []string) error {
|
|
if len(args) != 1 {
|
|
return errors.Fatal("type not specified, usage: " + cmd.Use)
|
|
}
|
|
|
|
repo, err := OpenRepository(opts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if !opts.NoLock && args[0] != "locks" {
|
|
lock, err := lockRepo(opts.ctx, repo)
|
|
defer unlockRepo(lock)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
var t restic.FileType
|
|
switch args[0] {
|
|
case "packs":
|
|
t = restic.PackFile
|
|
case "index":
|
|
t = restic.IndexFile
|
|
case "snapshots":
|
|
t = restic.SnapshotFile
|
|
case "keys":
|
|
t = restic.KeyFile
|
|
case "locks":
|
|
t = restic.LockFile
|
|
case "blobs":
|
|
return repository.ForAllIndexes(opts.ctx, repo, func(id restic.ID, idx *repository.Index, oldFormat bool, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for blobs := range idx.Each(opts.ctx) {
|
|
Printf("%v %v\n", blobs.Type, blobs.ID)
|
|
}
|
|
return nil
|
|
})
|
|
default:
|
|
return errors.Fatal("invalid type")
|
|
}
|
|
|
|
return repo.List(opts.ctx, t, func(id restic.ID, size int64) error {
|
|
Printf("%s\n", id)
|
|
return nil
|
|
})
|
|
}
|