X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=main.go;h=c18be4409d252ffa15b06e852f3a9f8b23fcf6339038057ae82c20a429f934bd;hb=66cef1659e7d49d330e693b5747bed1167c6294622908a868adc0597c7d5743a;hp=c8615fdd85d4f2b76db67f755348feb0a9baf32c17bfdab0b72473fdb634dd58;hpb=db65ffeff7274def395c8ee747873d0e9d8250b75f543b6ac0d7bbd079cce66d;p=glocate.git diff --git a/main.go b/main.go index c8615fd..c18be44 100644 --- a/main.go +++ b/main.go @@ -4,10 +4,14 @@ import ( "flag" "log" "os" + "path" + "path/filepath" "strings" "syscall" ) +var TmpDir string + type Ent struct { name []string mtime int64 @@ -32,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() @@ -49,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) @@ -79,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 }