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

Reply via email to