mageekguy\atoum\scripts\builder: lines coverage

93% of 1509

OPs

85% of 363

Lines

77% of 181

Branches

14% of 430

Paths
Method OPs OPs % Lines Line % Branches Branches % Paths Path %
mageekguy\atoum\scripts\builder::__construct() 36 100% 7 100% 1 0% 1 100%
mageekguy\atoum\scripts\builder::setVcs() 16 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getVcs() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setTaggerEngine() 9 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getTaggerEngine() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setPhp() 16 100% 3 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getPhp() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setPhpPath() 13 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getPhpPath() 10 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getRunnerConfigurationFiles() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::addRunnerConfigurationFile() 11 100% 3 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::enablePharCreation() 9 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::disablePharCreation() 9 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::pharCreationIsEnabled() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::disableUnitTestChecking() 9 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::enableUnitTestChecking() 9 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::unitTestCheckingIsEnabled() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setVersion() 10 100% 4 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getVersion() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setScoreDirectory() 15 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getScoreDirectory() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setErrorsDirectory() 15 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getErrorsDirectory() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setDestinationDirectory() 15 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getDestinationDirectory() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setWorkingDirectory() 15 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getWorkingDirectory() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setRevisionFile() 10 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getRevisionFile() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setReportTitle() 10 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getReportTitle() 6 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setUnitTestRunnerScript() 10 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getUnitTestRunnerScript() 6 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setPharGeneratorScript() 10 100% 3 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getPharGeneratorScript() 6 100% 1 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::setRunFile() 9 100% 2 100% 1 100% 1 100%
mageekguy\atoum\scripts\builder::getRunFile() 30 40% 1 100% 5 60% 2 50%
mageekguy\atoum\scripts\builder::checkUnitTests() 377 92% 60 100% 58 69% 233 1%
mageekguy\atoum\scripts\builder::createPhar() 290 99% 56 100% 46 83% 138 8%
mageekguy\atoum\scripts\builder::writeErrorInErrorsDirectory() 69 93% 12 100% 14 71% 7 57%
mageekguy\atoum\scripts\builder::includeConfigFile() 24 100% 6 100% 4 75% 2 50%
mageekguy\atoum\scripts\builder::setArgumentHandlers() 192 100% 138 62% 1 100% 1 100%
mageekguy\atoum\scripts\builder::doRun() 158 67% 20 90% 16 50% 10 10%
mageekguy\atoum\scripts\builder::cleanDirectoryPath() 13 100% 1 100% 1 100% 1 100%
#
1
<?php
2

                    
3
namespace mageekguy\atoum\scripts;
4

                    
5
use
6
	mageekguy\atoum,
7
	mageekguy\atoum\exceptions,
8
	mageekguy\atoum\scripts\phar,
9
	mageekguy\atoum\scripts\builder
