Failed Conditions
Push — experimental/3.1 ( d52b28...afea38 )
by chihiro
28s
created

ComposerApiService::execRequire()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 9

Duplication

Lines 13
Ratio 100 %

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 1
dl 13
loc 13
rs 9.4285
c 0
b 0
f 0
1
<?php
2
/*
3
 * This file is part of EC-CUBE
4
 *
5
 * Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved.
6
 *
7
 * http://www.lockon.co.jp/
8
 *
9
 * This program is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU General Public License
11
 * as published by the Free Software Foundation; either version 2
12
 * of the License, or (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
 */
23
namespace Eccube\Service\Composer;
24
25
use Composer\Console\Application;
26
use Eccube\Annotation\Inject;
27
use Eccube\Annotation\Service;
28
use Symfony\Component\Console\Input\ArrayInput;
29
use Symfony\Component\Console\Output\BufferedOutput;
30
31
/**
32
 * Class ComposerApiService
33
 * @package Eccube\Service\Composer
34
 * @Service
35
 */
36
class ComposerApiService implements ComposerServiceInterface
37
{
38
    /**
39
     * @Inject("config")
40
     * @var array
41
     */
42
    protected $appConfig;
43
44
    /**
45
     * @var Application $consoleApplication
46
     */
47
    private $consoleApplication;
48
49
    private $workingDir;
50
51
    /**
52
     * Run get info command
53
     *
54
     * @param string $pluginName format foo/bar or foo/bar:1.0.0 or "foo/bar 1.0.0"
55
     * @return array
56
     */
57
    public function execInfo($pluginName)
58
    {
59
        $output = $this->runCommand(array(
60
            'command' => 'info',
61
            'package' => $pluginName,
62
        ));
63
64
        return OutputParser::parseInfo($output);
65
    }
66
67
    /**
68
     * Run execute command
69
     *
70
     * @param string $packageName format foo/bar or foo/bar:1.0.0 or "foo/bar 1.0.0"
71
     * @return array
72
     */
73 View Code Duplication
    public function execRequire($packageName)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
74
    {
75
        $output = $this->runCommand(array(
76
            'command' => 'require',
77
            'packages' => array($packageName),
78
            '--no-interaction' => true,
79
            '--profile' => true,
80
            '--prefer-dist' => true,
81
            '--ignore-platform-reqs' => true,
82
        ));
83
84
        return OutputParser::parseRequire($output);
85
    }
86
87
    /**
88
     * Run remove command
89
     *
90
     * @param string $packageName format foo/bar or foo/bar:1.0.0 or "foo/bar 1.0.0"
91
     * @return bool
92
     */
93 View Code Duplication
    public function execRemove($packageName)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
94
    {
95
        $this->runCommand(array(
96
            'command' => 'remove',
97
            'packages' => array($packageName),
98
            '--ignore-platform-reqs' => true,
99
            '--no-interaction' => true,
100
            '--profile' => true,
101
        ));
102
103
        return true;
104
    }
105
106
    /**
107
     * Get require
108
     *
109
     * @param string $packageName
110
     * @param string $callback
111
     * @param null   $typeFilter
112
     */
113
    public function foreachRequires($packageName, $callback, $typeFilter = null)
114
    {
115
        $info = $this->execInfo($packageName);
116
        if (isset($info['requires'])) {
117
            foreach ($info['requires'] as $name => $version) {
118
                $package = $this->execInfo($name);
119
                if (is_null($typeFilter) || @$package['type'] === $typeFilter) {
120
                    $callback($package);
121
                }
122
            }
123
        }
124
    }
125
126
    /**
127
     * Run get config information
128
     *
129
     * @param string $key
130
     * @param null   $value
131
     * @return array|mixed
132
     */
133
    public function execConfig($key, $value = null)
134
    {
135
        $commands = array(
136
            'command' => 'config',
137
            'setting-key' => $key,
138
            'setting-value' => $value,
139
        );
140
        if ($value) {
141
            $commands['setting-value'] = $value;
142
        }
143
        $output = $this->runCommand($commands);
144
145
        return OutputParser::parseConfig($output);
146
    }
147
148
    /**
149
     * Get config list
150
     *
151
     * @return array
152
     */
153
    public function getConfig()
154
    {
155
        $output = $this->runCommand(array(
156
            'command' => 'config',
157
            '--list' => true,
158
        ));
159
160
        return OutputParser::parseList($output);
161
    }
162
163
    /**
164
     * Set work dir
165
     *
166
     * @param string $workingDir
167
     */
168
    public function setWorkingDir($workingDir)
169
    {
170
        $this->workingDir = $workingDir;
171
    }
172
173
    /**
174
     * Run composer command
175
     *
176
     * @param array $commands
177
     * @return string
178
     */
179
    public function runCommand($commands)
180
    {
181
        $this->init();
182
        $commands['--working-dir'] = $this->workingDir;
183
        $commands['--no-ansi'] = 1;
184
        $input = new ArrayInput($commands);
185
        $output = new BufferedOutput();
186
187
        $exitCode = $this->consoleApplication->run($input, $output);
188
189
        $log = $output->fetch();
190
        if ($exitCode) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $exitCode of type null|integer is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
191
            log_error($log);
192
            throw new \RuntimeException($log);
193
        }
194
        log_info($log, $commands);
195
196
        return $log;
197
    }
198
199
    /**
200
     * Init composer console application
201
     */
202
    private function init()
203
    {
204
        set_time_limit(0);
205
        @ini_set('memory_limit', '1536M');
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
206
        // Config for some environment
207
        putenv('COMPOSER_HOME='.$this->appConfig['plugin_realdir'].'/.composer');
208
        $consoleApplication = new Application();
209
        $consoleApplication->resetComposer();
210
        $consoleApplication->setAutoExit(false);
211
        $this->consoleApplication = $consoleApplication;
212
        $this->workingDir = $this->workingDir ? $this->workingDir : $this->appConfig['root_dir'];
213
    }
214
}
215