diff --git a/cmd/stbak/cmd/inventory_stat.go b/cmd/stbak/cmd/inventory_stat.go new file mode 100644 index 0000000..4cb33ec --- /dev/null +++ b/cmd/stbak/cmd/inventory_stat.go @@ -0,0 +1,48 @@ +package cmd + +import ( + "github.com/pojntfx/stfs/internal/logging" + "github.com/pojntfx/stfs/internal/persisters" + "github.com/pojntfx/stfs/pkg/config" + "github.com/pojntfx/stfs/pkg/inventory" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var inventoryStatCmd = &cobra.Command{ + Use: "stat", + Aliases: []string{"sta", "s"}, + Short: "Get information on a file or directory on tape or tar file", + RunE: func(cmd *cobra.Command, args []string) error { + if err := viper.BindPFlags(cmd.PersistentFlags()); err != nil { + return err + } + + metadataPersister := persisters.NewMetadataPersister(viper.GetString(metadataFlag)) + if err := metadataPersister.Open(); err != nil { + return err + } + + if _, err := inventory.Stat( + config.MetadataConfig{ + Metadata: metadataPersister, + }, + + viper.GetString(nameFlag), + + logging.NewLogger().PrintHeader, + ); err != nil { + return err + } + + return nil + }, +} + +func init() { + inventoryStatCmd.PersistentFlags().StringP(nameFlag, "n", "", "File or directory to get info for") + + viper.AutomaticEnv() + + inventoryCmd.AddCommand(inventoryStatCmd) +} diff --git a/pkg/inventory/stat.go b/pkg/inventory/stat.go new file mode 100644 index 0000000..bdbcf8e --- /dev/null +++ b/pkg/inventory/stat.go @@ -0,0 +1,43 @@ +package inventory + +import ( + "archive/tar" + "context" + "database/sql" + "strings" + + "github.com/pojntfx/stfs/internal/converters" + models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" + "github.com/pojntfx/stfs/pkg/config" +) + +func Stat( + metadata config.MetadataConfig, + + name string, + + onHeader func(hdr *models.Header), +) (*tar.Header, error) { + dbhdr, err := metadata.Metadata.GetHeader(context.Background(), name) + if err != nil { + if err == sql.ErrNoRows { + dbhdr, err = metadata.Metadata.GetHeader(context.Background(), strings.TrimSuffix(name, "/")+"/") + if err != nil { + return nil, err + } + } else { + return nil, err + } + } + + hdr, err := converters.DBHeaderToTarHeader(dbhdr) + if err != nil { + return nil, err + } + + if onHeader != nil { + onHeader(dbhdr) + } + + return hdr, nil +}