]> Sergey Matveev's repositories - glocate.git/commitdiff
Search ability
authorSergey Matveev <stargrave@stargrave.org>
Tue, 9 Aug 2022 08:51:27 +0000 (11:51 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Tue, 9 Aug 2022 13:34:55 +0000 (16:34 +0300)
README
main.go

diff --git a/README b/README
index 8c52b350ce33c6e2b4f83ae2dd4fc980b342b8d3fa0b79ac2917988101f77477..e5d6fd212d1112f1fa25948c8884a29ec50308cf4aa665a5fccd931cd5a99ae5 100644 (file)
--- a/README
+++ b/README
@@ -38,10 +38,12 @@ Its indexing algorithm is following:
 
 Searching is trivial:
 
-* there is no actual searching, just a streaming through all the
-  database file sequentially
-* if some root is specified, then the program will output only its
-  hierarchy path, exiting after it is finished
+* searching is performed on each record streamed from the database
+* if -root is specified, then search will stop after that hierarchy part
+  is over
+* by default all elements are printed, unless you provide a single
+  argument that becomes "*X*" pattern matched on case-lowered path
+  elements
 
 Updating algorithm is following:
 
@@ -77,13 +79,21 @@ How to use it?
     $ glocate -db /tmp/glocate.db -tree
     [beauty tree-like list of files with sizes and mtimes]
 
-    $ glocate -db /tmp/glocate.db some/sub/path
-    [just a part of the whole hierarchy]
+    $ glocate -db /tmp/glocate.db -root music
+    [just a music hierarchy path]
 
-and update it carefully:
+    $ glocate -db /tmp/glocate.db -root music blasphemy | grep "/$"
+    music/Blasphemy-2001-Gods_Of_War_+_Blood_Upon_The_Altar/
+    music/Cryptopsy-1994-Blasphemy_Made_Flesh/
+    music/Infernal_Blasphemy-2005-Unleashed/
+    music/Ravenous-Assembled_In_Blasphemy/
+    music/Sect_Of_Execration-2002-Baptized_Through_Blasphemy/
+    music/Spectral_Blasphemy-2012-Blasphmemial_Catastrophic/
+
+and update it carefully, providing the strip prefix to -update:
 
     $ zfs snap big@snap2
-    $ zfs diff -FH big@snap2 | glocate -db /tmp/glocate.db -strip /big/ -update
+    $ zfs diff -FH big@snap2 | glocate -db /tmp/glocate.db -update /big/
 
 glocate is copylefted free software: see the file COPYING for copying
 conditions.
diff --git a/main.go b/main.go
index c8615fdd85d4f2b76db67f755348feb0a9baf32c17bfdab0b72473fdb634dd58..affdffc8d95d0c7179d7cc9359c524cb8f963669053a888a9da1f6d8b3e237e5 100644 (file)
--- a/main.go
+++ b/main.go
@@ -4,6 +4,7 @@ import (
        "flag"
        "log"
        "os"
+       "path"
        "strings"
        "syscall"
 )
@@ -32,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)
 
@@ -49,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)
@@ -79,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
                }