Update progress bar and more embed

This commit is contained in:
2025-08-31 12:53:48 +07:00
parent 612f091ac8
commit cf9d499e91
17 changed files with 269 additions and 201 deletions

View File

@@ -1,15 +1,15 @@
package main
import (
"ldiff-converter/pb"
"fmt"
"io"
"ldiff-converter/pb"
"os"
"path/filepath"
"golang.org/x/exp/mmap"
)
func LDiffFile(data *pb.AssetManifest, assetName string, assetSize int64, ldiffsDir, outputDir string) error {
path := filepath.Join(ldiffsDir, data.ChunkFileName)
@@ -17,15 +17,25 @@ func LDiffFile(data *pb.AssetManifest, assetName string, assetSize int64, ldiffs
if err != nil {
return fmt.Errorf("%s does not exist: %w", path, err)
}
fileSize := info.Size()
var buffer []byte
if fileSize > 10*1024*1024 && data.HdiffFileSize > 1*1024*1024 {
// mmap for large files using x/exp/mmap
// ưu tiên mmap cho file lớn
reader, err := mmap.Open(path)
if err != nil {
// fallback to buffered read
if err == nil {
defer reader.Close()
buffer = make([]byte, data.HdiffFileSize)
n, err := reader.ReadAt(buffer, data.HdiffFileInChunkOffset)
if err != nil && err != io.EOF {
return fmt.Errorf("error reading mmap data: %w", err)
}
if int64(n) < data.HdiffFileSize {
return fmt.Errorf("expected %d bytes, but read %d bytes", data.HdiffFileSize, n)
}
} else {
// fallback sang buffered read
file, err := os.Open(path)
if err != nil {
return fmt.Errorf("error opening file %s: %w", path, err)
@@ -35,22 +45,14 @@ func LDiffFile(data *pb.AssetManifest, assetName string, assetSize int64, ldiffs
if err != nil {
return err
}
} else {
defer reader.Close()
buffer = make([]byte, data.HdiffFileSize)
_, err := reader.ReadAt(buffer, data.HdiffFileInChunkOffset)
if err != nil {
return fmt.Errorf("error reading mmap data: %w", err)
}
}
} else {
// small files, buffered read
// file nhỏ, dùng buffered read
file, err := os.Open(path)
if err != nil {
return fmt.Errorf("error opening file %s: %w", path, err)
}
defer file.Close()
buffer, err = ReadBuffer(file, data.HdiffFileInChunkOffset, data.HdiffFileSize)
if err != nil {
return err
@@ -58,7 +60,7 @@ func LDiffFile(data *pb.AssetManifest, assetName string, assetSize int64, ldiffs
}
extension := ""
if data.OriginalFileSize != 0 || assetSize != data.HdiffFileSize {
if data.OriginalFileSize > 0 && assetSize != data.HdiffFileSize {
extension = ".hdiff"
}
assetPath := filepath.Join(outputDir, assetName+extension)
@@ -76,19 +78,16 @@ func LDiffFile(data *pb.AssetManifest, assetName string, assetSize int64, ldiffs
return nil
}
func ReadBuffer(file *os.File, offset int64, size int64) ([]byte, error) {
buffer := make([]byte, size)
n, err := file.ReadAt(buffer, offset)
if err != nil {
if err != nil && err != io.EOF {
return nil, fmt.Errorf("error reading data: %w", err)
}
if int64(n) != size {
if int64(n) < size {
return nil, fmt.Errorf("expected %d bytes, but read %d bytes", size, n)
}
return buffer, nil
}