10
;
11

                    
12
class builder extends atoum\script\configurable
13
{
14
	const defaultConfigFile = '.builder.php';
15
	const defaultUnitTestRunnerScript = 'scripts/runner.php';
16
	const defaultPharGeneratorScript = 'scripts/phar/generator.php';
17

                    
18
	protected $php = null;
19
	protected $vcs = null;
20
	protected $taggerEngine = null;
21
	protected $revision = null;
22
	protected $version = null;
23
	protected $unitTestRunnerScript = null;
24
	protected $pharGeneratorScript = null;
25
	protected $workingDirectory = null;
26
	protected $destinationDirectory = null;
27
	protected $scoreDirectory = null;
28
	protected $errorsDirectory = null;
29
	protected $revisionFile = null;
30
	protected $runFile = null;
31
	protected $pharCreationEnabled = true;
32
	protected $checkUnitTests = true;
33
	protected $reportTitle = null;
34
	protected $runnerConfigurationFiles = array();
35

                    
36
	public function __construct($name, atoum\adapter $adapter = null)100%
37
	{
38
		parent::__construct($name, $adapter);
39

                    
40
		$this
41
			->setVcs()
42
			->setPhp()
43
			->setUnitTestRunnerScript(self::defaultUnitTestRunnerScript)
44
			->setPharGeneratorScript(self::defaultPharGeneratorScript)
45
		;
46
	}
47

                    
48
	public function setVcs(builder\vcs $vcs = null)100%
49
	{
50
		$this->vcs = $vcs ?: new builder\vcs\svn();
51

                    
52
		return $this;
53
	}
54

                    
55
	public function getVcs()100%
56
	{
57
		return $this->vcs;
58
	}
59

                    
60
	public function setTaggerEngine(atoum\scripts\tagger\engine $engine)100%
61
	{
62
		$this->taggerEngine = $engine;
63

                    
64
		return $this;
65
	}
66

                    
67
	public function getTaggerEngine()100%
68
	{
69
		return $this->taggerEngine;
70
	}
71

                    
72
	public function setPhp(atoum\php $php = null)
73
	{
74
		$this->php = $php ?: new atoum\php();
75

                    
76
		return $this;
77
	}
78

                    
79
	public function getPhp()100%
80
	{
81
		return $this->php;
82
	}
83

                    
84
	public function setPhpPath($path)100%
85
	{
86
		$this->php->setBinaryPath($path);
87

                    
88
		return $this;
89
	}
90

                    
91
	public function getPhpPath()
92
	{
93
		return $this->php->getBinaryPath();
94
	}
95

                    
96
	public function getRunnerConfigurationFiles()100%
97
	{
98
		return $this->runnerConfigurationFiles;
99
	}
100

                    
101
	public function addRunnerConfigurationFile($file)100%
102
	{
103
		$this->runnerConfigurationFiles[] = (string) $file;
104

                    
105
		return $this;
106
	}
107

                    
108
	public function enablePharCreation()100%
109
	{
110
		$this->pharCreationEnabled = true;
111

                    
112
		return $this;
113
	}
114

                    
115
	public function disablePharCreation()100%
116
	{
117
		$this->pharCreationEnabled = false;
118

                    
119
		return $this;
120
	}
121

                    
122
	public function pharCreationIsEnabled()100%
123
	{
124
		return $this->pharCreationEnabled;
125
	}
126

                    
127
	public function disableUnitTestChecking()100%
128
	{
129
		$this->checkUnitTests = false;
130

                    
131
		return $this;
132
	}
133

                    
134
	public function enableUnitTestChecking()100%
135
	{
136
		$this->checkUnitTests = true;
137

                    
138
		return $this;
139
	}
140

                    
141
	public function unitTestCheckingIsEnabled()100%
142
	{
143
		return $this->checkUnitTests;
144
	}
145

                    
146
	public function setVersion($version)100%
147
	{
148
		$this->version = (string) $version;
149

                    
150
		return $this;
151
	}
152

                    
153
	public function getVersion()100%
154
	{
155
		return $this->version;
156
	}
157

                    
158
	public function setScoreDirectory($path)100%
159
	{
160
		$this->scoreDirectory = static::cleanDirectoryPath($path);
161

                    
162
		return $this;
163
	}
164

                    
165
	public function getScoreDirectory()100%
166
	{
167
		return $this->scoreDirectory;
168
	}
169

                    
170
	public function setErrorsDirectory($path)100%
171
	{
172
		$this->errorsDirectory = static::cleanDirectoryPath($path);
173

                    
174
		return $this;
175
	}
176

                    
177
	public function getErrorsDirectory()100%
178
	{
179
		return $this->errorsDirectory;
180
	}
181

                    
182
	public function setDestinationDirectory($path)100%
183
	{
184
		$this->destinationDirectory = static::cleanDirectoryPath($path);
185

                    
186
		return $this;
187
	}
188

                    
189
	public function getDestinationDirectory()100%
190
	{
191
		return $this->destinationDirectory;
192
	}
193

                    
194
	public function setWorkingDirectory($path)100%
195
	{
196
		$this->workingDirectory = static::cleanDirectoryPath($path);
197

                    
198
		return $this;
199
	}
200

                    
201
	public function getWorkingDirectory()100%
202
	{
203
		return $this->workingDirectory;
204
	}
205

                    
206
	public function setRevisionFile($path)100%
207
	{
208
		$this->revisionFile = (string) $path;
209

                    
210
		return $this;
211
	}
212

                    
213
	public function getRevisionFile()100%
214
	{
215
		return $this->revisionFile;
216
	}
217

                    
218
	public function setReportTitle($title)100%
219
	{
220
		$this->reportTitle = (string) $title;
221

                    
222
		return $this;
223
	}
224

                    
225
	public function getReportTitle()100%
226
	{
227
		return $this->reportTitle;
228
	}
229

                    
230
	public function setUnitTestRunnerScript($path)100%
231
	{
232
		$this->unitTestRunnerScript = (string) $path;
233

                    
234
		return $this;
235
	}
236

                    
237
	public function getUnitTestRunnerScript()
238
	{
239
		return $this->unitTestRunnerScript;
240
	}
241

                    
242
	public function setPharGeneratorScript($path)100%
243
	{
244
		$this->pharGeneratorScript = (string) $path;
245

                    
246
		return $this;
247
	}
248

                    
249
	public function getPharGeneratorScript()100%
250
	{
251
		return $this->pharGeneratorScript;
252
	}
253

                    
254
	public function setRunFile($path)100%
255
	{
256
		$this->runFile = $path;
257

                    
258
		return $this;
259
	}
260

                    
261
	public function getRunFile()100%
262
	{
263
		return $this->runFile !== null ? $this->runFile : $this->adapter->sys_get_temp_dir() . \DIRECTORY_SEPARATOR . md5(get_class($this));
264
	}
265

                    
266
	public function checkUnitTests()100%
267
	{
268
		$status = true;
269

                    
270
		if ($this->checkUnitTests === true)
271
		{
272
			if ($this->workingDirectory === null)
273
			{
274
				throw new exceptions\logic('Unable to check unit tests, working directory is undefined');
275
			}
276

                    
277
			$this->vcs
278
				->setWorkingDirectory($this->workingDirectory)
279
				->exportRepository()
280
			;
281

                    
282
			$this->php
283
				->reset()
284
				->addOption('-f', $this->workingDirectory . \DIRECTORY_SEPARATOR . $this->unitTestRunnerScript)
285
				->addArgument('-ncc')
286
				->addArgument('-d', $this->workingDirectory . \DIRECTORY_SEPARATOR . 'tests' . \DIRECTORY_SEPARATOR . 'units' . \DIRECTORY_SEPARATOR . 'classes')
287
				->addArgument('-p', $this->php->getBinaryPath())
288
			;
289

                    
290
			$scoreFile = $this->scoreDirectory === null ? $this->adapter->tempnam($this->adapter->sys_get_temp_dir(), '') : $this->scoreDirectory . DIRECTORY_SEPARATOR . $this->vcs->getRevision();
291

                    
292
			$this->php->addArgument('-sf', $scoreFile);
293

                    
294
			if ($this->reportTitle !== null)
295
			{
296
				$this->php->addArgument('-drt', sprintf($this->reportTitle, '%1$s', '%2$s', '%3$s', $this->vcs->getRevision()));
297
			}
298

                    
299
			foreach ($this->runnerConfigurationFiles as $runnerConfigurationFile)
300
			{
301
				$this->php->addArgument('-c', $runnerConfigurationFile);
302
			}
303

                    
304
			try
305
			{
306
				$exitCode = $this->php->run()->getExitCode();
307

                    
308
				if ($exitCode > 0)
309
				{
310
					switch ($exitCode)
311
					{
312
						case 126:
313
						case 127:
314
							throw new exceptions\runtime('Unable to find \'' . $this->php->getBinaryPath() . '\' or it is not executable');
315

                    
316
						default:
317
							throw new exceptions\runtime($this->php . ' failed with exit code \'' . $exitCode . '\': ' . $this->php->getStderr());
318
					}
319
				}
320

                    
321
				$stdErr = $this->php->getStdErr();
322

                    
323
				if ($stdErr != '')
324
				{
325
					throw new exceptions\runtime($stdErr);
326
				}
327

                    
328
				$score = @$this->adapter->file_get_contents($scoreFile);
329

                    
330
				if ($score === false)
331
				{
332
					throw new exceptions\runtime('Unable to read score from file \'' . $scoreFile . '\'');
333
				}
334

                    
335
				$score = $this->adapter->unserialize($score);
336

                    
337
				if ($score === false)
338
				{
339
					throw new exceptions\runtime('Unable to unserialize score from file \'' . $scoreFile . '\'');
340
				}
341

                    
342
				if ($score instanceof atoum\score === false)
343
				{
344
					throw new exceptions\runtime('Contents of file \'' . $scoreFile . '\' is not a score');
345
				}
346

                    
347
				$status = $score->getFailNumber() === 0 && $score->getExceptionNumber() === 0 && $score->getErrorNumber() === 0;
348
			}
349
			catch (\exception $exception)
350
			{
351
				$this->writeErrorInErrorsDirectory($exception->getMessage());
352

                    
353
				$status = false;
354
			}
355

                    
356
			if ($this->scoreDirectory === null)
357
			{
358
				if ($this->adapter->unlink($scoreFile) === false)
359
				{
360
					throw new exceptions\runtime('Unable to delete score file \'' . $scoreFile . '\'');
361
				}
362
			}
363
		}
364

                    
365
		return $status;
366
	}
367

                    
368
	public function createPhar($version = null)100%
369
	{
370
		$pharBuilt = true;
371

                    
372
		if ($this->pharCreationEnabled === true)
373
		{
374
			if ($this->destinationDirectory === null)
375
			{
376
				throw new exceptions\logic('Unable to create phar, destination directory is undefined');
377
			}
378

                    
379
			if ($this->workingDirectory === null)
380
			{
381
				throw new exceptions\logic('Unable to create phar, working directory is undefined');
382
			}
383

                    
384
			if ($this->revisionFile !== null)
385
			{
386
				$revision = trim(@$this->adapter->file_get_contents($this->revisionFile));
387

                    
388
				if (is_numeric($revision) === true)
389
				{
390
					$this->vcs->setRevision($revision);
391
				}
392
			}
393

                    
394
			$revisions = $this->vcs->getNextRevisions();
395

                    
396
			while (sizeof($revisions) > 0)
397
			{
398
				$revision = array_shift($revisions);
399

                    
400
				$this->vcs->setRevision($revision);
401

                    
402
				try
403
				{
404
					if ($this->checkUnitTests() === true)
405
					{
406
						if ($this->checkUnitTests === false)
407
						{
408
							$this->vcs
409
								->setWorkingDirectory($this->workingDirectory)
410
								->exportRepository()
411
							;
412
						}
413

                    
414
						if ($this->taggerEngine !== null)
415
						{
416
							$this->taggerEngine
417
								->setSrcDirectory($this->workingDirectory)
418
								->setVersion($version !== null ? $version : 'nightly-' . $revision . '-' . $this->adapter->date('YmdHi'))
419
								->tagVersion()
420
							;
421
						}
422

                    
423
						$this->php
424
							->reset()
425
							->addOption('-d', 'phar.readonly=0')
426
							->addOption('-f', $this->workingDirectory . DIRECTORY_SEPARATOR . $this->pharGeneratorScript)
427
							->addArgument('-d', $this->destinationDirectory)
428
						;
429

                    
430
						if ($this->php->run()->getExitCode() > 0)
431
						{
432
							throw new exceptions\runtime('Unable to run ' . $this->php . ': ' . $this->php->getStdErr());
433
						}
434
					}
435
				}
436
				catch (\exception $exception)
437
				{
438
					$pharBuilt = false;
439

                    
440
					$this->writeErrorInErrorsDirectory($exception->getMessage());
441
				}
442

                    
443
				if ($this->revisionFile !== null && $this->adapter->file_put_contents($this->revisionFile, $revision, \LOCK_EX) === false)
444
				{
445
					throw new exceptions\runtime('Unable to save last revision in file \'' . $this->revisionFile . '\'');
446
				}
447

                    
448
				$revisions = $this->vcs->getNextRevisions();
449
			}
450
		}
451

                    
452
		return $pharBuilt;
453
	}
454

                    
455
	public function writeErrorInErrorsDirectory($error)100%
456
	{
457
		if ($this->errorsDirectory !== null)
458
		{
459
			$revision = $this->vcs === null ? null : $this->vcs->getRevision();
460

                    
461
			if ($revision === null)
462
			{
463
				throw new exceptions\logic('Revision is undefined');
464
			}
465

                    
466
			$errorFile = $this->errorsDirectory . \DIRECTORY_SEPARATOR . $revision;
467

                    
468
			if ($this->adapter->file_put_contents($errorFile, $error, \LOCK_EX | \FILE_APPEND) === false)
469
			{
470
				throw new exceptions\runtime('Unable to save error in file \'' . $errorFile . '\'');
471
			}
472
		}
473

                    
474
		return $this;
475
	}
476

                    
477
	protected function includeConfigFile($path, \closure $callback = null)100%
478
	{
479
		if ($callback === null)
480
		{
481
			$builder = $this;
482

                    
483
			$callback = function($path) use ($builder) { include_once($path); };
484
		}
485

                    
486
		return parent::includeConfigFile($path, $callback);
487
	}
488

                    
489
	protected function setArgumentHandlers()62%
490
	{
491
		$builder = $this;
492

                    
493
		return parent::setArgumentHandlers()
494
			->addArgumentHandler(
495
				function($script, $argument, $files) use ($builder) {
496
					if (sizeof($files) <= 0)
497
					{
498
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
499
					}
500

                    
501
					foreach ($files as $file)
502
					{
503
						if (file_exists($file) === false)
504
						{
505
							throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Runner configuration file path \'%s\' is invalid'), $file));
506
						}
507

                    
508
						if (is_readable($file) === false)
509
						{
510
							throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Unable to read runner configuration file \'%s\''), $file));
511
						}
512

                    
513
						$script->addRunnerConfigurationFile($file);
514
					}
515
				},
516
				array('-rc', '--runner-configuration-files'),
517
				'<file>',
518
				 $this->locale->_('Use <file> as configuration file for runner')
519
			)
520
			->addArgumentHandler(
521
				function($script, $argument, $path) {
522
					if (sizeof($path) != 1)
523
					{
524
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
525
					}
526

                    
527
					$script->setPhpPath(current($path));
528
				},
529
				array('-p', '--php'),
530
				'<path>',
531
				$this->locale->_('Path to PHP binary')
532
			)
533
			->addArgumentHandler(
534
				function($script, $argument, $directory) {
535
					if (sizeof($directory) != 1)
536
					{
537
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
538
					}
539

                    
540
					$script->setWorkingDirectory(current($directory));
541
				},
542
				array('-w', '--working-directory'),
543
				'<directory>',
544
				$this->locale->_('Checkout file from repository in <directory>')
545
			)
546
			->addArgumentHandler(
547
				function($script, $argument, $directory) {
548
					if (sizeof($directory) != 1)
549
					{
550
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
551
					}
552

                    
553
					$script->setDestinationDirectory(current($directory));
554
				},
555
				array('-d', '--destination-directory'),
556
				'<directory>',
557
				$this->locale->_('Save phar in <directory>')
558

                    
559
			)
