<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Thanks\Command;
use Composer\Command\BaseCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Thanks\GitHubClient;
/**
* @author Nicolas Grekas <p@tchwork.com>
*/
class FundCommand extends BaseCommand
{
private $star = '★ ';
private $love = '💖 ';
private $cash = '💵 ';
protected function configure(): void
{
if ('Hyper' === getenv('TERM_PROGRAM')) {
$this->star = '⭐ ';
} elseif ('\\' === \DIRECTORY_SEPARATOR) {
$this->star = '*';
$this->love = '<3';
$this->cash = '$$$';
}
$this->setName('fund')
->setDescription(sprintf('Discover the funding links that fellow PHP package maintainers publish %s.', $this->cash))
;
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$composer = $this->getComposer();
$gitHub = new GitHubClient($composer, $this->getIO());
$repos = $gitHub->getRepositories($failures, true);
$fundings = [];
$notStarred = 0;
foreach ($repos as $alias => $repo) {
$notStarred += (int) !$repo['viewerHasStarred'];
foreach ($repo['fundingLinks'] as $link) {
list($owner, $package) = explode('/', $repo['package'], 2);
$fundings[$owner][$link['url']][] = $package;
}
}
if ($fundings) {
$prev = null;
$output->writeln('The following packages were found in your dependencies and publish sponsoring links on their GitHub page:');
foreach ($fundings as $owner => $links) {
$output->writeln(sprintf("\n<comment>%s</comment>", $owner));
foreach ($links as $url => $packages) {
$line = sprintf(' <info>%s/%s</>', $owner, implode(', ', $packages));
if ($prev !== $line) {
$output->writeln($line);
$prev = $line;
}
$output->writeln(sprintf(' %s %s', $this->cash, $url));
}
}
$output->writeln("\nPlease consider following these links and sponsoring the work of package authors!");
$output->writeln(sprintf("\nThank you! %s", $this->love));
} else {
$output->writeln("No funding links were found in your package dependencies. This doesn't mean they don't need your support!");
}
if ($notStarred) {
$output->writeln(sprintf("\nRun <comment>composer thanks</> to send a %s to <comment>%d</comment> GitHub repositor%s of your fellow package maintainers.", $this->star, $notStarred, 1 < $notStarred ? 'ies' : 'y'));
}
return 0;
}
}
|