]> Sergey Matveev's repositories - glocate.git/blobdiff - index.go
Improved version
[glocate.git] / index.go
diff --git a/index.go b/index.go
new file mode 100644 (file)
index 0000000..c6fa539
--- /dev/null
+++ b/index.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+       "bufio"
+       "fmt"
+       "log"
+       "os"
+)
+
+func index() *os.File {
+       tmp0, err := os.CreateTemp("", "glocate-idx")
+       if err != nil {
+               log.Fatalln(err)
+       }
+       defer os.Remove(tmp0.Name())
+
+       entsWalker := make(chan Ent, 1<<10)
+       entsWriter := make(chan Ent, 1<<10)
+       dirSizerJob := make(chan struct{})
+       var dirSizes []int64
+       entsWalker <- Ent{name: []string{"./"}}
+       sinkBack := make(chan Ent, 1)
+       go func() {
+               dirSizer(&dirSizes, 1, sinkBack, entsWalker, entsWriter)
+               close(dirSizerJob)
+       }()
+
+       bw := bufio.NewWriterSize(tmp0, 1<<17)
+       writerJob := make(chan struct{})
+       go func() {
+               writer(bw, entsWriter)
+               close(writerJob)
+       }()
+
+       walkerStatusStop := make(chan struct{})
+       go walkerStatus(walkerStatusStop)
+       err = walker(entsWalker, []string{"./"})
+       walkerStatusStop <- struct{}{}
+       <-walkerStatusStop
+       fmt.Print("\r")
+       if err != nil {
+               log.Fatalln(err)
+       }
+       close(entsWalker)
+       <-dirSizerJob
+       close(entsWriter)
+       <-writerJob
+       if err = bw.Flush(); err != nil {
+               log.Fatalln(err)
+       }
+
+       tmp1 := applyDirSizes(tmp0, dirSizes)
+       tmp0.Close()
+       return tmp1
+}