def _collect_ancestor_build_files(cls, project_tree, dir_relpath, build_ignore_patterns): for build_file in BuildFile.get_build_files_family(project_tree, dir_relpath, build_ignore_patterns): yield build_file while not cls._is_root_relpath(dir_relpath): dir_relpath = os.path.dirname(dir_relpath) for build_file in BuildFile.get_build_files_family(project_tree, dir_relpath, build_ignore_patterns): yield build_file
def _collect_ancestor_build_files(cls, project_tree, dir_relpath, build_ignore_patterns): for build_file in BuildFile.get_build_files_family(project_tree, dir_relpath, build_ignore_patterns): yield build_file while not cls._is_root_relpath(dir_relpath): dir_relpath = os.path.dirname(dir_relpath) for build_file in BuildFile.get_build_files_family(project_tree, dir_relpath, build_ignore_patterns): yield build_file
def to_url(m): if m.group(1): return m.group(0) # It's an http(s) url. path = m.group(0) if path.startswith("/"): path = os.path.relpath(path, buildroot) elif path.startswith(".."): # The path is not located inside the buildroot, so it's definitely not a BUILD file. return None else: # The path is located in the buildroot: see if it's a reference to a target in a BUILD file. parts = path.split(":") if len(parts) == 2: putative_dir = parts[0] else: putative_dir = path if os.path.isdir(os.path.join(buildroot, putative_dir)): build_files = list( BuildFile.get_build_files_family( FileSystemProjectTree(buildroot), putative_dir)) if build_files: path = build_files[0].relpath else: return None if os.path.exists(os.path.join(buildroot, path)): # The reporting server serves file content at /browse/<path_from_buildroot>. return "/browse/{}".format(path) else: return None
def test_sibling_build_files_duplicates(self): # This workspace is malformed, you can't shadow a name in a sibling BUILD file self.add_to_build_file('BUILD', dedent( """ fake(name="base", dependencies=[ ':foo', ]) """)) self.add_to_build_file('BUILD.foo', dedent( """ fake(name="foo", dependencies=[ ':bat', ]) """)) self.add_to_build_file('./BUILD.bar', dedent( """ fake(name="base") """)) with self.assertRaises(BuildFileParser.SiblingConflictException): self.build_file_parser.address_map_from_build_files( BuildFile.get_build_files_family(FileSystemProjectTree(self.build_root), '.'))
def test_sibling_build_files(self): self.add_to_build_file('BUILD', dedent( """ fake(name="base", dependencies=[ ':foo', ]) """)) self.add_to_build_file('BUILD.foo', dedent( """ fake(name="foo", dependencies=[ ':bat', ]) """)) self.add_to_build_file('./BUILD.bar', dedent( """ fake(name="bat") """)) bar_build_file = self.create_buildfile('BUILD.bar') base_build_file = self.create_buildfile('BUILD') foo_build_file = self.create_buildfile('BUILD.foo') address_map = self.build_file_parser.address_map_from_build_files( BuildFile.get_build_files_family(FileSystemProjectTree(self.build_root), ".")) addresses = address_map.keys() self.assertEqual({bar_build_file.relpath, base_build_file.relpath, foo_build_file.relpath}, {address.rel_path for address in addresses}) self.assertEqual({'//:base', '//:foo', '//:bat'}, {address.spec for address in addresses})
def to_url(m): if m.group(1): return m.group(0) # It's an http(s) url. path = m.group(0) if path.startswith('/'): path = os.path.relpath(path, buildroot) elif path.startswith('..'): # The path is not located inside the buildroot, so it's definitely not a BUILD file. return None else: # The path is located in the buildroot: see if it's a reference to a target in a BUILD file. parts = path.split(':') if len(parts) == 2: putative_dir = parts[0] else: putative_dir = path if os.path.isdir(os.path.join(buildroot, putative_dir)): build_files = list(BuildFile.get_build_files_family( FileSystemProjectTree(buildroot), putative_dir)) if build_files: path = build_files[0].relpath else: return None if os.path.exists(os.path.join(buildroot, path)): # The reporting server serves file content at /browse/<path_from_buildroot>. return '/browse/{}'.format(path) else: return None
def test_sibling_build_files_duplicates(self): # This workspace is malformed, you can't shadow a name in a sibling BUILD file self.add_to_build_file('BUILD', dedent( """ fake(name="base", dependencies=[ ':foo', ]) """)) self.add_to_build_file('BUILD.foo', dedent( """ fake(name="foo", dependencies=[ ':bat', ]) """)) self.add_to_build_file('./BUILD.bar', dedent( """ fake(name="base") """)) with self.assertRaises(BuildFileParser.SiblingConflictException): self.build_file_parser.address_map_from_build_files( BuildFile.get_build_files_family(FileSystemProjectTree(self.build_root), '.'))
def test_sibling_build_files(self): self.add_to_build_file('BUILD', dedent( """ fake(name="base", dependencies=[ ':foo', ]) """)) self.add_to_build_file('BUILD.foo', dedent( """ fake(name="foo", dependencies=[ ':bat', ]) """)) self.add_to_build_file('./BUILD.bar', dedent( """ fake(name="bat") """)) bar_build_file = self.create_buildfile('BUILD.bar') base_build_file = self.create_buildfile('BUILD') foo_build_file = self.create_buildfile('BUILD.foo') address_map = self.build_file_parser.address_map_from_build_files( BuildFile.get_build_files_family(FileSystemProjectTree(self.build_root), ".")) addresses = address_map.keys() self.assertEqual({bar_build_file.relpath, base_build_file.relpath, foo_build_file.relpath}, set([address.rel_path for address in addresses])) self.assertEqual({'//:base', '//:foo', '//:bat'}, set([address.spec for address in addresses]))
def get_build_files_family(self, relpath, build_ignore_patterns=None): return BuildFile.get_build_files_family( self._project_tree, relpath, build_ignore_patterns=self._create_ignore_spec( build_ignore_patterns), )
def _address_map_from_spec_path(self, spec_path): """Returns a resolution map of all addresses in a "directory" in the virtual address space. :returns {Address: (Address, <resolved Object>)}: """ if spec_path not in self._spec_path_to_address_map_map: try: build_files = list( BuildFile.get_build_files_family( self._project_tree, spec_path, self._build_ignore_patterns)) if not build_files: raise self.BuildFileScanError( "{spec_path} does not contain any BUILD files.".format( spec_path=os.path.join(self.root_dir, spec_path))) mapping = self._build_file_parser.address_map_from_build_files( build_files) except BuildFileParser.BuildFileParserError as e: raise AddressLookupError( "{message}\n Loading addresses from '{spec_path}' failed.". format(message=e, spec_path=spec_path)) address_map = { address: (address, addressed) for address, addressed in mapping.items() } self._spec_path_to_address_map_map[spec_path] = address_map return self._spec_path_to_address_map_map[spec_path]
def to_url(m): if m.group(1): return m.group(0) # It's an http(s) url. path = m.group(0) if path.startswith('/'): path = os.path.relpath(path, buildroot) else: # See if it's a reference to a target in a BUILD file. parts = path.split(':') if len(parts) == 2: putative_dir = parts[0] else: putative_dir = path if os.path.isdir(os.path.join(buildroot, putative_dir)): build_files = list( BuildFile.get_build_files_family( FileSystemProjectTree(buildroot), putative_dir)) if build_files: path = build_files[0].relpath else: return None if os.path.exists(os.path.join(buildroot, path)): # The reporting server serves file content at /browse/<path_from_buildroot>. return '/browse/{}'.format(path) else: return None
def test_sibling_build_files(self): self.add_to_build_file( "BUILD", dedent( """ fake(name="base", dependencies=[ ':foo', ]) """ ), ) self.add_to_build_file( "BUILD.foo", dedent( """ fake(name="foo", dependencies=[ ':bat', ]) """ ), ) self.add_to_build_file( "./BUILD.bar", dedent( """ fake(name="bat") """ ), ) bar_build_file = self.create_buildfile("BUILD.bar") base_build_file = self.create_buildfile("BUILD") foo_build_file = self.create_buildfile("BUILD.foo") address_map = self.build_file_parser.address_map_from_build_files( BuildFile.get_build_files_family(FileSystemProjectTree(self.build_root), ".") ) addresses = address_map.keys() self.assertEqual( {bar_build_file, base_build_file, foo_build_file}, set([address.build_file for address in addresses]) ) self.assertEqual({"//:base", "//:foo", "//:bat"}, set([address.spec for address in addresses]))
def _address_map_from_spec_path(self, spec_path): """Returns a resolution map of all addresses in a "directory" in the virtual address space. :returns {Address: (Address, <resolved Object>)}: """ if spec_path not in self._spec_path_to_address_map_map: try: build_files = list(BuildFile.get_build_files_family(self._project_tree, spec_path, self._build_ignore_patterns)) if not build_files: raise self.BuildFileScanError("{spec_path} does not contain any BUILD files." .format(spec_path=os.path.join(self.root_dir, spec_path))) mapping = self._build_file_parser.address_map_from_build_files(build_files) except BuildFileParser.BuildFileParserError as e: raise AddressLookupError("{message}\n Loading addresses from '{spec_path}' failed." .format(message=e, spec_path=spec_path)) address_map = {address: (address, addressed) for address, addressed in mapping.items()} self._spec_path_to_address_map_map[spec_path] = address_map return self._spec_path_to_address_map_map[spec_path]
def get_build_files_family(self, relpath, build_ignore_patterns=None): return BuildFile.get_build_files_family(self._project_tree, relpath, build_ignore_patterns=self._create_ignore_spec(build_ignore_patterns))
def get_build_files_family(self, relpath): return BuildFile.get_build_files_family(self._project_tree, relpath)