-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathIncludeResourceTask.php
125 lines (100 loc) · 2.71 KB
/
IncludeResourceTask.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
/**
* @file IncludeResourceTask.php
*
* @copyright 2016 Palantir.net, Inc.
*/
namespace TheBuild;
use PhingFile;
use BuildException;
use FileSystem;
class IncludeResourceTask extends \Task {
/**
* @var string
* Either 'symlink' or 'copy'.
*/
protected $mode = 'symlink';
/**
* @var PhingFile
* The source file or directory to include.
*/
protected $source;
/**
* @var PhingFile
* The location to link the file to.
*/
protected $dest = NULL;
/**
* Init tasks.
*
* Inherits the mode from the project's includeresource.mode property. This
* can be overridden by setting the "mode" attribute.
*/
public function init() {
$mode = $this->getProject()->getProperty('includeresource.mode');
if (!is_null($mode)) {
$this->setMode($mode);
}
}
/**
* Copy or link the resource.
*/
public function main() {
$this->validate();
// Remove existing destination first.
if ($this->dest->exists()) {
$this->log("Replacing existing resource '" . $this->dest->getPath() . "'");
if ($this->dest->delete(TRUE) === FALSE) {
throw new BuildException("Failed to delete existing destination '$this->dest'");
}
}
// Link or copy the source artifact.
$this->dest->getParentFile()->mkdirs();
if ($this->mode == 'copy') {
$this->log(sprintf("Copying '%s' to '%s'", $this->source->getPath(), $this->dest->getPath()));
$this->source->copyTo($this->dest);
}
else {
$this->log(sprintf("Linking '%s' to '%s'", $this->source->getPath(), $this->dest->getPath()));
FileSystem::getFileSystem()->symlink($this->source->getPath(), $this->dest->getPath());
}
}
/**
* Verify that the required attributes are set.
*/
public function validate() {
if (!in_array($this->mode, ['symlink', 'copy'])) {
throw new BuildException("mode attribute must be either 'symlink' or 'copy'", $this->location);
}
if (empty($this->source) || empty($this->dest)) {
throw new BuildException("Both the 'source' and 'dest' attributes are required.");
}
}
/**
* Set the artifact mode.
*
* @param $mode
* Use 'symlink' to link resources, and 'copy' to copy them.
*/
public function setMode($mode) {
$this->mode = $mode;
}
/**
* Set the source of the resource to include.
*
* @param \PhingFile $source
*/
public function setSource(PhingFile $source) {
if (!$source->exists()) {
throw new BuildException("resource '$source' is not available'");
}
$this->source = $source;
}
/**
* Set the destination for the resource.
* @param PhingFile $dest
*/
public function setDest(PhingFile $dest) {
$this->dest = $dest;
}
}