]> Sergey Matveev's repositories - glocate.git/blob - walker.go
Use database's directory for temporary files
[glocate.git] / walker.go
1 package main
2
3 import (
4         "io/fs"
5         "log"
6         "os"
7         "path"
8 )
9
10 var (
11         WalkerFiles int64
12         WalkerDirs  int64
13 )
14
15 func walker(sink chan Ent, root []string) error {
16         files, err := os.ReadDir(path.Join(root...)) // it is already sorted
17         if err != nil {
18                 return err
19         }
20         var info fs.FileInfo
21         ents := make([]Ent, 0, len(files))
22         for _, file := range files {
23                 ent := Ent{name: append([]string{}, append(root, file.Name())...)}
24                 info, err = file.Info()
25                 if err == nil {
26                         if info.IsDir() {
27                                 ent.name[len(ent.name)-1] += "/"
28                         } else if info.Mode().IsRegular() {
29                                 ent.size = info.Size()
30                         }
31                         ent.mtime = info.ModTime().Unix()
32                 } else {
33                         log.Println("can not stat:", path.Join(ent.name...), ":", err)
34                 }
35                 ents = append(ents, ent)
36         }
37         for _, ent := range ents {
38                 sink <- ent
39                 if ent.IsDir() {
40                         WalkerDirs++
41                 } else {
42                         WalkerFiles++
43                         continue
44                 }
45                 err = walker(sink, ent.name)
46                 if err != nil {
47                         log.Println("can not stat:", path.Join(ent.name...), ":", err)
48                         continue
49                 }
50         }
51         return nil
52 }