github.com/sashka/siva@v1.6.0/cmd/siva/siva.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 7 "gopkg.in/src-d/go-siva.v1" 8 9 "github.com/jessevdk/go-flags" 10 ) 11 12 func main() { 13 parser := flags.NewNamedParser("siva", flags.Default) 14 parser.AddCommand("pack", "Create a new archive containing the specified items.", "", &CmdPack{}) 15 parser.AddCommand("unpack", "Extract to disk from the archive.", "", &CmdUnpack{}) 16 parser.AddCommand("list", "List the items contained on a file.", "", &CmdList{}) 17 parser.AddCommand("version", "Show the version information.", "", &CmdVersion{}) 18 19 _, err := parser.Parse() 20 if err != nil { 21 if e, ok := err.(*flags.Error); ok && e.Type == flags.ErrCommandRequired { 22 parser.WriteHelp(os.Stdout) 23 } 24 25 os.Exit(1) 26 } 27 } 28 29 type cmd struct { 30 Verbose bool `short:"v" description:"Activates the verbose mode"` 31 Args struct { 32 File string `positional-arg-name:"siva-file" required:"true" description:"siva file."` 33 } `positional-args:"yes"` 34 35 f *os.File 36 fi os.FileInfo 37 r siva.Reader 38 w siva.Writer 39 } 40 41 func (c *cmd) validate() error { 42 if c.Args.File == "" { 43 return fmt.Errorf("Missing .siva file, please provide a valid one.") 44 } 45 return nil 46 } 47 48 func (c *cmd) buildReader() (err error) { 49 c.f, err = os.Open(c.Args.File) 50 if err != nil { 51 return fmt.Errorf("error opening file: %s", err) 52 } 53 54 c.r = siva.NewReader(c.f) 55 return nil 56 } 57 58 func (c *cmd) buildWriter(append bool) (err error) { 59 flags := os.O_WRONLY 60 if append { 61 flags |= os.O_APPEND 62 } else { 63 flags |= os.O_CREATE | os.O_TRUNC 64 } 65 66 c.f, err = os.OpenFile(c.Args.File, flags, 0666) 67 if err != nil { 68 return fmt.Errorf("error creating file: %s", err) 69 } 70 71 c.fi, err = c.f.Stat() 72 if err != nil { 73 _ = c.f.Close() 74 return err 75 } 76 77 c.w = siva.NewWriter(c.f) 78 return nil 79 } 80 81 func (c *cmd) println(a ...interface{}) { 82 if !c.Verbose { 83 return 84 } 85 86 fmt.Println(a...) 87 } 88 89 func (c *cmd) close() (err error) { 90 defer func() { 91 if errC := c.f.Close(); errC != nil && err == nil { 92 err = errC 93 } 94 }() 95 96 if c.w != nil { 97 if err = c.w.Close(); err != nil { 98 return 99 } 100 } 101 102 return 103 }