18 func (ent *Ent) IsDir() bool {
19 return IsDir(ent.name[len(ent.name)-1])
22 func dbCommit(dbPath string, tmp *os.File) {
23 umask := syscall.Umask(0)
25 if err := os.Chmod(tmp.Name(), os.FileMode(0666&^umask)); err != nil {
28 if err := os.Rename(tmp.Name(), dbPath); err != nil {
34 dbPath := flag.String("db", "glocate.db", "Path to database")
35 doIndex := flag.Bool("index", false, "Perform indexing")
36 doUpdate := flag.String("update", "", "Update database")
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 rootPath := flag.String("root", "", "Search only that part of tree")
42 log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile)
48 dbCommit(*dbPath, tmp)
54 tmp := updateWithDiff(*dbPath, *doUpdate)
57 dbCommit(*dbPath, tmp)
62 db, err := os.Open(*dbPath)
66 entsReader := make(chan Ent, 1<<10)
67 go reader(db, entsReader)
69 entsPrinter := make(chan Ent, 1<<10)
70 printerJob := make(chan struct{})
73 printerMachine(entsPrinter)
75 printerTree(entsPrinter)
77 printerSimple(entsPrinter)
84 root = strings.Split("./"+*rootPath, "/")
88 if len(flag.Args()) > 0 {
89 pat = "*" + flag.Arg(0) + "*"
96 for ent := range entsReader {
97 if hasPrefix(ent.name, root) {
103 for i = 0; i < len(ent.name); i++ {
104 if i == len(namePrev) || ent.name[i] != namePrev[i] {
108 for ; i < len(ent.name); i++ {
109 matched, err = path.Match(pat,
110 strings.ToLower(strings.TrimSuffix(ent.name[i], "/")))