Completed
Pull Request — master (#8)
by ARCANEDEV
02:29
created

RepositoriesTrait::addRepositories()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 20
rs 9.2
cc 4
eloc 12
nc 5
nop 2
1
<?php namespace Arcanedev\Composer\Entities\PackageTraits;
2
3
use Arcanedev\Composer\Entities\PluginState;
4
use Composer\Package\RootPackageInterface;
5
use Composer\Repository\RepositoryManager;
6
7
/**
8
 * Trait     RepositoriesTrait
9
 *
10
 * @package  Arcanedev\Composer\Entities\PackageTraits
11
 * @author   ARCANEDEV <[email protected]>
12
 */
13
trait RepositoriesTrait
14
{
15
    /* ------------------------------------------------------------------------------------------------
16
     |  Properties
17
     | ------------------------------------------------------------------------------------------------
18
     */
19
    /** @var \Composer\Composer $composer */
20
    protected $composer;
21
22
    /** @var \Arcanedev\Composer\Utilities\Logger $logger */
23
    protected $logger;
24
25
    /** @var array $json */
26
    protected $json;
27
28
    /* ------------------------------------------------------------------------------------------------
29
     |  Main Functions
30
     | ------------------------------------------------------------------------------------------------
31
     */
32
    /**
33
     * Add a collection of repositories described by the given configuration
34
     * to the given package and the global repository manager.
35
     *
36
     * @param  \Composer\Package\RootPackageInterface    $root
37
     * @param  \Arcanedev\Composer\Entities\PluginState  $state
38
     */
39
    private function addRepositories(RootPackageInterface $root, PluginState $state)
40
    {
41
        if (isset($this->json['repositories'])) {
42
            $prepend      = $state->shouldPrependRepositories();
43
            $repoManager  = $this->composer->getRepositoryManager();
44
            $repositories = [];
45
46
            foreach ($this->json['repositories'] as $repoJson) {
47
                $this->addRepository($repoManager, $repositories, $repoJson, $prepend);
48
            }
49
50
            /** @var \Composer\Package\RootPackageInterface $unwrapped */
51
            $unwrapped   = self::unwrapIfNeeded($root, 'setRepositories');
52
            $mergedRepos = $prepend
53
                ? array_merge($repositories, $root->getRepositories())
54
                : array_merge($root->getRepositories(), $repositories);
55
56
            $unwrapped->setRepositories($mergedRepos);
57
        }
58
    }
59
60
    /* ------------------------------------------------------------------------------------------------
61
     |  Other Functions
62
     | ------------------------------------------------------------------------------------------------
63
     */
64
    /**
65
     * Add a repository to collection of repositories.
66
     *
67
     * @param  \Composer\Repository\RepositoryManager  $repoManager
68
     * @param  array                                   $repositories
69
     * @param  array                                   $repoJson
70
     * @param  bool                                    $prepend
71
     */
72
    private function addRepository(
73
        RepositoryManager $repoManager, array &$repositories, $repoJson, $prepend
74
    ) {
75
        if (isset($repoJson['type'])) {
76
            $this->logger->info(
77
                $prepend ? "Prepending {$repoJson['type']} repository" : "Adding {$repoJson['type']} repository"
78
            );
79
80
            $repository = $repoManager->createRepository($repoJson['type'], $repoJson);
81
82
            $prepend
83
                ? $repoManager->prependRepository($repository)
84
                : $repoManager->addRepository($repository);
85
86
            $repositories[] = $repository;
87
        }
88
    }
89
}
90