diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2020-06-12 11:45:26 -0400 |
---|---|---|
committer | Xavier Claessens <xavier.claessens@collabora.com> | 2020-07-01 09:51:57 -0400 |
commit | 41aefd2145bf287c9c07139a7334845f8c03374c (patch) | |
tree | 7c02e7f9787f7ad4cddac065bba0924dca397268 | |
parent | 13316f99feaa9831146f6456ce11916042a871cb (diff) | |
download | meson-41aefd2145bf287c9c07139a7334845f8c03374c.zip meson-41aefd2145bf287c9c07139a7334845f8c03374c.tar.gz meson-41aefd2145bf287c9c07139a7334845f8c03374c.tar.bz2 |
wrap: Abort if multiple wraps provide the same dep or program
-rw-r--r-- | mesonbuild/wrap/wrap.py | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/mesonbuild/wrap/wrap.py b/mesonbuild/wrap/wrap.py index 536b8ae..e0c7a04 100644 --- a/mesonbuild/wrap/wrap.py +++ b/mesonbuild/wrap/wrap.py @@ -186,23 +186,35 @@ class Resolver: def load_wraps(self): if not os.path.isdir(self.subdir_root): return - for f in os.listdir(self.subdir_root): - fname = os.path.join(self.subdir_root, f) - # Ignore not .wrap files, and reserved directories. - if (os.path.isfile(fname) and not fname.endswith('.wrap')) or \ - f in ['packagecache', 'packagefiles']: + root, dirs, files = next(os.walk(self.subdir_root)) + for i in files: + if not i.endswith('.wrap'): continue + fname = os.path.join(self.subdir_root, i) wrap = PackageDefinition(fname) - # We could have added a dummy package definition for the directory, - # replace it now with the proper wrap. This happens if we already - # downloaded the subproject into 'foo-1.0' directory and we now found - # 'foo.wrap' file. - if wrap.directory in self.wraps: - del self.wraps[wrap.directory] self.wraps[wrap.name] = wrap + if wrap.directory in dirs: + dirs.remove(wrap.directory) + # Add dummy package definition for directories not associated with a wrap file. + for i in dirs: + if i in ['packagecache', 'packagefiles']: + continue + fname = os.path.join(self.subdir_root, i) + wrap = PackageDefinition(fname) + self.wraps[wrap.name] = wrap + + for wrap in self.wraps.values(): for k in wrap.provided_deps.keys(): + if k in self.provided_deps: + prev_wrap = self.provided_deps[k] + m = 'Multiple wrap files provide {!r} dependency: {} and {}' + raise WrapException(m.format(k, wrap.basename, prev_wrap.basename)) self.provided_deps[k] = wrap for k in wrap.provided_programs: + if k in self.provided_programs: + prev_wrap = self.provided_programs[k] + m = 'Multiple wrap files provide {!r} program: {} and {}' + raise WrapException(m.format(k, wrap.basename, prev_wrap.basename)) self.provided_programs[k] = wrap def find_dep_provider(self, packagename: str): |