code: protected function generatePackageTree(
          PackageInterface $package,
          RepositoryInterface $installedRepo,
          RepositoryInterface $distantRepos
      ) {
          $requires = $package->getRequires();
          ksort($requires);
          $children = array();
          foreach ($requires as $requireName => $require) {
              $packagesInTree = array($package->getName(), $requireName);
  
              $treeChildDesc = array(
                  'name' => $requireName,
                  'version' => $require->getPrettyConstraint(),
              );
  
              $deepChildren = $this->addTree($requireName, $require, $installedRepo, $distantRepos, $packagesInTree);
  
              if ($deepChildren) {
                  $treeChildDesc['requires'] = $deepChildren;
              }
  
              $children[] = $treeChildDesc;
          }
          $tree = array(
              'name' => $package->getPrettyName(),
              'version' => $package->getPrettyVersion(),
              'description' => $package->getDescription(),
          );
  
          if ($children) {
              $tree['requires'] = $children;
          }
  
          return $tree;
      }
docs: Generate the package tree
  
  @param  PackageInterface $package
  @param  RepositoryInterface     $installedRepo
  @param  RepositoryInterface     $distantRepos
  @return array