diff --git a/src/core/package.go b/src/core/package.go index 3786586e93..93c9a85c6c 100644 --- a/src/core/package.go +++ b/src/core/package.go @@ -67,15 +67,6 @@ func (pkg *Package) TargetOrDie(name string) *BuildTarget { return t } -// SourceRoot returns the root directory of source files for this package. -// This is equivalent to .Name for in-repo packages but differs for those in subrepos. -func (pkg *Package) SourceRoot() string { - if pkg.Subrepo != nil { - return pkg.Subrepo.Dir(pkg.Name) - } - return pkg.Name -} - // AddTarget adds a new target to this package with the given name. // It doesn't check for duplicates. func (pkg *Package) AddTarget(target *BuildTarget) { diff --git a/src/core/state.go b/src/core/state.go index 71367d139a..3f9490eb56 100644 --- a/src/core/state.go +++ b/src/core/state.go @@ -255,8 +255,7 @@ func (state *BuildState) Initialise(subrepo *Subrepo) (err error) { // handled for us already in plz.go if state.CurrentSubrepo != "" { state.RepoConfig = &Configuration{} - err = readConfigFilesInto(state.RepoConfig, append(subrepo.AdditionalConfigFiles, filepath.Join(subrepo.Root, ".plzconfig"))) - if err != nil { + if err := readSubrepoConfig(state.RepoConfig, subrepo); err != nil { return } if err = validateSubrepoNameAndPluginConfig(state.Config, state.RepoConfig, subrepo); err != nil { diff --git a/src/core/subrepo.go b/src/core/subrepo.go index bd5831239f..3bb4445a97 100644 --- a/src/core/subrepo.go +++ b/src/core/subrepo.go @@ -36,10 +36,15 @@ type Subrepo struct { } func NewSubrepo(state *BuildState, name, root string, target *BuildTarget, arch cli.Arch, isCrosscompile bool) *Subrepo { + subrepoFS := os.DirFS(root) + if root == "" { + // This happens for architecture subrepos, which should use the same FS as the host repo + subrepoFS = fs.HostFS + } return &Subrepo{ Name: name, Root: root, - FS: os.DirFS(root), + FS: subrepoFS, State: state, Target: target, Arch: arch, @@ -81,14 +86,14 @@ func (s *Subrepo) Dir(dir string) string { return filepath.Join(s.Root, dir) } -func readConfigFilesInto(repoConfig *Configuration, files []string) error { - for _, file := range files { +func readSubrepoConfig(repoConfig *Configuration, subrepo *Subrepo) error { + for _, file := range subrepo.AdditionalConfigFiles { err := readConfigFile(fs.HostFS, repoConfig, file, true) if err != nil { return err } } - return nil + return readConfigFile(subrepo.FS, repoConfig, ".plzconfig", true) } func validateSubrepoNameAndPluginConfig(config, repoConfig *Configuration, subrepo *Subrepo) error { diff --git a/src/parse/asp/builtins.go b/src/parse/asp/builtins.go index b31e43c5db..f33b715710 100644 --- a/src/parse/asp/builtins.go +++ b/src/parse/asp/builtins.go @@ -607,10 +607,14 @@ func glob(s *scope, args []pyObject) pyObject { allowEmpty := args[4].IsTruthy() exclude = append(exclude, s.state.Config.Parse.BuildFileName...) if s.globber == nil { - s.globber = fs.NewGlobber(fs.HostFS, s.state.Config.Parse.BuildFileName) + if s.pkg.Subrepo != nil { + s.globber = fs.NewGlobber(s.pkg.Subrepo.FS, s.state.Config.Parse.BuildFileName) + } else { + s.globber = fs.NewGlobber(fs.HostFS, s.state.Config.Parse.BuildFileName) + } } - glob := s.globber.Glob(s.pkg.SourceRoot(), include, exclude, hidden, includeSymlinks) + glob := s.globber.Glob(s.pkg.Name, include, exclude, hidden, includeSymlinks) if !allowEmpty && len(glob) == 0 { // Strip build file name from exclude list for error message exclude = exclude[:len(exclude)-len(s.state.Config.Parse.BuildFileName)]