code: def find_packages(self, root_target, chroot):
      
      base = os.path.join(chroot.path(), self.SOURCE_ROOT)
      packages, namespace_packages = set(), set()
      resources = defaultdict(set)
  
      def iter_files():
        for root, _, files in safe_walk(base):
          module = os.path.relpath(root, base).replace(os.path.sep, '.')
          for filename in files:
            yield module, filename, os.path.join(root, filename)
  
      # establish packages, namespace packages in first pass
      inits_to_check = {}
      for module, filename, real_filename in iter_files():
        if filename != '__init__.py':
          continue
        packages.add(module)
        inits_to_check[real_filename] = module
      namespace_packages = {inits_to_check[init]
                            for init in self.filter_namespace_packages(root_target,
                                                                       inits_to_check.keys())}
  
      # second pass establishes non-source content (resources)
      for module, filename, real_filename in iter_files():
        if filename.endswith('.py'):
          if module not in packages:
            # TODO(wickman) Consider changing this to a full-on error as it could indicate bad BUILD
            # hygiene.
            # raise cls.UndefinedSource('{} is source but does not belong to a package!'
            #                           .format(filename))
            self.context.log.warn('{} is source but does not belong to a package.'
                                  .format(real_filename))
          else:
            continue
        submodule = self.nearest_subpackage(module, packages)
        if submodule == module:
          resources[submodule].add(filename)
        else:
          assert module.startswith(submodule + '.')
          relative_module = module[len(submodule) + 1:]
          relative_filename = os.path.join(relative_module.replace('.', os.path.sep), filename)
          resources[submodule].add(relative_filename)
  
      return packages, namespace_packages, resources
docs: Detect packages, namespace packages and resources from an existing chroot.
  
      :returns: a tuple of:
                  set(packages)
                  set(namespace_packages)
                  map(package => set(files))