2015-06-21 11:02:56 +00:00
package main
import (
2020-09-19 10:41:52 +00:00
"github.com/restic/chunker"
2020-03-20 22:52:27 +00:00
"github.com/restic/restic/internal/backend/location"
2017-07-23 12:21:03 +00:00
"github.com/restic/restic/internal/errors"
"github.com/restic/restic/internal/repository"
2016-09-17 10:36:05 +00:00
"github.com/spf13/cobra"
2015-06-21 11:02:56 +00:00
)
2016-09-17 10:36:05 +00:00
var cmdInit = & cobra . Command {
Use : "init" ,
2017-09-11 16:32:44 +00:00
Short : "Initialize a new repository" ,
2016-09-17 10:36:05 +00:00
Long : `
The "init" command initializes a new repository .
2019-11-05 06:03:38 +00:00
EXIT STATUS
== == == == == =
Exit status is 0 if the command was successful , and non - zero if there was any error .
2016-09-17 10:36:05 +00:00
` ,
2017-08-06 19:02:16 +00:00
DisableAutoGenTag : true ,
2016-09-17 10:36:05 +00:00
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
2020-09-19 10:41:52 +00:00
return runInit ( initOptions , globalOptions , args )
2016-09-17 10:36:05 +00:00
} ,
2015-06-21 11:02:56 +00:00
}
2020-09-19 10:41:52 +00:00
// InitOptions bundles all options for the init command.
type InitOptions struct {
secondaryRepoOptions
CopyChunkerParameters bool
}
var initOptions InitOptions
2016-09-17 10:36:05 +00:00
func init ( ) {
cmdRoot . AddCommand ( cmdInit )
2020-09-19 10:41:52 +00:00
f := cmdInit . Flags ( )
initSecondaryRepoOptions ( f , & initOptions . secondaryRepoOptions , "secondary" , "to copy chunker parameters from" )
f . BoolVar ( & initOptions . CopyChunkerParameters , "copy-chunker-params" , false , "copy chunker parameters from the secondary repository (useful with the copy command)" )
2016-09-17 10:36:05 +00:00
}
2020-09-19 10:41:52 +00:00
func runInit ( opts InitOptions , gopts GlobalOptions , args [ ] string ) error {
chunkerPolynomial , err := maybeReadChunkerPolynomial ( opts , gopts )
if err != nil {
return err
}
2020-08-30 21:20:57 +00:00
repo , err := ReadRepo ( gopts )
if err != nil {
return err
}
2017-07-24 21:15:31 +00:00
gopts . password , err = ReadPasswordTwice ( gopts ,
2018-01-20 08:51:49 +00:00
"enter password for new repository: " ,
2017-07-24 21:15:31 +00:00
"enter password again: " )
if err != nil {
return err
2015-06-21 11:02:56 +00:00
}
2021-02-14 19:39:28 +00:00
be , err := create ( repo , gopts . extended )
if err != nil {
return errors . Fatalf ( "create repository at %s failed: %v\n" , location . StripPassword ( gopts . Repo ) , err )
}
2016-03-06 12:14:06 +00:00
s := repository . New ( be )
2016-03-06 11:34:23 +00:00
2020-09-19 10:41:52 +00:00
err = s . Init ( gopts . ctx , gopts . password , chunkerPolynomial )
2015-06-21 11:02:56 +00:00
if err != nil {
2020-03-20 22:52:27 +00:00
return errors . Fatalf ( "create key in repository at %s failed: %v\n" , location . StripPassword ( gopts . Repo ) , err )
2015-06-21 11:02:56 +00:00
}
2020-03-20 22:52:27 +00:00
Verbosef ( "created restic repository %v at %s\n" , s . Config ( ) . ID [ : 10 ] , location . StripPassword ( gopts . Repo ) )
2016-09-17 10:36:05 +00:00
Verbosef ( "\n" )
Verbosef ( "Please note that knowledge of your password is required to access\n" )
Verbosef ( "the repository. Losing your password means that your data is\n" )
Verbosef ( "irrecoverably lost.\n" )
2015-06-21 11:02:56 +00:00
return nil
}
2020-09-19 10:41:52 +00:00
func maybeReadChunkerPolynomial ( opts InitOptions , gopts GlobalOptions ) ( * chunker . Pol , error ) {
if opts . CopyChunkerParameters {
otherGopts , err := fillSecondaryGlobalOpts ( opts . secondaryRepoOptions , gopts , "secondary" )
if err != nil {
return nil , err
}
otherRepo , err := OpenRepository ( otherGopts )
if err != nil {
return nil , err
}
pol := otherRepo . Config ( ) . ChunkerPolynomial
return & pol , nil
}
if opts . Repo != "" {
return nil , errors . Fatal ( "Secondary repository must only be specified when copying the chunker parameters" )
}
return nil , nil
}