pickrand.go: use longer random buffer
[cmccabe-bin] / recursive_decompress.go
1 package main
2
3 import (
4         "flag"
5         "os/exec"
6         "path/filepath"
7         "fmt"
8         "os"
9         "strings"
10 )
11
12 var removeArchives *bool
13
14 func processPath(curPath string) error {
15         info, err := os.Stat(curPath)
16         if err != nil {
17                 return fmt.Errorf("Unable to stat %s: %s", curPath, err.Error())
18         }
19         if info.IsDir() {
20                 entries, err := os.ReadDir(curPath)
21                 if err != nil {
22                         return fmt.Errorf("Unable to call readdir on %s: %s", curPath, err.Error())
23                 }
24                 for i := range(entries) {
25                         err := processPath(filepath.Join(curPath, entries[i].Name()))
26                         if err != nil {
27                                 return err
28                         }
29                 }
30         } else {
31                 tarBaseName := tarBaseName(curPath)
32                 if tarBaseName != "" {
33                         err = applyTarOn(curPath)
34                         if err != nil {
35                                 return err
36                         }
37                         err = processPath(filepath.Join(filepath.Dir(curPath), tarBaseName))
38                         if err != nil {
39                                 return err
40                         }
41                         if *removeArchives {
42                                 err = os.Remove(curPath)
43                                 if err != nil {
44                                         return fmt.Errorf("Unable to remove archive file %s: %s", curPath, err.Error())
45                                 }
46                                 fmt.Printf("== rm %s\n", curPath)
47                         }
48                 }
49         }
50         return nil
51 }
52
53 func tarBaseName(curPath string) string {
54         if strings.HasSuffix(curPath, ".tgz") {
55                 return filepath.Base(curPath[:len(curPath)-4])
56         }
57         return ""
58 }
59
60 func applyTarOn(curPath string) error {
61         fmt.Printf("== decompressing tar file %s\n", curPath)
62         cmd := exec.Command("tar", "xvf", filepath.Base(curPath))
63         cmd.Dir = filepath.Dir(curPath)
64         //cmd.Stdout = os.Stdout
65         err := cmd.Run()
66         if err != nil {
67                 return fmt.Errorf("error running tar xvf on %s: %s", curPath, err.Error())
68         }
69         return nil
70 }
71
72 func main() {
73         removeArchives = flag.Bool("r", false, "Remove archive files after decompressing them")
74         flag.Usage = func() {
75                 fmt.Printf("recursive_decompress: recursively decompresses a path.\n")
76                 fmt.Printf("usage: recursive_decompress [flags] [paths...]\n")
77                 fmt.Printf("\n")
78                 flag.PrintDefaults()
79         }
80         flag.Parse()
81         curPath := "."
82         if flag.Arg(0) != "" {
83                 curPath = flag.Arg(0)
84         }
85         err := processPath(curPath)
86         if err != nil {
87                 fmt.Printf("error: %s\n", err.Error())
88                 os.Exit(1)
89         }
90         os.Exit(0)
91 }