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

ReferencesTrait::unwrapIfNeeded()

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 3
nc 1
1
<?php namespace Arcanedev\Composer\Entities\PackageTraits;
2
3
use Composer\Package\BasePackage;
4
use Composer\Package\RootPackageInterface;
5
use Composer\Package\Version\VersionParser;
6
7
/**
8
 * Trait     ReferencesTrait
9
 *
10
 * @package  Arcanedev\Composer\Entities\PackageTraits
11
 * @author   ARCANEDEV <[email protected]>
12
 */
13
trait ReferencesTrait
14
{
15
    /* ------------------------------------------------------------------------------------------------
16
     |  Main Functions
17
     | ------------------------------------------------------------------------------------------------
18
     */
19
    /**
20
     * Update the root packages reference information.
21
     *
22
     * @param  \Composer\Package\RootPackageInterface  $root
23
     */
24
    protected function mergeReferences(RootPackageInterface $root)
25
    {
26
        // Merge source reference information for merged packages.
27
        // @see \Composer\Package\Loader\RootPackageLoader::load
28
        $references = [];
29
        $unwrapped  = $this->unwrapIfNeeded($root, 'setReferences');
30
31
        foreach (['require', 'require-dev'] as $linkType) {
32
            $linkInfo = BasePackage::$supportedLinkTypes[$linkType];
33
            $method   = 'get'.ucfirst($linkInfo['method']);
34
            $links    = [];
35
36
            /** @var  \Composer\Package\Link  $link */
37
            foreach ($unwrapped->$method() as $link) {
38
                $links[$link->getTarget()] = $link->getConstraint()->getPrettyString();
39
            }
40
41
            $references = $this->extractReferences($links, $references);
42
        }
43
44
        $unwrapped->setReferences($references);
45
    }
46
47
    /**
48
     * Extract vcs revision from version constraint (dev-master#abc123).
49
     * @see \Composer\Package\Loader\RootPackageLoader::extractReferences()
50
     *
51
     * @param  array  $requires
52
     * @param  array  $references
53
     *
54
     * @return array
55
     */
56
    private function extractReferences(array $requires, array $references)
57
    {
58
        foreach ($requires as $reqName => $reqVersion) {
59
            $reqVersion = preg_replace('{^([^,\s@]+) as .+$}', '$1', $reqVersion);
60
            if (
61
                preg_match('{^[^,\s@]+?#([a-f0-9]+)$}', $reqVersion, $match) &&
62
                VersionParser::parseStability($reqVersion) === 'dev'
63
            ) {
64
                $references[strtolower($reqName)] = $match[1];
65
            }
66
        }
67
68
        return $references;
69
    }
70
71
    /**
72
     * Get a full featured Package from a RootPackageInterface.
73
     *
74
     * @param  \Composer\Package\RootPackageInterface|\Composer\Package\RootPackage  $root
75
     * @param  string                                                                $method
76
     *
77
     * @return \Composer\Package\RootPackageInterface|\Composer\Package\RootPackage
78
     */
79
    abstract protected function unwrapIfNeeded(
80
        RootPackageInterface $root, $method = 'setExtra'
81
    );
82
}
83