https://www.mediawiki.org/wiki/Special:Code/MediaWiki/113665
Revision: 113665
Author: reedy
Date: 2012-03-12 20:55:58 +0000 (Mon, 12 Mar 2012)
Log Message:
-----------
Bug 27812 - Make ExtensionDistributor work with Git
Abstract out VCS base stuff, add code to handle based on version control system
Used Status objects in refactored code
svn-invoker.php isn't quite finished, so will be coming in a followup commit
Modified Paths:
--------------
trunk/extensions/ExtensionDistributor/ExtensionDistributor.i18n.php
trunk/extensions/ExtensionDistributor/ExtensionDistributor.php
trunk/extensions/ExtensionDistributor/ExtensionDistributor_body.php
trunk/extensions/ExtensionDistributor/cron.php
Added Paths:
-----------
trunk/extensions/ExtensionDistributor/ExtensionDistributorGit.php
trunk/extensions/ExtensionDistributor/ExtensionDistributorSVN.php
trunk/extensions/ExtensionDistributor/ExtensionDistributorVCS.php
Modified: trunk/extensions/ExtensionDistributor/ExtensionDistributor.i18n.php
===================================================================
--- trunk/extensions/ExtensionDistributor/ExtensionDistributor.i18n.php
2012-03-12 20:54:59 UTC (rev 113664)
+++ trunk/extensions/ExtensionDistributor/ExtensionDistributor.i18n.php
2012-03-12 20:55:58 UTC (rev 113665)
@@ -26,6 +26,8 @@
'extdist-remote-invalid-response' => 'Invalid response from
remote subversion client.',
'extdist-svn-error' => 'Subversion encountered an error:
<pre>$1</pre>',
'extdist-svn-parse-error' => 'Unable to process the XML from
"svn info": <pre>$1</pre>',
+ 'extdist-git-error' => 'Git encountered an error:
<pre>$1</pre>',
+ 'extdist-git-invalidsha1' => 'Git returned an invalid SHA1 hash
for the current revision: <pre>$1<pre>',
'extdist-tar-error' => 'Tar returned exit code $1:',
'extdist-created' => "A snapshot of version <b>$2</b> of the
<b>$1</b> extension for MediaWiki <b>$3</b> has been created. Your download
should start automatically in 5 seconds.
@@ -47,6 +49,8 @@
If you have any questions about this extension distribution system, please go
to [[Extension talk:ExtensionDistributor]].",
'extdist-want-more' => 'Get another extension',
+ 'extdist-cvs-unsupported' => 'Extension Distributor doesn\'t
support the "$1" version control system.',
+ 'extdist-git-invalid-dir' => 'Unable to enter directory for git
checkout',
);
/** Message documentation (Message documentation)
Modified: trunk/extensions/ExtensionDistributor/ExtensionDistributor.php
===================================================================
--- trunk/extensions/ExtensionDistributor/ExtensionDistributor.php
2012-03-12 20:54:59 UTC (rev 113664)
+++ trunk/extensions/ExtensionDistributor/ExtensionDistributor.php
2012-03-12 20:55:58 UTC (rev 113665)
@@ -49,3 +49,6 @@
$wgSpecialPages['ExtensionDistributor'] = 'ExtensionDistributorPage';
$wgSpecialPageGroups['ExtensionDistributor'] = 'developer';
$wgAutoloadClasses['ExtensionDistributorPage'] = $dir .
'ExtensionDistributor_body.php';
+$wgAutoloadClasses['ExtensionDistributorSVN'] = $dir .
'ExtensionDistributorSVN.php';
+$wgAutoloadClasses['ExtensionDistributorVCS'] = $dir .
'ExtensionDistributorVCS.php';
+$wgAutoloadClasses['ExtensionDistributorGit'] = $dir .
'ExtensionDistributorGit.php';
Added: trunk/extensions/ExtensionDistributor/ExtensionDistributorGit.php
===================================================================
--- trunk/extensions/ExtensionDistributor/ExtensionDistributorGit.php
(rev 0)
+++ trunk/extensions/ExtensionDistributor/ExtensionDistributorGit.php
2012-03-12 20:55:58 UTC (rev 113665)
@@ -0,0 +1,42 @@
+<?php
+
+class ExtensionDistributorGit extends ExtensionDistributorVCS {
+
+ /**
+ * @param $dir string
+ * @return Status
+ */
+ public function updateAndGetVersion( $dir ) {
+ if ( !chdir( $dir ) ) {
+ return Status::newFatal( 'extdist-git-invalid-dir' );
+ }
+ // Is -q (quiet) enough?
+ $cmd = "git pull -q 2>&1";
+ $retval = -1;
+
+ $result = wfShellExec( $cmd, $retval );
+
+ if ( $retval ) {
+ return Status::newFatal( 'extdist-git-error', $result );
+ }
+
+ // Determine last changed revision
+ $cmd = "git rev-parse HEAD";
+ $retval = -1;
+ $result = wfShellExec( $cmd, $retval );
+
+ if ( $retval ) {
+ return Status::newFatal( 'extdist-git-error', $result );
+ }
+
+ // Trim trailing whitespace
+ $result = rtrim( $result );
+
+ // Check it looks like a SHA1 hash
+ if ( !preg_match( '/^[0-9a-f]{40}$/i', $result ) ) {
+ return Status::newFatal( 'extdist-git-invalidsha1',
$result );
+ }
+
+ return Status::newGood( $result );
+ }
+}
Property changes on:
trunk/extensions/ExtensionDistributor/ExtensionDistributorGit.php
___________________________________________________________________
Added: svn:eol-style
+ native
Added: trunk/extensions/ExtensionDistributor/ExtensionDistributorSVN.php
===================================================================
--- trunk/extensions/ExtensionDistributor/ExtensionDistributorSVN.php
(rev 0)
+++ trunk/extensions/ExtensionDistributor/ExtensionDistributorSVN.php
2012-03-12 20:55:58 UTC (rev 113665)
@@ -0,0 +1,37 @@
+<?php
+
+class ExtensionDistributorSVN extends ExtensionDistributorVCS {
+
+ /**
+ * @param $dir string
+ * @return Status
+ */
+ public function updateAndGetVersion( $dir ) {
+ $cmd = "svn up --non-interactive " . wfEscapeShellArg( $dir ) .
" 2>&1";
+ $retval = -1;
+
+ $result = wfShellExec( $cmd, $retval );
+
+ if ( $retval ) {
+ return Status::newFatal( 'extdist-svn-error', $result );
+ }
+
+ // Determine last changed revision
+ $cmd = "svn info --non-interactive --xml " . wfEscapeShellArg(
$dir );
+ $retval = -1;
+ $result = wfShellExec( $cmd, $retval );
+
+ if ( $retval ) {
+ return Status::newFatal( 'extdist-svn-error', $result );
+ }
+
+ $sx = new SimpleXMLElement( $result );
+ $rev = $sx->entry->commit['revision'];
+
+ if ( !$rev || strpos( $rev, '/' ) !== false || strpos( $rev,
"\000" ) !== false ) {
+ return Status::newFatal( 'extdist-svn-parse-error',
$result );
+ }
+
+ return Status::newGood( $rev );
+ }
+}
Property changes on:
trunk/extensions/ExtensionDistributor/ExtensionDistributorSVN.php
___________________________________________________________________
Added: svn:eol-style
+ native
Added: trunk/extensions/ExtensionDistributor/ExtensionDistributorVCS.php
===================================================================
--- trunk/extensions/ExtensionDistributor/ExtensionDistributorVCS.php
(rev 0)
+++ trunk/extensions/ExtensionDistributor/ExtensionDistributorVCS.php
2012-03-12 20:55:58 UTC (rev 113665)
@@ -0,0 +1,24 @@
+<?php
+
+abstract class ExtensionDistributorVCS {
+
+ /**
+ * @param $vcs string
+ * @return ExtensionDistributorGIT|ExtensionDistributorSVN|null
+ */
+ public static function factory( $vcs ) {
+ if ( $vcs === 'svn' ) {
+ return new ExtensionDistributorSVN;
+ } elseif ( $vcs === 'git' ) {
+ return new ExtensionDistributorGit;
+ }
+ return null;
+ }
+
+ /**
+ * @abstract
+ * @param $dir string
+ * @return Status
+ */
+ abstract function updateAndGetVersion( $dir );
+}
Property changes on:
trunk/extensions/ExtensionDistributor/ExtensionDistributorVCS.php
___________________________________________________________________
Added: svn:eol-style
+ native
Modified: trunk/extensions/ExtensionDistributor/ExtensionDistributor_body.php
===================================================================
--- trunk/extensions/ExtensionDistributor/ExtensionDistributor_body.php
2012-03-12 20:54:59 UTC (rev 113664)
+++ trunk/extensions/ExtensionDistributor/ExtensionDistributor_body.php
2012-03-12 20:55:58 UTC (rev 113665)
@@ -223,10 +223,11 @@
global $wgExtDistWorkingCopy, $wgExtDistTarDir,
$wgExtDistBranches,
$wgOut, $wgExtDistTarUrl, $wgExtDistRemoteClient;
+ $vcs = isset( $wgExtDistBranches[$version]['vcs'] ) ?
$wgExtDistBranches[$version]['vcs'] : 'svn';
if ( $wgExtDistRemoteClient ) {
- $rev = $this->updateAndGetRevisionRemote( $extension,
$version );
+ $rev = $this->updateAndGetRevisionRemote( $extension,
$version, $vcs );
} else {
- $rev = $this->updateAndGetRevisionLocal( $extension,
$version );
+ $rev = $this->updateAndGetRevisionLocal( $extension,
$version, $vcs );
}
if ( $rev === false ) {
@@ -286,54 +287,45 @@
/**
* @param $extension string
* @param $version string
+ * @param $vcs string Version control system to use for branch
* @return bool|string
*/
- protected function updateAndGetRevisionLocal( $extension, $version ) {
+ protected function updateAndGetRevisionLocal( $extension, $version,
$vcs ) {
global $wgExtDistWorkingCopy, $wgOut;
// svn up
$dir = "$wgExtDistWorkingCopy/$version/extensions/$extension";
- $cmd = "svn up --non-interactive " . wfEscapeShellArg( $dir ) .
" 2>&1";
- $retval = - 1;
-
- $result = wfShellExec( $cmd, $retval );
-
- if ( $retval ) {
- $wgOut->addWikiMsg( 'extdist-svn-error', $result );
+ $ed = ExtensionDistributorVCS::factory( $vcs );
+ if ( $ed === null ) {
+ $wgOut->addWikiMsg( 'extdist-cvs-unsupported', $vcs );
return false;
}
- // Determine last changed revision
- $cmd = "svn info --non-interactive --xml " . wfEscapeShellArg(
$dir );
- $retval = - 1;
- $result = wfShellExec( $cmd, $retval );
-
- if ( $retval ) {
- $wgOut->addWikiMsg( 'extdist-svn-error', $result );
+ $result = $ed->updateAndGetVersion( $dir );
+ if ( !$result->isGood() ) {
+ $this->getOutput()->addWikiText( $result->getWikiText()
);
return false;
}
-
- $sx = new SimpleXMLElement( $result );
- $rev = $sx->entry->commit['revision'];
-
- if ( !$rev || strpos( $rev, '/' ) !== false || strpos( $rev,
"\000" ) !== false ) {
- $wgOut->addWikiMsg( 'extdist-svn-parse-error', $result
);
- return false;
- }
-
- return $rev;
+ return $result->value;
}
/**
* @param $extension string
* @param $version string
+ * @param $vcs string Version control system to use for branch
* @return bool|string
*/
- protected function updateAndGetRevisionRemote( $extension, $version ) {
+ protected function updateAndGetRevisionRemote( $extension, $version,
$vcs ) {
global $wgExtDistRemoteClient, $wgOut;
- $cmd = json_encode( array( 'extension' => $extension, 'version'
=> $version ) );
+ $cmd = json_encode(
+ array(
+ 'extension' => $extension,
+ 'version' => $version,
+ 'vcs' => $vcs
+ )
+ );
$cmd = str_replace( "\000", '', $cmd );
list( $host, $port ) = explode( ':', $wgExtDistRemoteClient, 2
);
Modified: trunk/extensions/ExtensionDistributor/cron.php
===================================================================
--- trunk/extensions/ExtensionDistributor/cron.php 2012-03-12 20:54:59 UTC
(rev 113664)
+++ trunk/extensions/ExtensionDistributor/cron.php 2012-03-12 20:55:58 UTC
(rev 113665)
@@ -35,18 +35,65 @@
}
// Update the files
- svnUpdate( "$wgExtDistWorkingCopy/trunk/extensions" );
+ vcsUpdate( "$wgExtDistWorkingCopy/trunk/extensions" );
+
foreach ( glob( "$wgExtDistWorkingCopy/branches/*", GLOB_ONLYDIR ) as
$branch ) {
- svnUpdate( "$branch/extensions" );
+ vcsUpdate( "$branch/extensions" );
}
}
+/**
+ * @param $dir string
+ * @return bool
+ */
+function isSVNDir( $dir ) {
+ return is_dir( "$dir/.svn");
+}
+
+/**
+ * @param $dir string
+ * @return bool
+ */
+function isGitDir( $dir ) {
+ return is_dir( "$dir/.git");
+}
+
+/**
+ * @param $dir string
+ */
+function vcsUpdate( $dir ) {
+ if ( isSVNDir( $dir ) ) {
+ svnUpdate( $dir );
+ } elseif ( isGitDir( $dir ) ) {
+ gitUpdate( $dir );
+ } else {
+ // Meh?
+ }
+}
+
+/**
+ * @param $path string
+ */
function svnUpdate( $path ) {
$cmd = "svn up --non-interactive " . escapeshellarg( $path );
- $retval = 1;
+ $retval = -1;
system( $cmd, $retval );
if ( $retval ) {
echo "Error executing command: $cmd\n";
exit( 1 );
}
}
+
+/**
+ * @param $path string
+ */
+function gitUpdate( $path ) {
+ chdir( $path );
+ $cmd = "git pull -q";
+ $retval = -1;
+ system( $cmd, $retval );
+ if ( $retval ) {
+ echo "Error executing command: $cmd\n";
+ exit( 1 );
+ }
+}
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs