• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

68publishers / tracy-git-version / 5982422976

26 Aug 2023 02:55AM UTC coverage: 90.041% (-2.2%) from 92.276%
5982422976

Pull #4

github

web-flow
Merge 0c60a3907 into fa82db0dd
Pull Request #4: Feature/git executable

465 of 465 new or added lines in 32 files covered. (100.0%)

434 of 482 relevant lines covered (90.04%)

0.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.89
/src/Bridge/Nette/DI/TracyGitVersionExtension.php
1
<?php
2

3
declare(strict_types=1);
4

5
namespace SixtyEightPublishers\TracyGitVersion\Bridge\Nette\DI;
6

7
use Nette\DI\CompilerExtension;
8
use Nette\DI\Definitions\ServiceDefinition;
9
use Nette\DI\Definitions\Statement;
10
use Nette\Schema\Expect;
11
use Nette\Schema\Schema;
12
use SixtyEightPublishers\TracyGitVersion\Bridge\Tracy\Block\CurrentStateBlock;
13
use SixtyEightPublishers\TracyGitVersion\Bridge\Tracy\GitVersionPanel;
14
use SixtyEightPublishers\TracyGitVersion\Repository\Command\GetHeadCommand;
15
use SixtyEightPublishers\TracyGitVersion\Repository\Command\GetLatestTagCommand;
16
use SixtyEightPublishers\TracyGitVersion\Repository\GitRepositoryInterface;
17
use SixtyEightPublishers\TracyGitVersion\Repository\LocalDirectory\CommandHandler\GetHeadCommandHandler;
18
use SixtyEightPublishers\TracyGitVersion\Repository\LocalDirectory\CommandHandler\GetLatestTagCommandHandler;
19
use SixtyEightPublishers\TracyGitVersion\Repository\LocalDirectory\GitDirectory;
20
use SixtyEightPublishers\TracyGitVersion\Repository\LocalGitRepository;
21
use SixtyEightPublishers\TracyGitVersion\Repository\ResolvableGitRepository;
22
use SixtyEightPublishers\TracyGitVersion\Repository\RuntimeCachedGitRepository;
23
use Tracy\Bar;
24
use function array_keys;
25
use function array_map;
26
use function arsort;
27
use function assert;
28

29
final class TracyGitVersionExtension extends CompilerExtension
30
{
31
    public const TAG_GIT_REPOSITORY = '68publishers.tracy_git_version_panel.tag.git_repository';
32

33
    public function getConfigSchema(): Schema
34
    {
35
        return Expect::structure([
1✔
36
            'source_name' => Expect::string(GitRepositoryInterface::SOURCE_GIT_DIRECTORY),
1✔
37
            'command_handlers' => Expect::arrayOf(Expect::anyOf(Expect::type(Statement::class), Expect::string()), 'string')
1✔
38
                ->default([
1✔
39
                    GetHeadCommand::class => new Statement(GetHeadCommandHandler::class, [
1✔
40
                        'useBinary' => true,
41
                    ]),
42
                    GetLatestTagCommand::class => new Statement(GetLatestTagCommandHandler::class, [
1✔
43
                        'useBinary' => true,
44
                    ]),
45
                ])
46
                ->mergeDefaults()
1✔
47
                ->before(static function (array $items) {
1✔
48
                    return array_map(static function ($item) {
×
49
                        return $item instanceof Statement ? $item : new Statement($item);
×
50
                    }, $items);
×
51
                }),
1✔
52
            'panel' => Expect::structure([
1✔
53
                'blocks' => Expect::listOf(Expect::anyOf(Expect::type(Statement::class), Expect::string()))
1✔
54
                    ->default([
1✔
55
                        new Statement(CurrentStateBlock::class),
1✔
56
                    ])
57
                    ->mergeDefaults()
1✔
58
                    ->before(static function (array $items) {
1✔
59
                        return array_map(static function ($item) {
×
60
                            return $item instanceof Statement ? $item : new Statement($item);
×
61
                        }, $items);
×
62
                    }),
1✔
63
            ])->castTo(TracyGitVersionPanelConfig::class),
1✔
64
        ])->castTo(TracyGitVersionConfig::class);
1✔
65
    }
66

67
    public function loadConfiguration(): void
68
    {
69
        $builder = $this->getContainerBuilder();
1✔
70
        $config = $this->getConfig();
1✔
71
        assert($config instanceof TracyGitVersionConfig);
72

73
        # default git repository service
74
        $builder->addDefinition($this->prefix('git_repository'))
1✔
75
            ->setAutowired(GitRepositoryInterface::class)
1✔
76
            ->setType(GitRepositoryInterface::class)
1✔
77
            ->setFactory($this->prefix('@git_repository.runtime_cached'));
1✔
78

79
        # runtime cached git repository
80
        $builder->addDefinition($this->prefix('git_repository.runtime_cached'))
1✔
81
            ->setAutowired(false)
1✔
82
            ->setFactory(RuntimeCachedGitRepository::class, [$this->prefix('@git_repository.resolvable')]);
1✔
83

84
        # resolvable git repository
85
        $builder->addDefinition($this->prefix('git_repository.resolvable'))
1✔
86
            ->setAutowired(false)
1✔
87
            ->setType(ResolvableGitRepository::class);
1✔
88

89
        # local directory git repository
90
        $builder->addDefinition($this->prefix('git_repository.local_directory'))
1✔
91
            ->setAutowired(false)
1✔
92
            ->setFactory(LocalGitRepository::class, [
1✔
93
                'gitDirectory' => new Statement([GitDirectory::class, 'createAutoDetected']),
1✔
94
                'handlers' => $config->command_handlers,
1✔
95
                'source' => $config->source_name,
1✔
96
            ])
97
            ->addTag(self::TAG_GIT_REPOSITORY, 100);
1✔
98
    }
1✔
99

100
    public function beforeCompile(): void
101
    {
102
        $builder = $this->getContainerBuilder();
1✔
103
        $config = $this->getConfig();
1✔
104
        assert($config instanceof TracyGitVersionConfig);
105

106
        # pass git repositories into resolvable repository
107
        $resolvableGitRepository = $builder->getDefinition($this->prefix('git_repository.resolvable'));
1✔
108
        assert($resolvableGitRepository instanceof ServiceDefinition);
109

110
        $repositories = array_map('intval', $builder->findByTag(self::TAG_GIT_REPOSITORY));
1✔
111

112
        arsort($repositories);
1✔
113

114
        $resolvableGitRepository->setArguments([
1✔
115
            array_map(static fn (string $serviceName): string => '@' . $serviceName, array_keys($repositories)),
1✔
116
        ]);
117

118
        # add panel into Tracy
119
        if (!$this->isDebugMode()) {
1✔
120
            return;
1✔
121
        }
122

123
        $barServiceName = $builder->getByType(Bar::class, false);
1✔
124

125
        if (null === $barServiceName) {
1✔
126
            return;
×
127
        }
128

129
        $barService = $builder->getDefinition($barServiceName);
1✔
130
        assert($barService instanceof ServiceDefinition);
131

132
        $barService->addSetup('addPanel', [
1✔
133
            new Statement(GitVersionPanel::class, [
1✔
134
                $this->prefix('@git_repository'),
1✔
135
                $config->panel->blocks,
1✔
136
            ]),
137
        ]);
138
    }
1✔
139

140
    private function isDebugMode(): bool
141
    {
142
        return $this->getContainerBuilder()->parameters['debugMode'] ?? false;
1✔
143
    }
144
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc