docs: def _resolve_deps(self, formula_def):
          '''
          Return a list of packages which need to be installed, to resolve all
          dependencies
          '''
          pkg_info = self.pkgdb['{0}.info'.format(self.db_prov)](formula_def['name'])
          if not isinstance(pkg_info, dict):
              pkg_info = {}
  
          can_has = {}
          cant_has = []
          if 'dependencies' in formula_def and formula_def['dependencies'] is None:
              formula_def['dependencies'] = ''
          for dep in formula_def.get('dependencies', '').split(','):
              dep = dep.strip()
              if not dep:
                  continue
              if self.pkgdb['{0}.info'.format(self.db_prov)](dep):
                  continue
  
              if dep in self.avail_pkgs:
                  can_has[dep] = self.avail_pkgs[dep]
              else:
                  cant_has.append(dep)
  
          optional = formula_def.get('optional', '').split(',')
          recommended = formula_def.get('recommended', '').split(',')
  
          inspected = []
          to_inspect = can_has.copy()
          while to_inspect:
              dep = next(six.iterkeys(to_inspect))
              del to_inspect[dep]
  
              # Don't try to resolve the same package more than once
              if dep in inspected:
                  continue
              inspected.append(dep)
  
              repo_contents = self.repo_metadata.get(can_has[dep], {})
              repo_packages = repo_contents.get('packages', {})
              dep_formula = repo_packages.get(dep, {}).get('info', {})
  
              also_can, also_cant, opt_dep, rec_dep = self._resolve_deps(dep_formula)
              can_has.update(also_can)
              cant_has = sorted(set(cant_has + also_cant))
              optional = sorted(set(optional + opt_dep))
              recommended = sorted(set(recommended + rec_dep))
  
          return can_has, cant_has, optional, recommended