560
			->addArgumentHandler(
561
				function($script, $argument, $directory) {
562
					if (sizeof($directory) != 1)
563
					{
564
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
565
					}
566

                    
567
					$script->setScoreDirectory(current($directory));
568
				},
569
				array('-sd', '--score-directory'),
570
				'<directory>',
571
				$this->locale->_('Save score in <directory>')
572
			)
573
			->addArgumentHandler(
574
				function($script, $argument, $directory) {
575
					if (sizeof($directory) != 1)
576
					{
577
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
578
					}
579

                    
580
					$script->setErrorsDirectory(current($directory));
581
				},
582
				array('-ed', '--errors-directory'),
583
				'<directory>',
584
				$this->locale->_('Save errors in <directory>')
585
			)
586
			->addArgumentHandler(
587
				function($script, $argument, $url) {
588
					if (sizeof($url) != 1)
589
					{
590
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
591
					}
592

                    
593
					$script->getVcs()->setRepositoryUrl(current($url));
594
				},
595
				array('-r', '--repository-url'),
596
				'<url>',
597
				$this->locale->_('Url of repository')
598
			)
599
			->addArgumentHandler(
600
				function($script, $argument, $file) {
601
					if (sizeof($file) != 1)
602
					{
603
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
604
					}
605

                    
606
					$script->setRevisionFile(current($file));
607
				},
608
				array('-rf', '--revision-file'),
609
				'<file>',
610
				$this->locale->_('Save last revision in <file>')
611
			)
