Fix VPS freeze

This commit is contained in:
2026-04-02 18:28:37 +02:00
parent b7f188779a
commit 65b9a3dff8
4 changed files with 118 additions and 50 deletions
+39 -26
View File
@@ -45,12 +45,11 @@ type assetResource struct {
}
type hakChunk struct {
Config project.HAKConfig
Index int
Name string
Assets []assetResource
Size int64
Resources []erf.Resource
Config project.HAKConfig
Index int
Name string
Assets []assetResource
Size int64
}
func Build(p *project.Project) (BuildResult, error) {
@@ -132,7 +131,7 @@ func BuildHAKs(p *project.Project) (BuildResult, error) {
if err != nil {
return BuildResult{}, fmt.Errorf("create hak archive: %w", err)
}
if err := erf.Write(hakOutput, erf.New("HAK ", chunk.Resources)); err != nil {
if err := erf.Write(hakOutput, erf.New("HAK ", resourceSlice(chunk.Assets))); err != nil {
hakOutput.Close()
return BuildResult{}, fmt.Errorf("write hak archive: %w", err)
}
@@ -198,7 +197,7 @@ func collectAssetResources(p *project.Project) ([]assetResource, error) {
for _, rel := range p.Inventory.AssetFiles {
abs := filepath.Join(p.AssetsDir(), filepath.FromSlash(rel))
resource, err := rawResource(abs)
resource, err := pathResource(abs)
if err != nil {
return nil, err
}
@@ -276,6 +275,25 @@ func resourceFromJSON(path string, moduleHakOrder []string) (erf.Resource, error
}, nil
}
func pathResource(path string) (erf.Resource, error) {
extension := strings.TrimPrefix(strings.ToLower(filepath.Ext(path)), ".")
resourceType, ok := erf.ResourceTypeForExtension(extension)
if !ok {
return erf.Resource{}, fmt.Errorf("unsupported resource extension %q", filepath.Ext(path))
}
name := strings.TrimSuffix(filepath.Base(path), filepath.Ext(path))
info, err := os.Stat(path)
if err != nil {
return erf.Resource{}, fmt.Errorf("stat %s: %w", path, err)
}
return erf.Resource{
Name: name,
Type: resourceType,
SourcePath: path,
Size: info.Size(),
}, nil
}
func rawResource(path string) (erf.Resource, error) {
extension := strings.TrimPrefix(strings.ToLower(filepath.Ext(path)), ".")
resourceType, ok := erf.ResourceTypeForExtension(extension)
@@ -317,11 +335,10 @@ func planHAKChunks(p *project.Project, assets []assetResource) ([]hakChunk, erro
Name: p.Config.Module.ResRef,
Priority: 1,
},
Index: 1,
Name: p.Config.Module.ResRef,
Size: erf.ArchiveSize(resourceSlice(assets)),
Assets: assets,
Resources: resourceSlice(assets),
Index: 1,
Name: p.Config.Module.ResRef,
Size: erf.ArchiveSize(resourceSlice(assets)),
Assets: assets,
}
return []hakChunk{chunk}, nil
}
@@ -373,12 +390,11 @@ func splitHAKGroup(cfg project.HAKConfig, assets []assetResource) ([]hakChunk, e
maxBytes := cfg.MaxBytes
if maxBytes == 0 {
chunk := hakChunk{
Config: cfg,
Index: 1,
Name: cfg.Name,
Assets: assets,
Resources: resourceSlice(assets),
Size: erf.ArchiveSize(resourceSlice(assets)),
Config: cfg,
Index: 1,
Name: cfg.Name,
Assets: assets,
Size: erf.ArchiveSize(resourceSlice(assets)),
}
if err := ensureUniqueChunkResources(chunk); err != nil {
return nil, err
@@ -398,14 +414,12 @@ func splitHAKGroup(cfg project.HAKConfig, assets []assetResource) ([]hakChunk, e
return nil, fmt.Errorf("asset %s alone exceeds max_bytes for hak %s", asset.Rel, cfg.Name)
}
current.Assets = candidateAssets
current.Resources = candidateResources
current.Size = candidateSize
continue
}
if candidateSize <= maxBytes {
current.Assets = candidateAssets
current.Resources = candidateResources
current.Size = candidateSize
continue
}
@@ -421,11 +435,10 @@ func splitHAKGroup(cfg project.HAKConfig, assets []assetResource) ([]hakChunk, e
chunks = append(chunks, current)
current = hakChunk{
Config: cfg,
Index: current.Index + 1,
Assets: []assetResource{asset},
Resources: []erf.Resource{asset.Resource},
Size: erf.ArchiveSize([]erf.Resource{asset.Resource}),
Config: cfg,
Index: current.Index + 1,
Assets: []assetResource{asset},
Size: erf.ArchiveSize([]erf.Resource{asset.Resource}),
}
if current.Size > maxBytes {
return nil, fmt.Errorf("asset %s alone exceeds max_bytes for hak %s", asset.Rel, cfg.Name)