21 func (ent *Ent) IsDir() bool {
22 return IsDir(ent.name[len(ent.name)-1])
25 func dbCommit(dbPath string, tmp *os.File) {
26 umask := syscall.Umask(0)
28 if err := os.Chmod(tmp.Name(), os.FileMode(0666&^umask)); err != nil {
31 if err := os.Rename(tmp.Name(), dbPath); err != nil {
37 dbPath := flag.String("db", "glocate.db", "Path to database")
38 doIndex := flag.Bool("index", false, "Perform indexing")
39 doUpdate := flag.String("update", "", "Update database")
40 showMachine := flag.Bool("machine", false, "Show machine friendly")
41 showTree := flag.Bool("tree", false, "Show human-friendly tree")
42 dryRun := flag.Bool("n", false, "Dry run, do not overwrite database")
43 rootPath := flag.String("root", "", "Search only that part of tree")
45 log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile)
48 TmpDir, err = filepath.Abs(*dbPath)
52 TmpDir = path.Dir(TmpDir)
58 dbCommit(*dbPath, tmp)
64 tmp := updateWithDiff(*dbPath, *doUpdate)
67 dbCommit(*dbPath, tmp)
72 db, err := os.Open(*dbPath)
76 entsReader := make(chan Ent, 1<<10)
77 go reader(db, entsReader)
79 entsPrinter := make(chan Ent, 1<<10)
80 printerJob := make(chan struct{})
83 printerMachine(entsPrinter)
85 printerTree(entsPrinter)
87 printerSimple(entsPrinter)
94 root = strings.Split("./"+*rootPath, "/")
98 if len(flag.Args()) > 0 {
99 pat = "*" + flag.Arg(0) + "*"
104 var namePrev []string
106 for ent := range entsReader {
107 if hasPrefix(ent.name, root) {
113 for i = 0; i < len(ent.name); i++ {
114 if i == len(namePrev) || ent.name[i] != namePrev[i] {
118 for ; i < len(ent.name); i++ {
119 matched, err = path.Match(pat,
120 strings.ToLower(strings.TrimSuffix(ent.name[i], "/")))