612
			->addArgumentHandler(
613
				function($script, $argument, $version) {
614
					if (sizeof($version) != 1)
615
					{
616
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
617
					}
618

                    
619
					$script->setVersion(current($version));
620
				},
621
				array('-v', '--version'),
622
				'<string>',
623
				$this->locale->_('Version <string> will be used as version name')
624
			)
625
			->addArgumentHandler(
626
				function($script, $argument, $unitTestRunnerScript) {
627
					if (sizeof($unitTestRunnerScript) != 1)
628
					{
629
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
630
					}
631

                    
632
					$script->setUnitTestRunnerScript(current($unitTestRunnerScript));
633
				},
634
				array('-utrs', '--unit-test-runner-script')
635
			)
636
			->addArgumentHandler(
637
				function($script, $argument, $pharGeneratorScript) {
638
					if (sizeof($pharGeneratorScript) != 1)
639
					{
640
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
641
					}
642

                    
643
					$script->setPharGeneratorScript(current($pharGeneratorScript));
644
				},
645
				array('-pgs', '--phar-generator-script')
646
			)
647
			->addArgumentHandler(
648
				function($script, $argument, $reportTitle) {
649
					if (sizeof($reportTitle) != 1)
650
					{
651
						throw new exceptions\logic\invalidArgument(sprintf($script->getLocale()->_('Bad usage of %s, do php %s --help for more informations'), $argument, $script->getName()));
652
					}
653

                    
654
					$script->setReportTitle(current($reportTitle));
655
				},
656
				array('-rt', '--report-title')
657
			)
