11 func dirSizer(dirSizes *[]int64, depth int, sinkBack, sinkIn, sinkOut chan Ent) (curSize int64) {
17 case ent = <-sinkBack:
21 ent, opened = <-sinkIn
26 if len(ent.name) < depth {
35 dirIdx = len(*dirSizes)
36 (*dirSizes) = append(*dirSizes, 0)
37 dirSize := dirSizer(dirSizes, depth+1, sinkBack, sinkIn, sinkOut)
38 (*dirSizes)[dirIdx] = dirSize
44 func applyDirSizes(src *os.File, dirSizes []int64) *os.File {
45 _, err := src.Seek(0, io.SeekStart)
49 tmp, err := os.CreateTemp("", "glocate-idx")
54 br := bufio.NewReaderSize(src, 1<<17)
55 num := make([]byte, 8)
57 name := make([]byte, 0, 1<<16)
58 bw := bufio.NewWriterSize(tmp, 1<<17)
61 if _, err = io.ReadFull(br, num[:2]); err != nil {
67 mustWrite(bw, num[:2])
68 nameLen = int(binary.BigEndian.Uint16(num[:2]))
70 if _, err = io.ReadFull(br, name); err != nil {
74 if _, err = io.CopyN(bw, br, 1+8); err != nil {
77 if name[len(name)-1] == byte('/') {
78 if _, err = br.Discard(8); err != nil {
81 binary.BigEndian.PutUint64(num, uint64(dirSizes[dirIdx]))
85 if _, err = io.CopyN(bw, br, 8); err != nil {
90 if err = bw.Flush(); err != nil {