User:VasilievVV/mw-nightly.php

From Meta, a Wikimedia project coordination wiki
<?php
# This code is distributed under GNU GPL 2

$nightlyDir = "/var/www/mw-nightly";
$nightlyUrl = "http://download.wikimedia.org/mw-nightly";
$poolDir = $nightlyDir . "/pool";
$poolUrl = $nightlyUrl . "/pool";

$svnDir = "/home/wikipedia/mediawiki/trunk";
$phase3Dir = $svnDir . "/phase3";
$extensionsDir = $svnDir . "/extensions";

$svnRevPrefix = "http://svn.wikimedia.org/viewvc/mediawiki/?view=rev&revision=";
$svnPathPrefix = "http://svn.wikimedia.org/viewvc/mediawiki";

function getExtensionsList() {
	global $extensionsDir;
	$files = scandir( $extensionsDir );
	if( !$files ) return array();
	$list = array();
	foreach( $files as $file ) {
		$path = $extensionsDir . '/' . $file;
		$blacklist = array( '.', '..', '.svn' );
		if( is_dir( $path ) && !in_array( $file, $blacklist ) )
			$list[$file] = $path;
	}
	return $list;
}

function getSvnRev( $dir ) {
	if( !is_file( $dir . '/.svn/entries' ) ) return 0;
	$entries = file_get_contents( $dir . '/.svn/entries' );
	$lines = split( "\n", $entries );
	return intval( $lines[3] );
}

function dumpDir( $dir, $targetdir, $targettag ) {
	global $rev;
	$base = dirname( $dir );
	$name = basename( $dir );
	chdir( $base );
	$dumppathShell = escapeshellarg( $targetdir . '/' . $targettag . '-nightly-r' . $rev . '.tar' );
	shell_exec( 'tar -c --exclude .svn --exclude testsuite --exclude mediawiki-large.xcf --exclude mediawiki-largesquare.xcf -f ' . $dumppathShell . ' ' . $name );
	shell_exec( 'gzip -f9 ' . $dumppathShell );
}

function outln($s) {
	echo $s . "\n";
}

function out($s) {
	echo $s;
}

function formatSize( $size ) {
	if( $size < 2048 ) {
		return "{$size} bytes";
	} elseif( $size >= 2048 && $size < 1048576 ) {	// < 1 Mb
		return round( $size / 1024, 1 ) . " Kb";
	} else {
		return round( $size / 1048576, 2 ) . " Mb";
	}
}

function outputModuleRow( $title, $dumpmodule, $svnpath ) {
	global $poolUrl, $poolDir, $rev, $svnPathPrefix;
	$fpath = $poolDir . "/{$dumpmodule}-nightly-r{$rev}.tar.gz";
	echo "<tr>";
	echo "<td><a href=\"{$poolUrl}/{$dumpmodule}-nightly-r{$rev}.tar.gz\" title=\"{$dumpmodule}\">{$title}</a></td>";
	echo "<td>" . formatSize( filesize( $fpath ) ) . "</td>";
	echo "<td>";
		echo "<p>SHA1: " . sha1_file( $fpath ) . "</p>";
		echo "<p>MD5: "  . md5_file( $fpath ) . "</p>";
	echo "</td>";
	echo "<td><a href=\"{$svnPathPrefix}{$svnpath}\">{$svnpath}</a></td>";
	echo "</tr>";
}

$extensions = getExtensionsList();
$extensionList = array_keys( $extensions );

outln( "MediaWiki nightly build started: " . date( 'Y-m-d G:i:s (e)' ) );

out( "Deleting old files... " );
shell_exec( 'rm -rf ' . $poolDir . "/*.gz" );
shell_exec( 'rm -rf ' . $poolDir . "/*.tar" );
outln( "Deleted" );

out( "Updating local copies... " );
svn_update( $phase3Dir );
svn_update( $extensionsDir );
$rev = getSvnRev( $extensionsDir );
outln( "Upadated at revision " . $rev );

out( "Dumping phase3... " );
dumpDir( $phase3Dir, $poolDir, 'phase3' );
outln( "Dupmed" );

out( "Dumping all extensions... " );
dumpDir( $extensionsDir, $poolDir, 'extensions' );
out( "Dumped\nNow dumping extensions in seperate tarballs... " );
foreach( $extensions as $ext => $extpath ) {
	dumpDir( $extpath, $poolDir, 'ext-' . $ext );
}
outln( "Dumping finished" );

out( "Copying release notes... " );
copy( $phase3Dir . "/RELEASE-NOTES", $nightlyDir . "/RELEASE-NOTES" );
outln( "Copied" );