658
		;
659
	}
660

                    
661
	protected function doRun()90%
662
	{
663
		$runFile = $this->getRunFile();
664

                    
665
		$pid = trim(@$this->adapter->file_get_contents($runFile));
666

                    
667
		if (is_numeric($pid) === false || $this->adapter->posix_kill($pid, 0) === false)
668
		{
669
			if ($this->pharCreationEnabled === true)
670
			{
671
				$runFileResource = @$this->adapter->fopen($runFile, 'w+');
672

                    
673
				if ($runFileResource === false)
674
				{
675
					throw new exceptions\runtime(sprintf($this->locale->_('Unable to open run file \'%s\''), $runFile));
676
				}
677

                    
678
				if ($this->adapter->flock($runFileResource, \LOCK_EX | \LOCK_NB) === false)
679
				{
680
					throw new exceptions\runtime(sprintf($this->locale->_('Unable to get exclusive lock on run file \'%s\''), $runFile));
681
				}
682

                    
683
				$this->adapter->fwrite($runFileResource, $this->adapter->getmypid());
684

                    
685
				$this->createPhar($this->version);
686

                    
687
				$this->adapter->fclose($runFileResource);
688

                    
689
				@$this->adapter->unlink($runFile);
690
			}
691
		}
692

                    
693
		return $this;
694
	}
695

                    
696
	protected function cleanDirectoryPath($path)100%
697
	{
698
		return rtrim($path, DIRECTORY_SEPARATOR);
699
	}
700
}