aboutsummaryrefslogtreecommitdiffstats
path: root/build/build_helper.php
diff options
context:
space:
mode:
Diffstat (limited to 'build/build_helper.php')
-rw-r--r--build/build_helper.php485
1 files changed, 485 insertions, 0 deletions
diff --git a/build/build_helper.php b/build/build_helper.php
new file mode 100644
index 0000000000..2bae32218b
--- /dev/null
+++ b/build/build_helper.php
@@ -0,0 +1,485 @@
+<?php
+/**
+*
+* @package build
+* @version $Id$
+* @copyright (c) 2010 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+*/
+
+class build_package
+{
+ var $package_infos;
+ var $old_packages;
+ var $versions;
+ var $locations;
+ var $clean_directory_structure;
+ var $files_to_copy;
+ var $files_to_remove;
+ var $remove_from_diff_structure;
+
+ // -c - context diff
+ // -r - compare recursive
+ // -N - Treat missing files as empty
+ // -E - Ignore tab expansions
+ // not used: -b - Ignore space changes.
+ // -w - Ignore all whitespace
+ // -B - Ignore blank lines
+ // -d - Try to find smaller set of changes
+ var $diff_options = '-crNEBwd';
+ var $diff_options_long = '-x images -crNEB'; // -x fonts -x imageset //imageset not used here, because it includes the imageset.cfg file. ;)
+
+ var $verbose = false;
+ var $status_begun = false;
+ var $num_dots = 0;
+
+ function build_package($versions, $verbose = false)
+ {
+ $this->versions = $versions;
+ $this->verbose = $verbose;
+
+ // Get last two entries
+ $_latest = $this->versions[sizeof($this->versions) - 1];
+ $_before = $this->versions[sizeof($this->versions) - 2];
+
+ $this->locations = array(
+ 'new_version' => dirname(dirname(__FILE__)) . '/phpBB/',
+ 'old_versions' => dirname(__FILE__) . '/old_versions/',
+ 'root' => dirname(__FILE__) . '/',
+ 'package_dir' => dirname(__FILE__) . '/new_version/'
+ );
+
+ $this->package_infos = array(
+ 'package_name' => 'phpBB3',
+ 'name_prefix' => 'phpbb',
+ 'simple_name' => 'phpbb' . str_replace('.', '', $_latest),
+ 'new_version_number' => $_latest,
+ 'short_version_number' => str_replace('.', '', $_latest),
+ 'release_filename' => 'phpBB-' . $_latest,
+ 'last_version' => 'phpbb' . str_replace('.', '', $_before),
+ 'last_version_number' => $_before,
+ );
+
+ $this->package_infos['dest_dir'] = $this->locations['package_dir'] . $this->package_infos['package_name'];
+ $this->package_infos['diff_dir'] = $this->locations['old_versions'] . $this->package_infos['simple_name'];
+ $this->package_infos['patch_directory'] = $this->locations['package_dir'] . 'patches';
+ $this->package_infos['files_directory'] = $this->locations['package_dir'] . 'files';
+ $this->package_infos['update_directory'] = $this->locations['package_dir'] . 'update';
+ $this->package_infos['release_directory'] = $this->locations['package_dir'] . 'release_files';
+
+ // Old packages always exclude the latest version. ;)
+ $this->old_packages = array();
+
+ foreach ($this->versions as $package_version)
+ {
+ if ($package_version == $_latest)
+ {
+ continue;
+ }
+
+ $this->old_packages['phpbb' . str_replace('.', '', $package_version)] = $package_version . '_to_';
+ }
+
+ // We need to make sure this is up to date with the latest version
+ $this->clean_directory_structure = array(
+ 'adm' => array(
+ 'images' => '',
+ 'style' => '',
+ ),
+ 'cache' => '',
+ 'docs' => '',
+ 'download' => '',
+ 'files' => '',
+ 'images' => array(
+ 'avatars' => array(
+ 'gallery' => '',
+ 'upload' => '',
+ ),
+ 'icons' => array(
+ 'misc' => '',
+ 'smile' => '',
+ ),
+ 'ranks' => '',
+ 'smilies' => '',
+ 'upload_icons' => '',
+ ),
+ 'includes' => array(
+ 'acm' => '',
+ 'acp' => array(
+ 'info' => '',
+ ),
+ 'auth' => '',
+ 'captcha' => array(
+ 'plugins' => '',
+ ),
+ 'diff' => '',
+ 'db' => '',
+ 'hooks' => '',
+ 'mcp' => array(
+ 'info' => '',
+ ),
+ 'questionnaire' => '',
+ 'search' => '',
+ 'ucp' => array(
+ 'info' => '',
+ ),
+ 'utf' => array(
+ 'data' => '',
+ ),
+ ),
+ 'install' => array(
+ 'convertors'=> '',
+ 'schemas' => '',
+// 'data' => '',
+ ),
+ 'language' => array(
+ 'en' => array(
+ 'acp' => '',
+ 'email' => '',
+ 'mods' => '',
+ ),
+ ),
+ 'store' => '',
+ 'styles' => array(
+ 'subsilver2' => array(
+ 'imageset' => array(
+ 'en' => '',
+ ),
+ 'template' => '',
+ 'theme' => array(
+ 'images' => '',
+ ),
+ ),
+ 'prosilver' => array(
+ 'imageset' => array(
+ 'en' => '',
+ ),
+ 'template' => '',
+ 'theme' => array(
+ 'images' => '',
+ ),
+ ),
+ ),
+ );
+
+ // Files to remove (not include within package)
+ $this->files_to_remove = array(); //array('includes/utf/data/recode_cjk.php');
+
+ // Files within the main directory to copy - do not include config.php
+ $this->files_to_copy = array(
+ '.htaccess', 'common.php', 'cron.php', 'faq.php', 'feed.php', 'index.php', 'mcp.php', 'memberlist.php', 'posting.php', 'report.php',
+ 'search.php', 'style.php', 'ucp.php', 'viewforum.php', 'viewonline.php', 'viewtopic.php'
+ );
+
+ // These files/directories will be removed and not used for creating the patch files
+ $this->remove_from_diff_structure = array(
+ 'config.php', 'cache', 'docs', 'files', 'install', 'store', 'develop'
+ );
+
+ // Writeable directories
+ $this->writeable = array('cache', 'store', 'images/avatars/upload', 'files');
+
+ // Fill the rest of the files_to_copy array
+ foreach ($this->clean_directory_structure as $cur_dir => $dir_struct)
+ {
+ $this->_fill_files_to_copy($this->locations['new_version'] . $cur_dir, $cur_dir, $dir_struct);
+ }
+ }
+
+ function get($var)
+ {
+ return $this->package_infos[$var];
+ }
+
+ function _fill_files_to_copy($directory, $cur_dir, $dir_struct)
+ {
+ $dh = opendir($directory);
+
+ while ($file = readdir($dh))
+ {
+ if (is_file($directory . '/' . $file) && $file != '.' && $file != '..')
+ {
+ $_loc = str_replace($this->locations['new_version'], '', $directory . '/' . $file);
+
+ if (in_array($_loc, $this->files_to_remove))
+ {
+ continue;
+ }
+
+ $this->files_to_copy[] = $cur_dir . '/' . $file;
+ }
+ }
+ closedir($dh);
+
+ if (is_array($dir_struct))
+ {
+ foreach ($dir_struct as $_cur_dir => $_dir_struct)
+ {
+ $this->_fill_files_to_copy($directory . '/' . $_cur_dir, $cur_dir . '/' . $_cur_dir, $_dir_struct);
+ }
+ }
+ }
+
+ function adjust_permissions($directory)
+ {
+ $dh = opendir($directory);
+
+ while ($file = readdir($dh))
+ {
+ if ($file == '.' || $file == '..' || $file == '.svn')
+ {
+ continue;
+ }
+
+ // If file, then 644
+ if (is_file($directory . '/' . $file))
+ {
+ chmod($directory . '/' . $file, 0644);
+ }
+ else if (is_dir($directory . '/' . $file))
+ {
+ $_loc = str_replace($this->package_infos['dest_dir'] . '/', '', $directory . '/' . $file);
+
+ // If directory is within the writeable chmod to 777, else 755
+ $mode = (in_array($_loc, $this->writeable)) ? 0777 : 0755;
+ chmod($directory . '/' . $file, $mode);
+
+ // Now traverse to the directory
+ $this->adjust_permissions($directory . '/' . $file);
+ }
+ }
+ closedir($dh);
+ }
+
+ function begin_status($headline)
+ {
+ if ($this->status_begun)
+ {
+ echo "\nDone.\n\n";
+ }
+
+ $this->num_dots = 0;
+
+ echo $headline . "\n ";
+
+ $this->status_begun = true;
+ }
+
+ function run_command($command)
+ {
+ $result = trim(`$command`);
+
+ if ($this->verbose)
+ {
+ echo " command : " . getcwd() . '$ ' . $command . "\n";
+ echo " result : " . $result . "\n";
+ }
+ else
+ {
+ if ($this->num_dots > 70)
+ {
+ echo "\n";
+ $this->num_dots = 0;
+ }
+ echo '.';
+ $this->num_dots++;
+ }
+
+ flush();
+ }
+
+ function create_directory($directory, $dir_struct)
+ {
+ if (!file_exists($directory))
+ {
+ $this->run_command("mkdir $directory");
+ }
+
+ if (is_array($dir_struct))
+ {
+ foreach ($dir_struct as $_dir => $_dir_struct)
+ {
+ $this->create_directory($directory . '/' . $_dir, $_dir_struct);
+ }
+ }
+ }
+
+ function collect_diff_files($diff_filename, $package_name)
+ {
+ $diff_result = $binary = array();
+ $diff_contents = file($diff_filename);
+
+ $special_diff_contents = array();
+
+ foreach ($diff_contents as $num => $line)
+ {
+ $line = trim($line);
+
+ if (!$line)
+ {
+ continue;
+ }
+
+ // Special diff content?
+ if (strpos($line, 'diff ' . $this->diff_options . ' ') === 0 || strpos($line, '*** ') === 0 || strpos($line, '--- ') === 0 || (strpos($line, ' Exp $') !== false && strpos($line, '$Id:') !== false))
+ {
+ $special_diff_contents[] = $line;
+ }
+ else if (strpos($line, 'diff ' . $this->diff_options . ' ') === 0 || strpos($line, '*** ') === 0 || strpos($line, '--- ') === 0 || (strpos($line, ' Exp $') !== false && strpos($line, '$Id:') !== false) || (strpos($line, ' $') !== false && strpos($line, '$Id:') !== false))
+ {
+ $special_diff_contents[] = $line;
+ }
+
+ // Is diffing line?
+ if (strstr($line, 'diff ' . $this->diff_options . ' '))
+ {
+ $next_line = $diff_contents[$num+1];
+ if (strpos($next_line, '***') === 0)
+ {
+ // *** phpbb208/admin/admin_board.php Sat Jul 10 20:16:26 2004
+ $next_line = explode("\t", $next_line);
+ $next_line = trim($next_line[0]);
+ $next_line = str_replace('*** ' . $package_name . '/', '', $next_line);
+ $diff_result[] = $next_line;
+ }
+ }
+
+ // Is binary?
+ if (preg_match('/^Binary files ' . $package_name . '\/(.*) and [a-z0-9_-]+\/\1 differ/i', $line, $match))
+ {
+ $binary[] = trim($match[1]);
+ }
+ }
+
+ // Now go through the list again and find out which files have how many changes...
+ $num_changes = array();
+
+ /* [1070] => diff -crN phpbb200/includes/usercp_avatar.php phpbb2023/includes/usercp_avatar.php
+ [1071] => *** phpbb200/includes/usercp_avatar.php Sat Jul 10 20:16:13 2004
+ [1072] => --- phpbb2023/includes/usercp_avatar.php Wed Feb 6 22:28:04 2008
+ [1073] => *** 6,12 ****
+ [1074] => ! * $Id$
+ [1075] => --- 6,12 ----
+ [1076] => *** 51,59 ****
+ [1077] => --- 51,60 ----
+ [1078] => *** 62,80 ****
+ [1079] => --- 63,108 ----
+ [1080] => *** 87,97 ****
+ */
+ while (($line = array_shift($special_diff_contents)) !== NULL)
+ {
+ $line = trim($line);
+
+ if (!$line)
+ {
+ continue;
+ }
+
+ // Is diffing line?
+ if (strstr($line, 'diff ' . $this->diff_options . ' '))
+ {
+ $next_line = array_shift($special_diff_contents);
+ if (strpos($next_line, '*** ') === 0)
+ {
+ // *** phpbb208/admin/admin_board.php Sat Jul 10 20:16:26 2004
+ $next_line = explode("\t", $next_line);
+ $next_line = trim($next_line[0]);
+ $next_line = str_replace('*** ' . $package_name . '/', '', $next_line);
+
+ $is_reached = false;
+ $prev_line = '';
+
+ while (!$is_reached)
+ {
+ $line = array_shift($special_diff_contents);
+
+ if (strpos($line, 'diff ' . $this->diff_options) === 0 || empty($special_diff_contents))
+ {
+ $is_reached = true;
+ array_unshift($special_diff_contents, $line);
+ continue;
+ }
+
+ if (strpos($line, '*** ') === 0 && strpos($line, ' ****') !== false)
+ {
+ $is_comment = false;
+ while (!(strpos($line, '--- ') === 0 && strpos($line, ' ----') !== false))
+ {
+ $line = array_shift($special_diff_contents);
+ if (strpos($line, ' Exp $') !== false || strpos($line, '$Id:') !== false)
+ {
+ $is_comment = true;
+ }
+ }
+
+ if (!$is_comment)
+ {
+ if (!isset($num_changes[$next_line]))
+ {
+ $num_changes[$next_line] = 1;
+ }
+ else
+ {
+ $num_changes[$next_line]++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Now remove those results not having changes
+ $return = array();
+
+ foreach ($diff_result as $key => $value)
+ {
+ if (isset($num_changes[$value]))
+ {
+ $return[] = $value;
+ }
+ }
+
+ foreach ($binary as $value)
+ {
+ $return[] = $value;
+ }
+
+ $diff_result = $return;
+ unset($return);
+ unset($special_diff_contents);
+
+ $result = array(
+ 'files' => array(),
+ 'binary' => array(),
+ 'all' => $diff_result,
+ );
+
+ $binary_extensions = array('gif', 'jpg', 'jpeg', 'png', 'ttf');
+
+ // Split into file and binary
+ foreach ($diff_result as $filename)
+ {
+ if (strpos($filename, '.') === false)
+ {
+ $result['files'][] = $filename;
+ continue;
+ }
+
+ $extension = explode('.', $filename);
+ $extension = array_pop($extension);
+
+ if (in_array($extension, $binary_extensions))
+ {
+ $result['binary'][] = $filename;
+ }
+ else
+ {
+ $result['files'][] = $filename;
+ }
+ }
+
+ return $result;
+ }
+}