Refresh Manifests
This commit is contained in:
@@ -282,6 +282,111 @@ func newestTopDataSource(p *project.Project) (time.Time, string, error) {
|
||||
return newest, newestPath, nil
|
||||
}
|
||||
|
||||
func newestTopDataInput(p *project.Project, now time.Time) (time.Time, string, error) {
|
||||
newest, newestPath, err := newestTopDataSource(p)
|
||||
if err != nil {
|
||||
return time.Time{}, "", err
|
||||
}
|
||||
autogenTime, autogenPath, err := newestAutogenInput(p, now)
|
||||
if err != nil {
|
||||
return time.Time{}, "", err
|
||||
}
|
||||
if autogenTime.After(newest) {
|
||||
return autogenTime, autogenPath, nil
|
||||
}
|
||||
return newest, newestPath, nil
|
||||
}
|
||||
|
||||
func newestAutogenInput(p *project.Project, now time.Time) (time.Time, string, error) {
|
||||
newest := time.Time{}
|
||||
newestPath := ""
|
||||
for _, consumer := range p.Config.Autogen.Consumers {
|
||||
overrideRoot, err := resolveAutogenLocalOverrideRoot(p, consumer)
|
||||
if err != nil {
|
||||
return time.Time{}, "", err
|
||||
}
|
||||
if overrideRoot != "" {
|
||||
candidateRoot := filepath.Join(overrideRoot, consumer.Root)
|
||||
candidateTime, candidatePath, err := newestMatchingAutogenOverrideInput(candidateRoot, consumer.Include)
|
||||
if err != nil {
|
||||
return time.Time{}, "", err
|
||||
}
|
||||
if candidateTime.After(newest) {
|
||||
newest = candidateTime
|
||||
newestPath = candidatePath
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
cachePath := filepath.Join(p.Root, ".cache", consumer.Manifest.CacheName)
|
||||
info, err := os.Stat(cachePath)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
if now.After(newest) {
|
||||
newest = now
|
||||
newestPath = cachePath
|
||||
}
|
||||
continue
|
||||
}
|
||||
return time.Time{}, "", fmt.Errorf("stat autogen manifest cache %s: %w", cachePath, err)
|
||||
}
|
||||
|
||||
candidateTime := info.ModTime()
|
||||
if autogenManifestCacheMaxAge > 0 && now.Sub(info.ModTime()) > autogenManifestCacheMaxAge {
|
||||
candidateTime = now
|
||||
}
|
||||
if candidateTime.After(newest) {
|
||||
newest = candidateTime
|
||||
newestPath = cachePath
|
||||
}
|
||||
}
|
||||
return newest, newestPath, nil
|
||||
}
|
||||
|
||||
func newestMatchingAutogenOverrideInput(scanRoot string, include []string) (time.Time, string, error) {
|
||||
info, err := os.Stat(scanRoot)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return time.Time{}, "", nil
|
||||
}
|
||||
return time.Time{}, "", fmt.Errorf("stat autogen override root %s: %w", scanRoot, err)
|
||||
}
|
||||
if !info.IsDir() {
|
||||
return time.Time{}, "", fmt.Errorf("autogen override root %s is not a directory", scanRoot)
|
||||
}
|
||||
|
||||
newest := time.Time{}
|
||||
newestPath := ""
|
||||
err = filepath.WalkDir(scanRoot, func(path string, d fs.DirEntry, walkErr error) error {
|
||||
if walkErr != nil {
|
||||
return walkErr
|
||||
}
|
||||
if d.IsDir() {
|
||||
return nil
|
||||
}
|
||||
rel, err := filepath.Rel(scanRoot, path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !matchesAutogenInclude(filepath.ToSlash(rel), include) {
|
||||
return nil
|
||||
}
|
||||
info, err := d.Info()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if info.ModTime().After(newest) {
|
||||
newest = info.ModTime()
|
||||
newestPath = path
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return time.Time{}, "", fmt.Errorf("scan autogen override %s: %w", scanRoot, err)
|
||||
}
|
||||
return newest, newestPath, nil
|
||||
}
|
||||
|
||||
func topPackageResourceFromPath(path string) (erf.Resource, error) {
|
||||
extension := strings.TrimPrefix(strings.ToLower(filepath.Ext(path)), ".")
|
||||
resourceType, ok := erf.HAKResourceTypeForExtension(extension)
|
||||
@@ -397,7 +502,7 @@ func packagedBuildResult(p *project.Project) (BuildResult, error) {
|
||||
return BuildResult{}, fmt.Errorf("topdata build output missing: run build-topdata first")
|
||||
}
|
||||
|
||||
newestSource, newestPath, err := newestTopDataSource(p)
|
||||
newestSource, newestPath, err := newestTopDataInput(p, time.Now())
|
||||
if err != nil {
|
||||
return BuildResult{}, err
|
||||
}
|
||||
@@ -452,7 +557,7 @@ func currentTopPackageResult(p *project.Project) (PackageResult, bool, error) {
|
||||
return PackageResult{}, false, fmt.Errorf("stat top package tlk %s: %w", outputTLK, err)
|
||||
}
|
||||
|
||||
newestSource, _, err := newestTopDataSource(p)
|
||||
newestSource, _, err := newestTopDataInput(p, time.Now())
|
||||
if err != nil {
|
||||
return PackageResult{}, false, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user