-
Notifications
You must be signed in to change notification settings - Fork 0
/
CreateSymlinks.php
94 lines (78 loc) · 2.23 KB
/
CreateSymlinks.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?php
namespace Epilgrim\PhpHooks;
use Composer\Script\Event;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Process\Process;
class CreateSymlinks
{
private $event;
public static function create(Event $event)
{
$creator = new self($event);
return $creator->run();
}
private function __construct(Event $event)
{
$this->event = $event;
}
public function run()
{
if (!$this->event->isDevMode()) {
return true;
}
$extras = $this->event->getComposer()->getPackage()->getExtra();
if (!isset($extras['epilgrim-php-hooks'])) {
throw new \InvalidArgumentException('There is no configuration for the hooks.');
}
$searchAt = $extras['epilgrim-php-hooks'];
$gitDirectories = $this->getHookDestinations($searchAt);
foreach ($gitDirectories as $directory) {
$fullPath = $directory->getRealPath();
if ($this->hasHook($fullPath)) {
continue;
}
$this->linkHook($fullPath);
}
return true;
}
private function getHookDestinations($searchAt)
{
$finder = new Finder();
foreach ($searchAt as $location) {
$finder->in(__DIR__.'/../../..'.$location);
}
return $finder
->ignoreVCS(false)
->ignoreDotFiles(false)
->exclude('vendor')
->path('/\.git\/hooks$/')
;
}
private function hasHook($directory)
{
$finder = new Finder();
$finder
->in($directory)
->depth('== 0')
->files()
->name('pre-commit')
;
return count($finder) !== 0;
}
private function linkHook($directory)
{
$hook = realpath(__DIR__.'/../../../vendor/epilgrim/php-hooks/PreCommit.php');
$link = sprintf('%s/%s', $directory, 'pre-commit');
$this->event->getIO()
->write(sprintf(
'<info>Creating Symlink from %s to %s</info>',
$link,
$hook
)
);
$process = new Process(
sprintf("ln -s %s %s", $hook, $link)
);
$process->run();
}
}