48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package resolver
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
globalResolver *FastResolver
|
|
resolverOnce sync.Once
|
|
resolverErr error
|
|
)
|
|
|
|
// GetResolver returns a process-wide singleton FastResolver instance.
|
|
// Package index loading (and thus Sources.xz parsing) will happen at most once per process.
|
|
func GetResolver(cacheDir, mirror, suite, component string) (*FastResolver, error) {
|
|
resolverOnce.Do(func() {
|
|
log.Println("[resolver] Initializing global resolver (loading package index)")
|
|
|
|
r := NewFastResolver(cacheDir)
|
|
|
|
if err := r.LoadIndex(mirror, suite, component); err != nil {
|
|
resolverErr = fmt.Errorf("failed to load package index: %w", err)
|
|
return
|
|
}
|
|
|
|
globalResolver = r
|
|
|
|
log.Println("[resolver] Global resolver initialized successfully")
|
|
})
|
|
|
|
if resolverErr != nil {
|
|
return nil, resolverErr
|
|
}
|
|
|
|
if globalResolver == nil {
|
|
return nil, fmt.Errorf("resolver initialization failed")
|
|
}
|
|
|
|
return globalResolver, nil
|
|
}
|
|
|
|
// GetGlobalResolver is kept for backward compatibility.
|
|
// New code should use GetResolver instead.
|
|
func GetGlobalResolver(cacheDir, mirror, suite, component string) (*FastResolver, error) {
|
|
return GetResolver(cacheDir, mirror, suite, component)
|
|
}
|