github.com/mckael/restic@v0.8.3/cmd/restic/cmd_generate.go (about)

     1  package main
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/restic/restic/internal/errors"
     7  	"github.com/spf13/cobra"
     8  	"github.com/spf13/cobra/doc"
     9  )
    10  
    11  var cmdGenerate = &cobra.Command{
    12  	Use:   "generate [command]",
    13  	Short: "Generate manual pages and auto-completion files (bash, zsh)",
    14  	Long: `
    15  The "generate" command writes automatically generated files like the man pages
    16  and the auto-completion files for bash and zsh).
    17  `,
    18  	DisableAutoGenTag: true,
    19  	RunE:              runGenerate,
    20  }
    21  
    22  type generateOptions struct {
    23  	ManDir             string
    24  	BashCompletionFile string
    25  	ZSHCompletionFile  string
    26  }
    27  
    28  var genOpts generateOptions
    29  
    30  func init() {
    31  	cmdRoot.AddCommand(cmdGenerate)
    32  	fs := cmdGenerate.Flags()
    33  	fs.StringVar(&genOpts.ManDir, "man", "", "write man pages to `directory`")
    34  	fs.StringVar(&genOpts.BashCompletionFile, "bash-completion", "", "write bash completion `file`")
    35  	fs.StringVar(&genOpts.ZSHCompletionFile, "zsh-completion", "", "write zsh completion `file`")
    36  }
    37  
    38  func writeManpages(dir string) error {
    39  	// use a fixed date for the man pages so that generating them is deterministic
    40  	date, err := time.Parse("Jan 2006", "Jan 2017")
    41  	if err != nil {
    42  		return err
    43  	}
    44  
    45  	header := &doc.GenManHeader{
    46  		Title:   "restic backup",
    47  		Section: "1",
    48  		Source:  "generated by `restic generate`",
    49  		Date:    &date,
    50  	}
    51  
    52  	Verbosef("writing man pages to directory %v\n", dir)
    53  	return doc.GenManTree(cmdRoot, header, dir)
    54  }
    55  
    56  func writeBashCompletion(file string) error {
    57  	Verbosef("writing bash completion file to %v\n", file)
    58  	return cmdRoot.GenBashCompletionFile(file)
    59  }
    60  
    61  func writeZSHCompletion(file string) error {
    62  	Verbosef("writing zsh completion file to %v\n", file)
    63  	return cmdRoot.GenZshCompletionFile(file)
    64  }
    65  
    66  func runGenerate(cmd *cobra.Command, args []string) error {
    67  	if genOpts.ManDir != "" {
    68  		err := writeManpages(genOpts.ManDir)
    69  		if err != nil {
    70  			return err
    71  		}
    72  	}
    73  
    74  	if genOpts.BashCompletionFile != "" {
    75  		err := writeBashCompletion(genOpts.BashCompletionFile)
    76  		if err != nil {
    77  			return err
    78  		}
    79  	}
    80  
    81  	if genOpts.ZSHCompletionFile != "" {
    82  		err := writeZSHCompletion(genOpts.ZSHCompletionFile)
    83  		if err != nil {
    84  			return err
    85  		}
    86  	}
    87  
    88  	var empty generateOptions
    89  	if genOpts == empty {
    90  		return errors.Fatal("nothing to do, please specify at least one output file/dir")
    91  	}
    92  
    93  	return nil
    94  }