]> Sergey Matveev's repositories - glocate.git/blob - main.go
Return zstd back
[glocate.git] / main.go
1 package main
2
3 import (
4         "flag"
5         "log"
6         "os"
7         "strings"
8         "syscall"
9 )
10
11 type Ent struct {
12         name  []string
13         mtime int64
14         size  int64
15 }
16
17 func (ent *Ent) IsDir() bool {
18         return IsDir(ent.name[len(ent.name)-1])
19 }
20
21 func dbCommit(dbPath string, tmp *os.File) {
22         umask := syscall.Umask(0)
23         syscall.Umask(umask)
24         if err := os.Chmod(tmp.Name(), os.FileMode(0666&^umask)); err != nil {
25                 log.Fatalln(err)
26         }
27         if err := os.Rename(tmp.Name(), dbPath); err != nil {
28                 log.Fatalln(err)
29         }
30 }
31
32 func main() {
33         dbPath := flag.String("db", "glocate.db", "Path to database")
34         doIndex := flag.Bool("index", false, "Perform indexing")
35         doUpdate := flag.Bool("update", false, "Feed zfs-diff and update the database")
36         strip := flag.String("strip", "", "Strip prefix from zfs-diff's paths")
37         showMachine := flag.Bool("machine", false, "Show machine friendly")
38         showTree := flag.Bool("tree", false, "Show human-friendly tree")
39         dryRun := flag.Bool("n", false, "Dry run, do not overwrite database")
40         flag.Parse()
41         log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile)
42
43         if *doIndex {
44                 tmp := index()
45                 tmp.Close()
46                 if !*dryRun {
47                         dbCommit(*dbPath, tmp)
48                 }
49                 return
50         }
51
52         if *doUpdate {
53                 tmp := updateWithDiff(*dbPath, *strip)
54                 tmp.Close()
55                 if !*dryRun {
56                         dbCommit(*dbPath, tmp)
57                 }
58                 return
59         }
60
61         db, err := os.Open(*dbPath)
62         if err != nil {
63                 log.Fatalln(err)
64         }
65         entsReader := make(chan Ent, 1<<10)
66         go reader(db, entsReader)
67
68         entsPrinter := make(chan Ent, 1<<10)
69         printerJob := make(chan struct{})
70         go func() {
71                 if *showMachine {
72                         printerMachine(entsPrinter)
73                 } else if *showTree {
74                         printerTree(entsPrinter)
75                 } else {
76                         printerSimple(entsPrinter)
77                 }
78                 close(printerJob)
79         }()
80
81         var root []string
82         if len(flag.Args()) > 0 {
83                 root = strings.Split("./"+flag.Arg(0), "/")
84         }
85
86         rootMet := false
87         for ent := range entsReader {
88                 if hasPrefix(ent.name, root) {
89                         entsPrinter <- ent
90                         rootMet = true
91                 } else if rootMet {
92                         break
93                 }
94         }
95         close(entsPrinter)
96         <-printerJob
97 }