1
|
|
|
#!/usr/bin/env php |
2
|
|
|
<?php |
3
|
|
|
/** |
4
|
|
|
* Creates an index.html with links to all files in a given directory structure, recursively. |
5
|
|
|
* This is useful for Amazon S3 uploads with static file hosting, since it doesn't list files by default. |
6
|
|
|
* |
7
|
|
|
* Assumes to run in a SilverStripe webroot |
8
|
|
|
*/ |
9
|
|
|
|
10
|
|
|
/** |
11
|
|
|
* Run a command |
12
|
|
|
* |
13
|
|
|
* @param string $cmd |
14
|
|
|
* @param bool $echo |
15
|
|
|
*/ |
16
|
|
|
function run($cmd, $echo = true) |
17
|
|
|
{ |
18
|
|
|
if ($echo) { |
19
|
|
|
echo "+ $cmd\n"; |
20
|
|
|
} |
21
|
|
|
passthru($cmd, $returnVar); |
22
|
|
|
if ($returnVar > 0) { |
23
|
|
|
die($returnVar); |
|
|
|
|
24
|
|
|
} |
25
|
|
|
} |
26
|
|
|
|
27
|
|
|
/** |
28
|
|
|
* Check if an env variable is set |
29
|
|
|
* |
30
|
|
|
* @param $envs |
31
|
|
|
* @return bool |
32
|
|
|
*/ |
33
|
|
|
function checkenv($envs) |
34
|
|
|
{ |
35
|
|
|
if ($envs) { |
36
|
|
|
foreach (explode(',', $envs) as $env) { |
37
|
|
|
if (!getenv($env)) { |
38
|
|
|
return false; |
39
|
|
|
} |
40
|
|
|
} |
41
|
|
|
} |
42
|
|
|
return true; |
43
|
|
|
} |
44
|
|
|
|
45
|
|
|
$opts = getopt('', [ |
46
|
|
|
'artifacts-path:', |
47
|
|
|
'target-path:', |
48
|
|
|
'if-env:', |
49
|
|
|
'artifacts-base-url:', |
50
|
|
|
]); |
51
|
|
|
|
52
|
|
|
// --if-env=BEHAT_TEST means that this script will only be executed if the given environment var is set |
53
|
|
|
if (empty($opts['if-env'])) { |
54
|
|
|
echo "--if-env option is mandatory"; |
55
|
|
|
exit(0); |
56
|
|
|
} |
57
|
|
|
if (!checkenv($opts['if-env'])) { |
58
|
|
|
echo "Apache skipped; {$opts['if-env']} wasn't set.\n"; |
59
|
|
|
exit(0); |
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
if (isset($opts['artifacts-path'])) { |
63
|
|
|
$artifactsPath = $opts['artifacts-path']; |
64
|
|
|
} elseif (is_dir(__DIR__ . '/artifacts/')) { |
65
|
|
|
$artifactsPath = __DIR__ . '/artifacts/'; |
66
|
|
|
} elseif (is_dir('~/artifacts/')) { |
67
|
|
|
$artifactsPath = '~/artifacts/'; |
68
|
|
|
} else { |
69
|
|
|
$artifactsPath = null; |
70
|
|
|
} |
71
|
|
|
|
72
|
|
|
$targetPath = $opts['target-path']; |
73
|
|
|
$baseUrl = $opts['artifacts-base-url']; |
74
|
|
|
|
75
|
|
|
if (!$artifactsPath || !is_dir($artifactsPath)) { |
76
|
|
|
echo "No artifacts found, skipped\n"; |
77
|
|
|
exit(0); |
78
|
|
|
} |
79
|
|
|
|
80
|
|
|
echo "Installing artifacts script to ~/bin/artifacts\n"; |
81
|
|
|
run("curl -sL https://raw.githubusercontent.com/travis-ci/artifacts/master/install | bash"); |
82
|
|
|
|
83
|
|
|
echo "Creating {$artifactsPath}index.html...\n"; |
84
|
|
|
|
85
|
|
|
$html = '<html><head></head><body><ul>'; |
86
|
|
|
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(realpath($artifactsPath)), RecursiveIteratorIterator::SELF_FIRST); |
87
|
|
|
foreach ($objects as $name => $object) { |
88
|
|
|
if ($object->isDir()) { |
89
|
|
|
continue; |
90
|
|
|
} |
91
|
|
|
$relativePath = trim(str_replace(realpath($artifactsPath) . '/', '', $object->getPathName()), '/'); |
92
|
|
|
$html .= sprintf('<li><a href="%s">%s</a></li>', $relativePath, $relativePath); |
93
|
|
|
} |
94
|
|
|
$html .= '</ul></body></html>'; |
95
|
|
|
|
96
|
|
|
file_put_contents("{$artifactsPath}index.html", $html); |
97
|
|
|
|
98
|
|
|
run("~/bin/artifacts upload --permissions public-read --target-paths $targetPath $artifactsPath"); |
99
|
|
|
|
100
|
|
|
$fullPath = str_replace('//', '/', "$baseUrl/$targetPath/index.html"); |
101
|
|
|
$fullPath = str_replace('https:/s3', 'https://s3', $fullPath); |
102
|
|
|
echo "Uploaded artifacts to $fullPath\n"; |
103
|
|
|
|
In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.