123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- <?php
- /**
- * Creates an upgrade file for Elgg.
- *
- * Run this from the command line:
- * php create_upgrade.php upgrade_name
- */
- error_reporting(E_ALL);
- // only allow from the command line.
- if (php_sapi_name() != 'cli') {
- die('Upgrades can only be created from the command line.');
- }
- if (count($argv) < 2) {
- elgg_create_upgrade_show_usage('No upgrade name.');
- }
- $name = $argv[1];
- if (strlen($name) > 24) {
- elgg_create_upgrade_show_usage('Upgrade names cannot be longer than 24 characters.');
- }
- require_once '../../../version.php';
- $upgrade_path = dirname(__FILE__);
- $upgrade_name = strtolower($name);
- $upgrade_name = str_replace(array(' ', '-'), '_', $upgrade_name);
- $upgrade_release = str_replace(array(' ', '-'), '_', $release);
- $time = time();
- $upgrade_rnd = substr(md5($time), 0, 16);
- $upgrade_date = date('Ymd', $time);
- // determine the inc count
- $upgrade_inc = 0;
- $files = elgg_get_file_list($upgrade_path);
- sort($files);
- foreach ($files as $filename) {
- $filename = basename($filename);
- $date = (int)substr($filename, 0, 8);
- $inc = (int)substr($filename, 8, 2);
- if ($upgrade_date == $date) {
- if ($inc >= $upgrade_inc) {
- $upgrade_inc = $inc + 1;
- }
- }
- }
- // zero-pad
- // if there are more than 10 upgrades in a day, someone needs talking to.
- if ($upgrade_inc < 10) {
- $upgrade_inc = "0$upgrade_inc";
- }
- $upgrade_version = $upgrade_date . $upgrade_inc;
- // make filename
- if (substr($release, 0, 3) == '1.7') {
- // 1.7 upgrades are YYYYMMDDXX
- $upgrade_name = $upgrade_version . '.php';
- } else {
- // 1.8+ upgrades are YYYYMMDDXX-release-friendly_name-rnd
- $upgrade_name = $upgrade_version . "-$upgrade_release-$name-$upgrade_rnd.php";
- }
- $upgrade_file = $upgrade_path . '/' . $upgrade_name;
- if (is_file($upgrade_file)) {
- elgg_create_upgrade_show_usage("Upgrade file $upgrade_file already exists. This script has failed you.");
- }
- $upgrade_code = <<<___UPGRADE
- <?php
- /**
- * Elgg $release upgrade $upgrade_version
- * $name
- *
- * Description
- */
- // upgrade code here.
- ___UPGRADE;
- $h = fopen($upgrade_file, 'wb');
- if (!$h) {
- die("Could not open file $upgrade_file");
- }
- if (!fwrite($h, $upgrade_code)) {
- die("Could not write to $upgrade_file");
- } else {
- elgg_set_version_dot_php_version($upgrade_version);
- echo <<<___MSG
- Created upgrade file and updated version.php.
- Upgrade file: $upgrade_name
- Version: $upgrade_version
- ___MSG;
- }
- fclose($h);
- /**
- * Updates the version number in elgg/version.php
- *
- * @param string $version
- * @return boolean
- */
- function elgg_set_version_dot_php_version($version) {
- $file = '../../../version.php';
- $h = fopen($file, 'r+b');
- if (!$h) {
- return false;
- }
- $out = '';
- while (($line = fgets($h)) !== false) {
- $find = "/\\\$version[ ]?=[ ]?[0-9]{10};/";
- $replace = "\$version = $version;";
- $out .= preg_replace($find, $replace, $line);
- }
- rewind($h);
- fwrite($h, $out);
- fclose($h);
- return true;
- }
- /**
- * Shows the usage for the create_upgrade script and dies().
- *
- * @param string $msg Optional message to display
- * @return void
- */
- function elgg_create_upgrade_show_usage($msg = '') {
- $text = <<<___MSG
- $msg
- Example:
- php create_upgrade.php my_upgrade
- ___MSG;
- die($text);
- }
- /**
- * C&P'd helpers from core to avoid pulling in everything.
- */
- /**
- * Returns a list of files in $directory.
- *
- * Only returns files. Does not recurse into subdirs.
- *
- * @param string $directory Directory to look in
- * @param array $exceptions Array of filenames to ignore
- * @param array $list Array of files to append to
- * @param mixed $extensions Array of extensions to allow, NULL for all. Use a dot: array('.php').
- *
- * @return array Filenames in $directory, in the form $directory/filename.
- */
- function elgg_get_file_list($directory, $exceptions = array(), $list = array(),
- $extensions = NULL) {
- $directory = sanitise_filepath($directory);
- if ($handle = opendir($directory)) {
- while (($file = readdir($handle)) !== FALSE) {
- if (!is_file($directory . $file) || in_array($file, $exceptions)) {
- continue;
- }
- if (is_array($extensions)) {
- if (in_array(strrchr($file, '.'), $extensions)) {
- $list[] = $directory . $file;
- }
- } else {
- $list[] = $directory . $file;
- }
- }
- closedir($handle);
- }
- return $list;
- }
- /**
- * Sanitise file paths ensuring that they begin and end with slashes etc.
- *
- * @param string $path The path
- * @param bool $append_slash Add tailing slash
- *
- * @return string
- */
- function sanitise_filepath($path, $append_slash = TRUE) {
- // Convert to correct UNIX paths
- $path = str_replace('\\', '/', $path);
- $path = str_replace('../', '/', $path);
- // replace // with / except when preceeded by :
- $path = preg_replace("/([^:])\/\//", "$1/", $path);
- // Sort trailing slash
- $path = trim($path);
- // rtrim defaults plus /
- $path = rtrim($path, " \n\t\0\x0B/");
- if ($append_slash) {
- $path = $path . '/';
- }
- return $path;
- }
|