X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=main.go;h=affdffc8d95d0c7179d7cc9359c524cb8f963669053a888a9da1f6d8b3e237e5;hb=e5a64361a0537c82d3fbc21b986fc2815f394571f46a0e4128ced789a6712f36;hp=a5fcb41451e9410c3be3d629ba89dea6d354c675abe9fd2fa7e0879514b10095;hpb=d5b8c235a1f3088c6c1e7261df3d1b565d042db2ba2ad1bbd1018782b9178e1f;p=glocate.git diff --git a/main.go b/main.go index a5fcb41..affdffc 100644 --- a/main.go +++ b/main.go @@ -1,10 +1,10 @@ package main import ( - "bufio" "flag" "log" "os" + "path" "strings" "syscall" ) @@ -33,11 +33,11 @@ func dbCommit(dbPath string, tmp *os.File) { func main() { dbPath := flag.String("db", "glocate.db", "Path to database") doIndex := flag.Bool("index", false, "Perform indexing") - doUpdate := flag.Bool("update", false, "Feed zfs-diff and update the database") - strip := flag.String("strip", "", "Strip prefix from zfs-diff's paths") + doUpdate := flag.String("update", "", "Update database") showMachine := flag.Bool("machine", false, "Show machine friendly") showTree := flag.Bool("tree", false, "Show human-friendly tree") dryRun := flag.Bool("n", false, "Dry run, do not overwrite database") + rootPath := flag.String("root", "", "Search only that part of tree") flag.Parse() log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile) @@ -50,8 +50,8 @@ func main() { return } - if *doUpdate { - tmp := updateWithDiff(*dbPath, *strip) + if *doUpdate != "" { + tmp := updateWithDiff(*dbPath, *doUpdate) tmp.Close() if !*dryRun { dbCommit(*dbPath, tmp) @@ -64,7 +64,7 @@ func main() { log.Fatalln(err) } entsReader := make(chan Ent, 1<<10) - go reader(bufio.NewReaderSize(db, 1<<17), entsReader) + go reader(db, entsReader) entsPrinter := make(chan Ent, 1<<10) printerJob := make(chan struct{}) @@ -80,15 +80,42 @@ func main() { }() var root []string + if *rootPath != "" { + root = strings.Split("./"+*rootPath, "/") + } + + var pat string if len(flag.Args()) > 0 { - root = strings.Split("./"+flag.Arg(0), "/") + pat = "*" + flag.Arg(0) + "*" } rootMet := false + var matched bool + var namePrev []string + var i int for ent := range entsReader { if hasPrefix(ent.name, root) { - entsPrinter <- ent rootMet = true + if pat == "" { + entsPrinter <- ent + continue + } + for i = 0; i < len(ent.name); i++ { + if i == len(namePrev) || ent.name[i] != namePrev[i] { + break + } + } + for ; i < len(ent.name); i++ { + matched, err = path.Match(pat, + strings.ToLower(strings.TrimSuffix(ent.name[i], "/"))) + if err != nil { + log.Fatalln(err) + } + } + if matched { + entsPrinter <- ent + } + namePrev = ent.name } else if rootMet { break }