X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=main.go;h=c18be4409d252ffa15b06e852f3a9f8b23fcf6339038057ae82c20a429f934bd;hb=ed2896a762bea39292e603a4f03b26a260993c90bd5884ab94fa9f961cff501f;hp=a5fcb41451e9410c3be3d629ba89dea6d354c675abe9fd2fa7e0879514b10095;hpb=d5b8c235a1f3088c6c1e7261df3d1b565d042db2ba2ad1bbd1018782b9178e1f;p=glocate.git diff --git a/main.go b/main.go index a5fcb41..c18be44 100644 --- a/main.go +++ b/main.go @@ -1,14 +1,17 @@ package main import ( - "bufio" "flag" "log" "os" + "path" + "path/filepath" "strings" "syscall" ) +var TmpDir string + type Ent struct { name []string mtime int64 @@ -33,14 +36,21 @@ 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) + var err error + TmpDir, err = filepath.Abs(*dbPath) + if err != nil { + panic(err) + } + TmpDir = path.Dir(TmpDir) + if *doIndex { tmp := index() tmp.Close() @@ -50,8 +60,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 +74,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 +90,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 }