]> Sergey Matveev's repositories - glocate.git/blob - index.go
c6fa5398b74fb4ace31a4f09587b8579e3b9642d55040d46e92a1f37fe5e99fb
[glocate.git] / index.go
1 package main
2
3 import (
4         "bufio"
5         "fmt"
6         "log"
7         "os"
8 )
9
10 func index() *os.File {
11         tmp0, err := os.CreateTemp("", "glocate-idx")
12         if err != nil {
13                 log.Fatalln(err)
14         }
15         defer os.Remove(tmp0.Name())
16
17         entsWalker := make(chan Ent, 1<<10)
18         entsWriter := make(chan Ent, 1<<10)
19         dirSizerJob := make(chan struct{})
20         var dirSizes []int64
21         entsWalker <- Ent{name: []string{"./"}}
22         sinkBack := make(chan Ent, 1)
23         go func() {
24                 dirSizer(&dirSizes, 1, sinkBack, entsWalker, entsWriter)
25                 close(dirSizerJob)
26         }()
27
28         bw := bufio.NewWriterSize(tmp0, 1<<17)
29         writerJob := make(chan struct{})
30         go func() {
31                 writer(bw, entsWriter)
32                 close(writerJob)
33         }()
34
35         walkerStatusStop := make(chan struct{})
36         go walkerStatus(walkerStatusStop)
37         err = walker(entsWalker, []string{"./"})
38         walkerStatusStop <- struct{}{}
39         <-walkerStatusStop
40         fmt.Print("\r")
41         if err != nil {
42                 log.Fatalln(err)
43         }
44         close(entsWalker)
45         <-dirSizerJob
46         close(entsWriter)
47         <-writerJob
48         if err = bw.Flush(); err != nil {
49                 log.Fatalln(err)
50         }
51
52         tmp1 := applyDirSizes(tmp0, dirSizes)
53         tmp0.Close()
54         return tmp1
55 }