Completed
Pull Request — master (#347)
by Victor
02:35
created

ExecuteCoreUpgradeScriptsCommand   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 89
Duplicated Lines 4.49 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 0%

Importance

Changes 10
Bugs 1 Features 0
Metric Value
wmc 11
c 10
b 1
f 0
lcom 1
cbo 8
dl 4
loc 89
ccs 0
cts 68
cp 0
rs 10

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
/**
4
 * @author Victor Dubiniuk <[email protected]>
5
 *
6
 * @copyright Copyright (c) 2015, ownCloud, Inc.
7
 * @license AGPL-3.0
8
 *
9
 * This code is free software: you can redistribute it and/or modify
10
 * it under the terms of the GNU Affero General Public License, version 3,
11
 * as published by the Free Software Foundation.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
 * GNU Affero General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Affero General Public License, version 3,
19
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
20
 *
21
 */
22
23
namespace Owncloud\Updater\Command;
24
25
use Owncloud\Updater\Utils\Checkpoint;
26
use Owncloud\Updater\Utils\FilesystemHelper;
27
use Symfony\Component\Console\Input\InputInterface;
28
use Symfony\Component\Console\Output\OutputInterface;
29
use Symfony\Component\Process\Exception\ProcessFailedException;
30
use Owncloud\Updater\Utils\OccRunner;
31
use Owncloud\Updater\Utils\ZipExtractor;
32
use Owncloud\Updater\Utils\BzipExtractor;
33
34
class ExecuteCoreUpgradeScriptsCommand extends Command {
35
36
	/**
37
	 * @var OccRunner $occRunner
38
	 */
39
	protected $occRunner;
40
41
	public function __construct($occRunner){
42
		parent::__construct();
43
		$this->occRunner = $occRunner;
44
	}
45
46
	protected function configure(){
47
		$this
48
				->setName('upgrade:executeCoreUpgradeScripts')
49
				->setDescription('execute core upgrade scripts [danger, might take long]');
50
	}
51
52
	protected function execute(InputInterface $input, OutputInterface $output){
53
		$locator = $this->container['utils.locator'];
54
		/** @var FilesystemHelper $fsHelper */
55
		$fsHelper = $this->container['utils.filesystemhelper'];
56
		$registry = $this->container['utils.registry'];
57
		$fetcher = $this->container['utils.fetcher'];
58
		/** @var Checkpoint $checkpoint */
59
		$checkpoint = $this->container['utils.checkpoint'];
60
61
		$installedVersion = implode('.', $locator->getInstalledVersion());
62
		$registry->set('installedVersion', $installedVersion);
63
		
64
		$feed = $registry->get('feed');
65
66
		if ($feed){
67
			$path = $fetcher->getBaseDownloadPath($feed);
68
			$fullExtractionPath = $locator->getExtractionBaseDir() . '/' . $feed->getVersion();
69
70
			if (file_exists($fullExtractionPath)){
71
				$fsHelper->removeIfExists($fullExtractionPath);
72
			}
73
			try{
74
				$fsHelper->mkdir($fullExtractionPath, true);
75
			} catch (\Exception $e){
76
					$output->writeln('Unable create directory ' . $fullExtractionPath);
77
					throw $e;
78
			}
79
80
			$output->writeln('Extracting source into ' . $fullExtractionPath);
81
			if (preg_match('|\.tar\.bz2$|', $path)){
82
				$extractor = new BzipExtractor($path, $fullExtractionPath);
83
			} else {
84
				$extractor = new ZipExtractor($path, $fullExtractionPath);
85
			}
86
			try{
87
				$extractor->extract();
88
			} catch (\Exception $e){
89
				$output->writeln('Extraction has been failed');
90
				$fsHelper->removeIfExists($locator->getExtractionBaseDir());
91
				throw $e;
92
			}
93
94
			$tmpDir = $locator->getExtractionBaseDir() . '/' . $installedVersion;
95
			$fsHelper->removeIfExists($tmpDir);
96
			$fsHelper->mkdir($tmpDir);
97
			$fsHelper->mkdir($tmpDir . '/config');
98
			$oldSourcesDir = $locator->getOwncloudRootPath();
99
			$newSourcesDir = $fullExtractionPath . '/owncloud';
100
101
			foreach ($locator->getRootDirContent() as $dir){
102
				$this->getApplication()->getLogger()->debug('Replacing ' . $dir);
103
				$fsHelper->tripleMove($oldSourcesDir, $newSourcesDir, $tmpDir, $dir);
104
			}
105
			
106
			try {
107
				$appDirectories = $fsHelper->scandirFiltered($oldSourcesDir . '/apps');
108
				foreach ($appDirectories as $appDirectory){
109
					$fsHelper->rmdirr($oldSourcesDir . '/apps/' . $appDirectory);
110
				}
111
				$plain = $this->occRunner->run('upgrade');
112
				$output->writeln($plain);
113
			} catch (ProcessFailedException $e){
114
				$lastCheckpointId = $checkpoint->getLastCheckpointId();
115
				if ($lastCheckpointId){
116
					$lastCheckpointPath = $checkpoint->getCheckpointPath($lastCheckpointId);
117
					$fsHelper->copyr($lastCheckpointPath . '/apps', $oldSourcesDir . '/apps', false)
118
				}
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected '}'
Loading history...
119
				if ($e->getProcess()->getExitCode() != 3){
120
					throw ($e);
121
				}
122
			}
123
		}
124
	}
125
126
}
127