license.php 4.52 KB
Newer Older
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
<?php
/**
 * @author Thomas Müller
 *
 * @copyright Copyright (c) 2015, ownCloud, Inc.
 * @license AGPL-3.0
 *
 * This code is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License, version 3,
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 *
 */
class Licenses
{
	protected $paths = array();

	public function __construct() {
		$this->licenseText = <<<EOD
/**
@AUTHORS@
 *
 * @copyright Copyright (c) @YEAR@, ownCloud, Inc.
 * @license AGPL-3.0
 *
 * This code is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License, version 3,
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 *
 */
EOD;
		$this->licenseText = str_replace('@YEAR@', date("Y"), $this->licenseText);
	}

	function exec($folder) {

		if (is_array($folder)) {
			foreach($folder as $f) {
				$this->exec($f);
			}
			return;
		}

		if (is_file($folder)) {
			$this->handleFile($folder);
			return;
		}

		$excludes = array_map(function($item) use ($folder) {
			return $folder . '/' . $item;
		}, ['vendor', '3rdparty', '.git', 'l10n', 'templates']);

		$iterator = new RecursiveDirectoryIterator($folder, RecursiveDirectoryIterator::SKIP_DOTS);
		$iterator = new RecursiveCallbackFilterIterator($iterator, function($item) use ($folder, $excludes){
			/** @var SplFileInfo $item */
			foreach($excludes as $exclude) {
				if (substr($item->getPath(), 0, strlen($exclude)) === $exclude) {
					return false;
				}
			}
			return true;
		});
		$iterator = new RecursiveIteratorIterator($iterator);
		$iterator = new RegexIterator($iterator, '/^.+\.php$/i');

		foreach ($iterator as $file) {
			/** @var SplFileInfo $file */
			$this->handleFile($file);
		}

	}

	function handleFile($path) {
		$source = file_get_contents($path);
		$source = $this->eatOldLicense($source);
		$authors = $this->getAuthors($path);
		$license = str_replace('@AUTHORS@', $authors, $this->licenseText);

		$source = "<?php" . PHP_EOL . $license . PHP_EOL . $source;
		file_put_contents($path,$source);
		echo "License updated: $path\n";
	}

	private function eatOldLicense($source) {
		$lines = explode(PHP_EOL, $source);
		while(!empty($lines)) {
			$line = $lines[0];
			if (strpos($line, '<?php') !== false) {
				array_shift($lines);
				continue;
			}
			if (strpos($line, '/**') !== false) {
				array_shift($lines);
				continue;
			}
111
			if (strpos($line, '*/') !== false ) {
112
				array_shift($lines);
113
				break;
114
			}
115
			if (strpos($line, '*') !== false) {
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
				array_shift($lines);
				continue;
			}
			if (trim($line) === '') {
				array_shift($lines);
				continue;
			}
			break;
		}

		return implode(PHP_EOL, $lines);
	}

	private function getAuthors($file) {
		$out = shell_exec("git blame --line-porcelain $file | sed -n 's/^author //p;s/^author-mail //p' | sed 'N;s/\\n/ /' | sort | uniq");
		$authors = explode(PHP_EOL, $out);

		$authors = array_filter($authors, function($author) {
134
135
136
137
			return !in_array($author, [
				'',
				'Not Committed Yet <not.committed.yet>',
				'Jenkins for ownCloud <owncloud-bot@tmit.eu>']);
138
139
140
141
142
143
144
145
146
		});
		$authors = array_map(function($author){
			return " * @author $author";
		}, $authors);
		return implode(PHP_EOL, $authors);
	}
}

$licenses = new Licenses;
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
if (isset($argv[1])) {
	$licenses->exec($argv[1]);
} else {
	$licenses->exec([
		'../apps/files',
		'../apps/files_encryption',
		'../apps/files_external',
		'../apps/files_sharing',
		'../apps/files_trashbin',
		'../apps/files_versions',
		'../apps/provisioning_api',
		'../apps/user_ldap',
		'../apps/user_webdavauth',
		'../core',
		'../lib',
		'../ocs',
		'../settings',
		'../console.php',
		'../cron.php',
		'../index.php',
		'../public.php',
		'../remote.php',
		'../status.php',
		'../version.php',
	]);
}
173