# HTML page
out( "Generating HTML page... " );
ob_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<link rel="shortcut icon" href="http://mediawiki.org/favicon.ico" />
		<link rel="apple-touch-icon" href="http://mediawiki.wikipedia.org/apple-touch-icon.png" />
		<link rel="copyright" href="http://www.gnu.org/copyleft/fdl.html" />
		<title>MediaWiki nightly dumps</title>
		<style type="text/css" media="screen, projection">/*<![CDATA[*/
			@import "http://mediawiki.org/skins-1.5/common/shared.css?125";
			@import "http://mediawiki.org/skins-1.5/monobook/main.css?125";
		/*]]>*/</style>
		<link rel="stylesheet" type="text/css" media="print" href="http://mediawiki.org/skins-1.5/common/commonPrint.css?125" />
		<!--[if lt IE 5.5000]><style type="text/css">@import "http://mediawiki.org/skins-1.5/monobook/IE50Fixes.css?125";</style><![endif]-->
		<!--[if IE 5.5000]><style type="text/css">@import "http://mediawiki.org/skins-1.5/monobook/IE55Fixes.css?125";</style><![endif]-->
		<!--[if IE 6]><style type="text/css">@import "http://mediawiki.org/skins-1.5/monobook/IE60Fixes.css?125";</style><![endif]-->
		<!--[if IE 7]><style type="text/css">@import "http://mediawiki.org/skins-1.5/monobook/IE70Fixes.css?125";</style><![endif]-->
		<!--[if lt IE 7]><script type="text/javascript" src="http://mediawiki.org/skins-1.5/common/IEFixes.js?125"></script>
		<meta http-equiv="imagetoolbar" content="no" /><![endif]-->
		<style type="text/css">/*<![CDATA[*/
@import "http://mediawiki.org/w/index.php?title=MediaWiki:Common.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=2678400";
@import "http://mediawiki.org/w/index.php?title=MediaWiki:Monobook.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=2678400";
@import "http://mediawiki.org/w/index.php?title=-&action=raw&gen=css&maxage=2678400";

.wikitable th, td{
	text-align: center;
}
/*]]>*/</style>
	</head>
<body class="mediawiki ltr">
	<div id="globalWrapper">
		<div id="column-content">
	<div id="content">
		<a name="top" id="top"></a>
		<h1 class="firstHeading">MediaWiki nightly dumps</h1>
		<div id="bodyContent">
<p>Here you can find latest MediaWiki dump and all extensions that are in Wikimedia subversion</p>
<p>Dumped on: <?=date( 'G:i, d F Y' )?></p>
<p><a href="http://en.wikipedia.org/wiki/Subverson" title="Subversion">Subversion</a> revision:
<a href="<?=htmlspecialchars("{$svnRevPrefix}{$rev}")?>"> r<?=$rev?> </a></p>
<table class="wikitable" style="width: 100%">
<tr><th>File</th><th>Size</th><th>Hashes</th><th>Subversion path</th></tr>
<?php

outputModuleRow( "MediaWiki 1.13alpha", "phase3", "/trunk/phase3" );
outputModuleRow( "All MediaWiki extensions", "extensions", "/trunk/extensions" );

foreach( $extensionList as $ext ) {
	outputModuleRow( "{$ext} extension", "ext-{$ext}", "/trunk/extensions/{$ext}" );
}

?>
</table>
<div class="visualClear"></div>
		</div>
		</div>
	</div>
		<div id="column-one">
	<div class="portlet" id="p-logo">
		<a style="background-image: url(http://upload.wikimedia.org/wikipedia/mediawiki/b/bc/Wiki.png);" href="http://mediawiki.org//wiki/MediaWiki" title="Visit the Main Page [z]" accesskey="z"></a>
	</div>
	<script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
		<div class='generated-sidebar portlet' id='p-site'>
		<div class='pBody'>
			<ul>
				<li><a href="<?=$nightlyUrl?>">Dumps</a></li>
				<li><a href="<?=$nightlyUrl?>/RELEASE-NOTES">Release notes</a></li>
				<li><a href="http://mediawiki.org/">MediaWiki site</a></li>
			</ul>
		</div>
	</div>
		</div><!-- end of the left (by default at least) column -->
			<div class="visualClear"></div>
		<div id="footer">
				<div id="f-poweredbyico"><a href="http://tools.wikimedia.de/"><img src="http://tools.wikimedia.de/images/wikimedia-toolserver-button.png" alt="Toolserver project" /></a></div>
				<div id="f-copyrightico"><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Strict" height="31" width="88" /></a></div>
			<ul id="f-list">
				<li id="lastmod"> This page was automatically generated at <?=date( 'G:i, d F Y' )?>.</li>
				<li id="copyright">MediaWiki is available under the <a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License</a>. <br /></li>
				<li id="privacy"><a href="http://wikimediafoundation.org/wiki/Privacy_policy" title="wikimedia:Privacy policy">Privacy policy</a></li>
				<li id="about"><a href="http://mediawiki.org" title="About this site">MediaWiki site</a></li>
				<li id="disclaimer"><a href="http://mediawiki.org/wiki/Project:General_disclaimer" title="Project:General disclaimer">Disclaimers</a></li>
			</ul>
		</div>
</div>
</body></html>
<?php
$html = ob_get_contents(); ob_end_clean();
file_put_contents( $nightlyDir . "/index.html", $html );
outln( "Done" );

outln( "Finished at: " . date( 'Y-m-d G:i:s (e)' ) );