10 "github.com/klauspost/compress/zstd"
13 func dirSizer(dirSizes *[]int64, depth int, sinkBack, sinkIn, sinkOut chan Ent) (curSize int64) {
19 case ent = <-sinkBack:
23 ent, opened = <-sinkIn
28 if len(ent.name) < depth {
37 dirIdx = len(*dirSizes)
38 (*dirSizes) = append(*dirSizes, 0)
39 dirSize := dirSizer(dirSizes, depth+1, sinkBack, sinkIn, sinkOut)
40 (*dirSizes)[dirIdx] = dirSize
46 func applyDirSizes(src *os.File, dirSizes []int64) *os.File {
47 _, err := src.Seek(0, io.SeekStart)
51 tmp, err := os.CreateTemp(TmpDir, "glocate-idx")
56 compR, err := zstd.NewReader(src)
60 br := bufio.NewReaderSize(compR, 1<<17)
62 compW, err := zstd.NewWriter(tmp,
63 zstd.WithEncoderLevel(zstd.SpeedBestCompression))
67 bw := bufio.NewWriterSize(compW, 1<<17)
69 num := make([]byte, 8)
71 name := make([]byte, 0, 1<<16)
74 if _, err = io.ReadFull(br, num[:2]); err != nil {
80 mustWrite(bw, num[:2])
81 nameLen = int(binary.BigEndian.Uint16(num[:2]))
83 mustReadFull(br, name)
85 if _, err = io.CopyN(bw, br, 1+8); err != nil {
88 if name[len(name)-1] == byte('/') {
89 if _, err = br.Discard(8); err != nil {
92 binary.BigEndian.PutUint64(num, uint64(dirSizes[dirIdx]))
96 if _, err = io.CopyN(bw, br, 8); err != nil {
101 if err = bw.Flush(); err != nil {
104 if err = compW.Close(); err != nil {