Modified: web/php-rmtools/trunk/include/Base.php =================================================================== --- web/php-rmtools/trunk/include/Base.php 2010-01-11 00:41:54 UTC (rev 293368) +++ web/php-rmtools/trunk/include/Base.php 2010-01-11 00:53:52 UTC (rev 293369) @@ -24,7 +24,15 @@ } function createStorage() { - if (!sqlite_query($this->db, 'CREATE TABLE release (name VARCHAR(32), release_branch VARCHAR(32), dev_branch VARCHAR(32), status INTEGER, first_revision INTEGER, last_revision INTEGER)')) { + if (!sqlite_query($this->db, 'CREATE TABLE release ( + name VARCHAR(32), + release_branch VARCHAR(32), + dev_branch VARCHAR(32), + status INTEGER, + first_revision INTEGER, + last_revision INTEGER, + last_snap_revision INTEGER, + last_update VARCHAR(32))')) { throw new \Exception('Cannot initialize TABLE release'); } @@ -53,7 +61,7 @@ $rm = sqlite_escape_string($rm); $res = sqlite_query($this->db, "SELECT name FROM rm WHERE name='$rm' AND release_name='$release'"); if (sqlite_num_rows($res) > 0) { - Throw new \Exception($release . 'already exists'); + Throw new \Exception($release . ' cannot be found'); } $res = sqlite_query($this->db, "INSERT INTO rm (name, release_name) VALUES('$rm','$release')"); @@ -61,10 +69,19 @@ Throw new \Exception('Cannot create release'); } } + + function setLatestRevisionForRelease($release, $revision) { + $release = sqlite_escape_string($release); + $revision = (int)$revision; + $res = sqlite_query($this->db, "UPDATE release SET last_revision=$revision WHERE name='$release'"); + if (sqlite_changes($this->db) < 1) { + Throw new \Exception('Release not found ' . $release); + } + } function getRelease($release) { $release = sqlite_escape_string($release); - $sql = "SELECT name, release_branch, dev_branch, status, first_revision, last_revision FROM release WHERE name='" . $release . "'"; + $sql = "SELECT name, release_branch, dev_branch, status, first_revision, last_revision, last_update, last_snap_revision FROM release WHERE name='" . $release . "'"; $res = sqlite_query($this->db, $sql, SQLITE_ASSOC); if (!$res) { Throw new \Exception('Query failed for ' . $release); @@ -75,7 +92,6 @@ } return sqlite_fetch_array($res); } - function getReleaseForRM($rm) { $sql = "SELECT release_name FROM rm WHERE name='" . sqlite_escape_string($rm) . "'"; Modified: web/php-rmtools/trunk/include/Storage.php =================================================================== --- web/php-rmtools/trunk/include/Storage.php 2010-01-11 00:41:54 UTC (rev 293368) +++ web/php-rmtools/trunk/include/Storage.php 2010-01-11 00:53:52 UTC (rev 293369) @@ -4,6 +4,7 @@ class Storage { protected $db = NULL; + protected $release = NULL; protected $dev_branch = NULL; protected $release_branch = NULL; protected $first_revision = NULL; @@ -11,12 +12,14 @@ function __construct($release) { $svn = new Base; - $release = $svn->getRelease($release); + $this->base = $svn; + $release = $this->release = $svn->getRelease($release); $this->dev_branch = $release['dev_branch']; $this->release_branch = $release['release_branch']; $this->first_revision = $release['first_revision']; $path = DB_PATH . '/' . $this->release_branch . '.sqlite'; + $this->db = sqlite_open($path); if (!$this->db) { @@ -34,7 +37,15 @@ } function createStorage() { - if (!sqlite_query($this->db, 'CREATE TABLE revision (revision VARCHAR(32), date VARCHAR(32), author VARCHAR(80), msg VARCHAR(255), status integer, comment TEXT, news TEXT)')) { + if (!sqlite_query($this->db, 'CREATE TABLE revision ( + revision VARCHAR(32), + release VARCHAR(32), + date VARCHAR(32), + author VARCHAR(80), + msg VARCHAR(255), + status integer, + comment TEXT, + news TEXT)')) { throw new \Exception('Cannot initialize storage ' . $path); } } @@ -61,20 +72,81 @@ if ($res && sqlite_num_rows($res) > 0) { $row = sqlite_fetch_array($res); if ($row && empty($row['author'])) { - $res = sqlite_query($this->db, "UPDATE revision SET author='" . sqlite_escape_string($author). "' WHERE revision='" . sqlite_escape_string($rev) . "'"); + $res = sqlite_query($this->db, "UPDATE revision SET author='" . sqlite_escape_string($author) . + "' WHERE revision='" . sqlite_escape_string($rev) . "'"); if (!$res) { Throw new \Exception('Update query failed for ' . $rev); } } } else { - $res = sqlite_query($this->db, "INSERT INTO revision (revision, date, author, status, msg, comment, news) VALUES('$rev' ,'" . $date . "','" . $author . "', 0, '" . sqlite_escape_string($msg) . "', '', '');"); + $res = sqlite_query($this->db, "INSERT INTO revision (revision, date, author, status, msg, comment, news) + VALUES('$rev' ,'" . $date . "','" . $author . "', 0, '" . sqlite_escape_string($msg) . "', '', '');"); if (!$res) { Throw new \Exception('Insert query failed for ' . $rev); } } } + $this->release['last_revision'] = $this->getLatestRevision(); + $this->base->setLatestRevisionForRelease($this->release['name'], $this->release['last_revision']); } + function createSnapshot($filename = FALSE, $force = FALSE) { + if ($filename && !is_dir(dirname($filename))) { + throw new \Exception('Invalid filename ' . $filename); + } + + if (!$filename) { + $filename = SNAPS_PATH . '/php-' . $this->release['name'] . '-src-' . date("YmdHis") . '.zip'; + } + + $latest_revision = $this->getLatestRevision(); + if ($this->release['last_revision'] == $latest_revision && !$force) { + return TRUE; + } + + $tmpname = tempnam(sys_get_temp_dir(), 'rmtools'); + $tmpname_dir = $tmpname . '.dir'; + + $svn = new Svn; + $svn->export($this->release_branch, $tmpname_dir); + + $odir = getcwd(); + chdir($tmpname_dir); + if (!$filename) { + $snaps_archive_name = SNAPS_PATH . '/test.zip'; + } else { + $snaps_archive_name = $filename; + } + $now = date(DATE_RFC822); + $text = " +PHP source snapshot generated on $now. The last revision in this snap is +$latest_revision"; + + file_put_contents("SNAPSHOT.txt", $text); + $cmd = "zip -r $snaps_archive_name *"; + exec($cmd); + chdir($odir); + + if (!file_exists($snaps_archive_name)) { + throw new \Exception('Fail to create archive ' . $snaps_archive_name); + } + + $this->base->setLatestRevisionForRelease($this->release['name'], $latest_revision); + $this->release['last_revision'] = $latest_revision; + + return $filename; + } + + function getLatestRevision() { + ; + $res = sqlite_query($this->db, 'SELECT MAX(revision) as revision FROM revision WHERE release=' . "'" . $this->release['name'] . "'", SQLITE_ASSOC); + if ($res && sqlite_num_rows($res) > 0) { + $latest_rev = sqlite_fetch_array($res); + return $latest_rev['revision']; + } + return NULL; + } + function getAll() { $res = sqlite_query($this->db, 'SELECT * FROM revision ORDER by revision', SQLITE_ASSOC); if ($res && sqlite_num_rows($res) > 0) { @@ -92,12 +164,21 @@ } function updateRevision($revision) { + $error = FALSE; + if (!isset($revision['status']) || !isset($revision['comment']) || !isset($revision['news']) || ((int)$revision['revision'] < $this->release['first_revision'])) { + Throw new \Exception('Invalid revision ' . $revision); + } + $sql = "UPDATE revision set status=" . $revision['status'] . ", comment='" . sqlite_escape_string($revision['comment']) . "', news='" . sqlite_escape_string($revision['news']) . "' WHERE revision=" . (integer)$revision['revision']; + $res = sqlite_query($this->db, $sql); if ($res) { return TRUE; + } else { + Throw new \Exception('Failed to update revision ' . $revision); } + return FALSE; } Modified: web/php-rmtools/trunk/include/Svn.php =================================================================== --- web/php-rmtools/trunk/include/Svn.php 2010-01-11 00:41:54 UTC (rev 293368) +++ web/php-rmtools/trunk/include/Svn.php 2010-01-11 00:53:52 UTC (rev 293369) @@ -53,9 +53,41 @@ proc_close($process); } + function export($branch, $targetdir) { + if (!static::isValidBranch($branch)) { + throw new \Exception('Invalid branch name ' . $branch); + } + + if (!is_dir(dirname($targetdir))) { + throw new \Exception('Invalid target directory ' . $branch); + } + + $descriptorspec = array( + 1 => array("pipe", "w"), // stdout is a pipe that the child will write to + 2 => array("pipe", "w") // stderr is a file to write to + ); + + if ($branch != 'trunk') { + $path = SVN_REPO_URL . '/branches/' . $branch ; + } else { + $path = SVN_REPO_URL . '/' . $branch ; + } + $cmd = "svn --quiet export " . $path . ' ' . $targetdir; + + $process = proc_open($cmd, $descriptorspec, $pipes, $path); + $out = stream_get_contents($pipes[1]); + $err = stream_get_contents($pipes[2]); + fclose($pipes[1]); + proc_close($process); + if (!is_dir($targetdir)) { + throw new \Excpetion('svn export failed: ' . $err); + } + } + /* TODO: do some sanity check if the branch is actually co'ed */ static function isValidBranch($branch) { $path = SVN_REPO_PATH . '/php-src/branches/' . $branch; + if (is_dir($path)) { return TRUE; } else {