Completed
Pull Request — master (#8)
by ARCANEDEV
04:13
created

RepositoriesTrait   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 89
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 4
Bugs 0 Features 0
Metric Value
wmc 8
c 4
b 0
f 0
lcom 1
cbo 5
dl 0
loc 89
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
getComposer() 0 1 ?
getLogger() 0 1 ?
A addRepositories() 0 20 4
A addRepository() 0 17 4
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 array $json */
20
    protected $json = [];
21
22
    /* ------------------------------------------------------------------------------------------------
23
     |  Getters & Setters
24
     | ------------------------------------------------------------------------------------------------
25
     */
26
    /**
27
     * Get composer.
28
     *
29
     * @return \Composer\Composer
30
     */
31
    abstract public function getComposer();
32
33
    /**
34
     * Get the Logger.
35
     *
36
     * @return \Arcanedev\Composer\Utilities\Logger
37
     */
38
    abstract public function getLogger();
39
40
    /* ------------------------------------------------------------------------------------------------
41
     |  Main Functions
42
     | ------------------------------------------------------------------------------------------------
43
     */
44
    /**
45
     * Add a collection of repositories described by the given configuration
46
     * to the given package and the global repository manager.
47
     *
48
     * @param  \Composer\Package\RootPackageInterface    $root
49
     * @param  \Arcanedev\Composer\Entities\PluginState  $state
50
     */
51
    private function addRepositories(RootPackageInterface $root, PluginState $state)
52
    {
53
        if (isset($this->json['repositories'])) {
54
            $prepend      = $state->shouldPrependRepositories();
55
            $repoManager  = $this->getComposer()->getRepositoryManager();
56
            $repositories = [];
57
58
            foreach ($this->json['repositories'] as $repoJson) {
59
                $this->addRepository($repoManager, $repositories, $repoJson, $prepend);
60
            }
61
62
            /** @var \Composer\Package\RootPackageInterface $unwrapped */
63
            $unwrapped   = self::unwrapIfNeeded($root, 'setRepositories');
64
            $mergedRepos = $prepend
65
                ? array_merge($repositories, $root->getRepositories())
66
                : array_merge($root->getRepositories(), $repositories);
67
68
            $unwrapped->setRepositories($mergedRepos);
69
        }
70
    }
71
72
    /* ------------------------------------------------------------------------------------------------
73
     |  Other Functions
74
     | ------------------------------------------------------------------------------------------------
75
     */
76
    /**
77
     * Add a repository to collection of repositories.
78
     *
79
     * @param  \Composer\Repository\RepositoryManager  $repoManager
80
     * @param  array                                   $repositories
81
     * @param  array                                   $repoJson
82
     * @param  bool                                    $prepend
83
     */
84
    private function addRepository(
85
        RepositoryManager $repoManager, array &$repositories, $repoJson, $prepend
86
    ) {
87
        if (isset($repoJson['type'])) {
88
            $this->getLogger()->info(
89
                $prepend ? "Prepending {$repoJson['type']} repository" : "Adding {$repoJson['type']} repository"
90
            );
91
92
            $repository = $repoManager->createRepository($repoJson['type'], $repoJson);
93
94
            $prepend
95
                ? $repoManager->prependRepository($repository)
96
                : $repoManager->addRepository($repository);
97
98
            $repositories[] = $repository;
99
        }
100
    }
101
}
102