restic/internal/restic/config.go

106 lines
2.5 KiB
Go
Raw Normal View History

2016-08-31 20:39:36 +00:00
package restic
2015-07-02 20:36:31 +00:00
import (
2017-06-04 09:16:55 +00:00
"context"
"testing"
2015-07-02 20:36:31 +00:00
2017-07-23 12:21:03 +00:00
"github.com/restic/restic/internal/errors"
2017-07-23 12:21:03 +00:00
"github.com/restic/restic/internal/debug"
"github.com/restic/chunker"
2015-07-02 20:36:31 +00:00
)
// Config contains the configuration for a repository.
type Config struct {
Version uint `json:"version"`
ID string `json:"id"`
ChunkerPolynomial chunker.Pol `json:"chunker_polynomial"`
}
const MinRepoVersion = 1
const MaxRepoVersion = 2
// StableRepoVersion is the version that is written to the config when a repository
2015-07-02 20:36:31 +00:00
// is newly created with Init().
const StableRepoVersion = 2
2015-07-02 20:36:31 +00:00
// JSONUnpackedLoader loads unpacked JSON.
type JSONUnpackedLoader interface {
2017-06-04 09:16:55 +00:00
LoadJSONUnpacked(context.Context, FileType, ID, interface{}) error
2015-07-02 20:36:31 +00:00
}
// CreateConfig creates a config file with a randomly selected polynomial and
// ID.
func CreateConfig(version uint) (Config, error) {
2015-07-02 20:36:31 +00:00
var (
err error
cfg Config
)
cfg.ChunkerPolynomial, err = chunker.RandomPolynomial()
if err != nil {
2016-08-29 20:16:58 +00:00
return Config{}, errors.Wrap(err, "chunker.RandomPolynomial")
2015-07-02 20:36:31 +00:00
}
cfg.ID = NewRandomID().String()
cfg.Version = version
2015-07-02 20:36:31 +00:00
2016-09-27 20:35:08 +00:00
debug.Log("New config: %#v", cfg)
return cfg, nil
2015-07-02 20:36:31 +00:00
}
// TestCreateConfig creates a config for use within tests.
func TestCreateConfig(t testing.TB, pol chunker.Pol, version uint) (cfg Config) {
cfg.ChunkerPolynomial = pol
cfg.ID = NewRandomID().String()
if version == 0 {
version = StableRepoVersion
}
if version < MinRepoVersion || version > MaxRepoVersion {
t.Fatalf("version %d is out of range", version)
}
cfg.Version = version
return cfg
}
var checkPolynomial = true
// TestDisableCheckPolynomial disables the check that the polynomial used for
// the chunker.
func TestDisableCheckPolynomial(t testing.TB) {
t.Logf("disabling check of the chunker polynomial")
checkPolynomial = false
}
2015-07-02 20:36:31 +00:00
// LoadConfig returns loads, checks and returns the config for a repository.
func LoadConfig(ctx context.Context, r LoaderUnpacked) (Config, error) {
2015-07-02 20:36:31 +00:00
var (
cfg Config
)
err := LoadJSONUnpacked(ctx, r, ConfigFile, ID{}, &cfg)
2015-07-02 20:36:31 +00:00
if err != nil {
return Config{}, err
}
if cfg.Version < MinRepoVersion || cfg.Version > MaxRepoVersion {
return Config{}, errors.Errorf("unsupported repository version %v", cfg.Version)
2015-07-02 20:36:31 +00:00
}
if checkPolynomial {
if !cfg.ChunkerPolynomial.Irreducible() {
return Config{}, errors.New("invalid chunker polynomial")
}
2015-07-02 20:36:31 +00:00
}
return cfg, nil
}
func SaveConfig(ctx context.Context, r SaverUnpacked, cfg Config) error {
_, err := SaveJSONUnpacked(ctx, r, ConfigFile, cfg)
return err
}