WordPress.org

Plugin Directory

Changeset 632636


Ignore:
Timestamp:
12/01/12 09:35:09 (17 months ago)
Author:
pento
Message:

Add SVN support for plugins and themes

Location:
automatic-updater/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • automatic-updater/trunk/admin.php

    r632374 r632636  
    114114 
    115115                <?php 
    116                 if ( is_dir( ABSPATH . '/.svn' ) ) { 
    117                     $checked = ''; 
    118                     if ( $this->automatic_updater->get_option( 'svn' ) ) 
    119                         $checked = ' checked="checked"'; 
     116                $source_control = $this->automatic_updater->under_source_control(); 
     117                if ( $source_control['core'] || ! empty( $source_control['plugins'] ) || ! empty( $source_control['themes'] ) ) { 
     118                    $svn_options = $this->automatic_updater->get_option( 'svn' ); 
     119                    $writable_error = false; 
    120120                ?> 
    121121 
    122122                    <br> 
    123123                    <h3><?php esc_html_e( 'SVN Support', 'automatic-updater' ); ?></h3> 
    124                     <p><?php echo wp_kses( __( "It looks like you're running an SVN version of WordPress, that's cool! Automatic Updater can run <tt>svn up</tt> once an hour, to keep you up-to-date. For safety, enabling this option will disable the normal WordPress core updates.", 'automatic-updater' ), array( 'tt' => array() ) ); ?></p> 
    125  
    126                     <?php 
    127                     if ( ! is_writable( ABSPATH . '/.svn' ) ) { 
     124                    <?php 
     125                    if ( $source_control['core'] ) { 
     126                        $svn_core_checked = ''; 
     127                        if ( $svn_options['core'] ) 
     128                            $svn_core_checked = ' checked="checked"'; 
     129 
     130                        if ( ! is_writable( ABSPATH . '/.svn' ) ) 
     131                            $writable_error = true; 
     132                    ?> 
     133                        <h4><?php esc_html_e( 'WordPress Core', 'automatic-updater' ); ?></h4> 
     134                        <p><?php echo wp_kses( __( "It looks like you're running an SVN version of WordPress, that's cool! Automatic Updater can run <tt>svn up</tt> once an hour, to keep you up-to-date. For safety, enabling this option will disable the normal WordPress core updates.", 'automatic-updater' ), array( 'tt' => array() ) ); ?></p> 
     135                    <p><input type="checkbox" id="svn-core" name="svn-core" value="1"<?php echo $svn_core_checked; ?>> <label for="svn-core"><?php esc_html_e( 'Update WordPress Core hourly?', 'automatic-updater' ); ?></label></p> 
     136 
     137                    <?php 
     138                    } 
     139 
     140                    if ( ! empty( $source_control['plugins'] ) ) { 
     141                    ?> 
     142                        <h4><?php esc_html_e( 'Plugins', 'automatic-updater' ); ?></h4> 
     143                        <p><?php esc_html_e( "Running plugins from SVN is great for helping plugin devs fine tune them before release, so on behalf of all of us, thanks! If you see Akismet here and don't have it coming from a custom repository, it will probably automatically update when the WordPress Core SVN update occurs.", 'automatic-updater' ); ?></p> 
     144                    <?php 
     145                        foreach ( $source_control['plugins'] as $id => $plugin ) { 
     146                            if ( ! is_writable( WP_PLUGIN_DIR . '/' . plugin_dir_path( $id ) . '/.svn' ) ) 
     147                                $writable_error = true; 
     148 
     149                            $checked = ''; 
     150                            if ( array_key_exists( $id, $svn_options['plugins'] ) ) 
     151                                $checked = ' checked="checked"'; 
     152                            echo "<input type='checkbox' name='svn-plugins[]' id='$id' value='$id'$checked /> <label for='$id'>{$plugin['plugin']['Name']} ($id)</label><br/>"; 
     153                        } 
     154                    } 
     155 
     156                    if ( ! empty( $source_control['themes'] ) ) { 
     157                    ?> 
     158                        <h4><?php esc_html_e( 'Themes', 'automatic-updater' ); ?></h4> 
     159                        <p><?php esc_html_e( "Running themes from SVN makes you an excellent person who makes the WordPress community better - thank you! If you see any of the default Twenty Ten, Eleven or Twelve themes, these will probably automatically update when the WordPress Core SVN update occurs.", 'automatic-updater' ); ?></p> 
     160                    <?php 
     161                        foreach ( $source_control['themes'] as $id => $theme ) { 
     162                            if ( ! is_writable( $theme['theme']->get_stylesheet_directory() . '/.svn' ) ) 
     163                                $writable_error = true; 
     164 
     165                            $checked = ''; 
     166                            if ( array_key_exists( $id, $svn_options['themes'] ) ) 
     167                                $checked = ' checked="checked"'; 
     168                            echo "<input type='checkbox' name='svn-themes[]' id='$id' value='$id'$checked /> <label for='$id'>{$theme['theme']->name} ($id)</label><br/>"; 
     169                        } 
     170                    } 
     171 
     172                    if ( $writable_error ) { 
    128173                        $uid = posix_getuid(); 
    129174                        $user = posix_getpwuid( $uid ); 
    130                         echo '<div class="automatic-updater-notice"><p>' . wp_kses( sprintf( __( "The .svn directory isn't writable, so <tt>svn up</tt> will probably fail when the web server runs it. You need to give the user <tt>%s</tt> write permissions to your entire WordPress install, including .svn directories.", 'automatic-updater' ), $user['name'] ), array( 'tt' => array() ) ) . '</p></div>'; 
    131                     } 
    132                     ?> 
    133  
    134                     <p><input type="checkbox" id="svn" name="svn" value="1"<?php echo $checked; ?>> <label for="svn"><?php echo wp_kses( __( 'Run <tt>svn up</tt> hourly?', 'automatic-updater' ), array( 'tt' => array() ) ); ?></label></p> 
    135                     <p><input type="checkbox" id="svn-success-email" name="svn-success-email" value="1"<?php echo $checked; ?>> <label for="svn-success-email"><?php echo wp_kses( __( 'Send email on <tt>svn up</tt> success? Disabling this will cause notification emails to only be sent if the <tt>svn up</tt> fails.', 'automatic-updater' ), array( 'tt' => array() ) ); ?></label></p> 
     175                        echo '<div class="automatic-updater-notice"><p>' . wp_kses( sprintf( __( "The items marked in red don't have their .svn directory writable, so <tt>svn up</tt> will probably fail when the web server runs it. You need to give the user <tt>%s</tt> write permissions to your entire WordPress install, including .svn directories.", 'automatic-updater' ), $user['name'] ), array( 'tt' => array() ) ) . '</p></div>'; 
     176                    } 
     177 
     178                    $svn_success_email_checked = ''; 
     179                    if ( $this->automatic_updater->get_option( 'svn-success-email' ) ) 
     180                        $svn_success_email_checked = ' checked="checked"'; 
     181                    ?> 
     182                    <h4><?php esc_html_e( 'SVN Options', 'automatic-updater' ); ?></h4> 
     183                    <p><input type="checkbox" id="svn-success-email" name="svn-success-email" value="1"<?php echo $svn_success_email_checked; ?>> <label for="svn-success-email"><?php echo wp_kses( __( 'Send email on <tt>svn up</tt> success? Disabling this will cause notification emails to only be sent if the <tt>svn up</tt> fails.', 'automatic-updater' ), array( 'tt' => array() ) ); ?></label></p> 
    136184 
    137185                <?php 
    138186                } else { 
    139                     echo '<input type="hidden" name="svn" value="0">'; 
     187                ?> 
     188                    <input type="hidden" name="svn-core" value="0">; 
     189                    <input type="hidden" name="svn-plugins" value="0">; 
     190                    <input type="hidden" name="svn-themes" value="0">; 
     191                    <input type="hidden" name="svn-success-email" value="0">; 
     192                <?php 
    140193                } 
    141194 
     
    165218        $this->automatic_updater->update_option( 'update', $update ); 
    166219 
    167         $top_bool_options = array( 'debug', 'svn', 'disable-email' ); 
     220        $top_bool_options = array( 'debug', 'disable-email' ); 
    168221        foreach ( $top_bool_options as $option ) { 
    169222            if ( ! empty( $_REQUEST[ $option ] ) ) 
     
    176229        foreach ( $top_options as $option ) 
    177230            $this->automatic_updater->update_option( $option, $_REQUEST[ $option ] ); 
     231 
     232        $svn_options = array( 
     233                            'core'    => false, 
     234                            'plugins' => array(), 
     235                            'themes'  => array() 
     236        ); 
     237 
     238        $source_control = $this->automatic_updater->under_source_control(); 
     239 
     240        if ( $source_control['core'] && ! empty( $_REQUEST['svn-core'] ) ) 
     241            $svn_options['core'] = true; 
     242 
     243        if ( ! empty( $source_control['plugins'] ) && ! empty( $_REQUEST['svn-plugins'] ) && is_array( $_REQUEST['svn-plugins'] ) ) { 
     244            foreach ( $_REQUEST['svn-plugins'] as $plugin ) { 
     245                if ( array_key_exists( $plugin, $source_control['plugins'] ) ) 
     246                    $svn_options['plugins'][ $plugin ] = $source_control['plugins'][ $plugin ]['type']; 
     247            } 
     248        } 
     249 
     250        if ( ! empty( $source_control['themes'] ) && ! empty( $_REQUEST['svn-themes'] ) && is_array( $_REQUEST['svn-themes'] ) ) { 
     251            foreach ( $_REQUEST['svn-themes'] as $theme ) { 
     252                if ( array_key_exists( $theme, $source_control['themes'] ) ) 
     253                    $svn_options['themes'][ $theme ] = $source_control['themes'][ $theme ]['type']; 
     254            } 
     255        } 
     256 
     257        $this->automatic_updater->update_option( 'svn', $svn_options ); 
    178258    } 
    179259 
  • automatic-updater/trunk/automatic-updater.php

    r632374 r632636  
    6565 
    6666        // Configure SVN updates cron, if it's enabled 
    67         if ( $this->options['svn'] ) { 
     67        if ( $this->options['svn']['core'] || ! empty( $this->options['svn']['plugins'] ) || ! empty( $this->options['svn']['themes'] ) ) { 
    6868            if ( ! wp_next_scheduled( 'auto_updater_svn_event' ) ) 
    6969                wp_schedule_event( time(), 'hourly', 'auto_updater_svn_event' ); 
     
    157157                                                      'themes' => array(), 
    158158                        ), 
    159                         'svn'                     => false, 
     159                        'svn'                     => array( 
     160                                                        'core'    => false, 
     161                                                        'plugins' => array(), 
     162                                                        'themes'  => array(), 
     163                        ), 
    160164                        'svn-success-email'       => true, 
    161165                        'debug'                   => false, 
     
    202206        if ( ! array_key_exists( 'svn-success-email', $this->options ) ) 
    203207            $this->options['svn-success-email'] = true; 
     208 
     209        // SVN support for themes and plugins added in 0.8 
     210        if ( ! is_array( $this->options['svn'] ) ) 
     211            $this->options['svn'] =  array( 
     212                                        'core'    => $this->options['svn'], 
     213                                        'plugins' => array(), 
     214                                        'themes'  => array(), 
     215                                ); 
    204216    } 
    205217 
     
    476488 
    477489    function update_svn() { 
    478         $output = array(); 
    479         $return = null; 
    480  
    481         exec( 'svn up ' . ABSPATH, $output, $return ); 
    482  
    483         if ( 0 === $return ) { 
    484             $update = end( $output ); 
    485             // No need to email if there was no update. 
    486             if ( 0 === strpos( $update, "At revision" ) ) 
    487                 return; 
    488  
    489             // If we're only sending emails on failure, no need to continue 
    490             if( ! $this->options['svn-success-email'] ) 
    491                 return; 
    492  
    493             $message = esc_html__( 'We successfully upgraded from SVN!', 'automatic-updater' ); 
    494             $message .= "<br><br>$update"; 
    495         } else { 
    496             $message = esc_html__( 'While upgrading from SVN, we ran into the following error:', 'automatic-updater' ); 
    497             $message .= '<br><br>' . end( $output ) . '<br><br>'; 
    498             $message .= esc_html__( "We're sorry it didn't work out. Please try upgrading manually, instead.", 'automatic-updater' ); 
    499         } 
     490        $output       = array(); 
     491        $return       = null; 
     492 
     493        $message      = ''; 
     494 
     495        $found_error  = false; 
     496        $found_update = false; 
     497 
     498        $source_control = $this->under_source_control(); 
     499 
     500        if ( $source_control['core'] && 'svn' === $this->options['svn']['core'] ) { 
     501            exec( 'svn up ' . ABSPATH, $output, $return ); 
     502 
     503            if ( 0 !== strpos( $update, "At revision" ) ) { 
     504                $found_update = true; 
     505 
     506                $update = end( $output ); 
     507 
     508                if ( 0 === $return ) { 
     509                    $message .= esc_html__( 'We successfully upgraded WordPress Core from SVN!', 'automatic-updater' ); 
     510                    $message .= "<br><br>$update"; 
     511                } else { 
     512                    $found_error = true; 
     513 
     514                    $message .= esc_html__( 'While upgrading WordPress Core from SVN, we ran into the following error:', 'automatic-updater' ); 
     515                    $message .= "<br><br>$update<br><br>"; 
     516                    $message .= esc_html__( "We're sorry it didn't work out. Please try upgrading manually, instead.", 'automatic-updater' ); 
     517                } 
     518            } 
     519        } 
     520 
     521        if ( ! empty( $source_control['plugins'] ) && ! empty( $this->options['svn']['plugins'] ) ) { 
     522            $plugin_message = ''; 
     523 
     524            include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); 
     525 
     526            $plugin_upgrades = 0; 
     527            foreach ( $this->options['svn']['plugins'] as $id => $type ) { 
     528                // We only support SVN at the moment 
     529                if ( 'svn' !== $type ) 
     530                    continue; 
     531 
     532                // Check that this plugin is still under source control 
     533                if ( ! array_key_exists( $id, $source_control['plugins'] ) ) 
     534                    continue; 
     535 
     536                $plugin_upgrades++; 
     537 
     538                $plugin = get_plugin_data( $id ); 
     539 
     540                exec( 'svn up ' . WP_PLUGIN_DIR . '/' . plugin_dir_path( $id ), $output, $return ); 
     541 
     542                $update = end( $output ); 
     543 
     544                if ( 0 !== $return ) 
     545                    $found_error = true; 
     546 
     547                $plugin_message .= "{$plugin['Name']}: $update<br>"; 
     548            } 
     549 
     550            if ( ! empty( $plugin_message ) ) { 
     551                $message .= '<br><br>'; 
     552                $message .= esc_html( _n( 'We upgraded the following plugin:', 'We upgraded the following plugins:', $plugin_upgrades, 'automatic-updater' ) ); 
     553                $message .= "<br><br>$plugin_message"; 
     554            } 
     555        } 
     556 
     557        if ( ! empty( $source_control['themes'] ) && ! empty( $this->options['svn']['themes'] ) ) { 
     558            $theme_message = ''; 
     559 
     560            $theme_upgrades = 0; 
     561            foreach ( $this->options['svn']['themes'] as $id => $type ) { 
     562                // We only support SVN at the moment 
     563                if ( 'svn' !== $type ) 
     564                    continue; 
     565 
     566                // Check that this theme is still under source control 
     567                if ( ! array_key_exists( $id, $source_control['themes'] ) ) 
     568                    continue; 
     569 
     570                $theme_upgrades++; 
     571 
     572                $theme = wp_get_theme( $id ); 
     573 
     574                exec( 'svn up ' . $theme->get_stylesheet_directory(), $output, $return ); 
     575 
     576                $update = end( $output ); 
     577 
     578                if ( 0 !== $return ) 
     579                    $found_error = true; 
     580 
     581                $theme_message .= "{$theme->name}: $update<br>"; 
     582            } 
     583 
     584            if ( ! empty( $theme_message ) ) { 
     585                $message .= '<br><br>'; 
     586                $message .= esc_html( _n( 'We upgraded the following theme:', 'We upgraded the following themes:', $theme_upgrades, 'automatic-updater' ) ); 
     587                $message .= "<br><br>$theme_message"; 
     588            } 
     589        } 
     590 
     591        // No need to email if there were no updates. 
     592        if ( ! $found_update ) 
     593            return; 
     594 
     595        // If we're only sending emails on failure, check if any errors were found 
     596        if( ! $found_error && ! $this->options['svn-success-email'] ) 
     597            return; 
    500598 
    501599        $message .= '<br>'; 
     
    582680        return apply_filters( 'auto_update_get_update_data', array( 'counts' => $counts ) ); 
    583681    } 
     682 
     683    function under_source_control( $types = array( 'svn' ) ) { 
     684        $return = array( 
     685                    'core'    => false, 
     686                    'plugins' => array(), 
     687                    'themes'  => array() 
     688        ); 
     689 
     690        $supported_checks = array( 'svn', 'git' ); 
     691        foreach ( $types as $id => $type ) 
     692            if ( ! in_array( $type, $supported_checks ) ) 
     693                unset( $types[ $id ] ); 
     694 
     695        if ( empty( $types ) ) 
     696            return $return; 
     697 
     698        include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); 
     699 
     700        $plugins = get_plugins(); 
     701        $themes  = wp_get_themes(); 
     702 
     703        foreach ( $types as $type ) { 
     704            if ( is_dir( ABSPATH . "/.$type" ) ) 
     705                $return['core'] = $type; 
     706 
     707            foreach ( $plugins as $id => $plugin ) 
     708                if ( plugin_dir_path( $id ) != './' && is_dir( WP_PLUGIN_DIR . '/' . plugin_dir_path( $id ) . ".$type" ) ) 
     709                    $return['plugins'][ $id ] = array( 
     710                                                    'type'   => $type, 
     711                                                    'plugin' => $plugin 
     712                    ); 
     713 
     714            foreach ( $themes as $id => $theme ) 
     715                if ( is_dir( $theme->get_stylesheet_directory() . "/.$type" ) ) 
     716                    $return['themes'][ $id ] = array( 
     717                                                    'type'  => $type, 
     718                                                    'theme' => $theme 
     719                    ); 
     720        } 
     721 
     722        return $return; 
     723    } 
    584724} 
    585725 
  • automatic-updater/trunk/readme.txt

    r632368 r632636  
    4545 
    4646= 0.8 = 
     47* ADDED: SVN support for plugins and themes 
    4748* ADDED: Retry limits, so broken updates won't keep trying to install 
    4849* ADDED: Option to only receive SVN update emails if something went wrong 
Note: See TracChangeset for help on using the changeset viewer.