254 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			254 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /*  Copyright 2014-2016 Presslabs SRL <ping@presslabs.com>
 | |
| 
 | |
|     This program is free software; you can redistribute it and/or modify
 | |
|     it under the terms of the GNU General Public License, version 2, as
 | |
|     published by the Free Software Foundation.
 | |
| 
 | |
|     This program is distributed in the hope that it will be useful,
 | |
|     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|     GNU General Public License for more details.
 | |
| 
 | |
|     You should have received a copy of the GNU General Public License
 | |
|     along with this program; if not, write to the Free Software
 | |
|     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 | |
| */
 | |
| 
 | |
| class Gitium_Submenu_Configure extends Gitium_Menu {
 | |
| 
 | |
| 	public function __construct() {
 | |
| 		parent::__construct( $this->gitium_menu_slug, $this->gitium_menu_slug );
 | |
| 
 | |
| 		if ( current_user_can( GITIUM_MANAGE_OPTIONS_CAPABILITY ) ) {
 | |
| 			add_action( GITIUM_ADMIN_MENU_ACTION, array( $this, 'admin_menu' ) );
 | |
| 			add_action( 'admin_init', array( $this, 'regenerate_keypair' ) );
 | |
| 			add_action( 'admin_init', array( $this, 'gitium_warning' ) );
 | |
| 			add_action( 'admin_init', array( $this, 'init_repo' ) );
 | |
| 			add_action( 'admin_init', array( $this, 'choose_branch' ) );
 | |
| 			add_action( 'admin_init', array( $this, 'disconnect_repository' ) );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public function admin_menu() {
 | |
| 		add_menu_page(
 | |
| 			__( 'Git Configuration', 'gitium' ),
 | |
| 			'Gitium',
 | |
| 			GITIUM_MANAGE_OPTIONS_CAPABILITY,
 | |
| 			$this->menu_slug,
 | |
| 			array( $this, 'page' ),
 | |
| 			plugins_url( 'img/gitium.png', dirname( __FILE__ ) )
 | |
| 		);
 | |
| 
 | |
| 		$submenu_hook = add_submenu_page(
 | |
| 			$this->menu_slug,
 | |
| 			__( 'Git Configuration', 'gitium' ),
 | |
| 			__( 'Configuration', 'gitium' ),
 | |
| 			GITIUM_MANAGE_OPTIONS_CAPABILITY,
 | |
| 			$this->menu_slug,
 | |
| 			array( $this, 'page' )
 | |
| 		);
 | |
| 		new Gitium_Help( $submenu_hook, 'configuration' );
 | |
| 	}
 | |
| 
 | |
| 	public function regenerate_keypair() {
 | |
| 	    $submit_keypair = filter_input(INPUT_POST, 'GitiumSubmitRegenerateKeypair', FILTER_SANITIZE_STRING);
 | |
| 		if ( ! isset( $submit_keypair ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 		check_admin_referer( 'gitium-admin' );
 | |
| 		gitium_get_keypair( true );
 | |
| 		$this->success_redirect( __( 'Keypair successfully regenerated.', 'gitium' ) );
 | |
| 	}
 | |
| 
 | |
| 	public function gitium_warning() {
 | |
| 		$submit_warning = filter_input(INPUT_POST, 'GitiumSubmitWarning', FILTER_SANITIZE_STRING);
 | |
| 		if ( ! isset( $submit_warning ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 		check_admin_referer( 'gitium-admin' );
 | |
| 		$this->git->remove_wp_content_from_version_control();
 | |
| 	}
 | |
| 
 | |
| 	public function init_process( $remote_url ) {
 | |
| 		$git = $this->git;
 | |
| 		$git->init();
 | |
| 		$git->add_remote_url( $remote_url );
 | |
| 		$git->fetch_ref();
 | |
| 		if ( count( $git->get_remote_branches() ) == 0 ) {
 | |
| 			$git->add( 'wp-content', '.gitignore' );
 | |
| 			$current_user = wp_get_current_user();
 | |
| 			$git->commit( __( 'Initial commit', 'gitium' ), $current_user->display_name, $current_user->user_email );
 | |
| 			if ( ! $git->push( 'master' ) ) {
 | |
| 				$git->cleanup();
 | |
| 				return false;
 | |
| 			}
 | |
| 		}
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	public function init_repo() {
 | |
| 		$remote_url = filter_input(INPUT_POST, 'remote_url', FILTER_SANITIZE_STRING);
 | |
| 	    $gitium_submit_fetch = filter_input(INPUT_POST, 'GitiumSubmitFetch', FILTER_SANITIZE_STRING);
 | |
| 		if ( ! isset( $gitium_submit_fetch ) || ! isset( $remote_url ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 		check_admin_referer( 'gitium-admin' );
 | |
| 
 | |
| 		if ( empty( $remote_url ) ) {
 | |
| 			$this->redirect( __( 'Please specify a valid repo.', 'gitium' ) );
 | |
| 		}
 | |
| 		if ( $this->init_process( $remote_url ) ) {
 | |
| 			$this->success_redirect( __( 'Repository initialized successfully.', 'gitium' ) );
 | |
| 		} else {
 | |
| 			global $git;
 | |
| 			$this->redirect( __( 'Could not push to remote: ', 'gitium' ) . $remote_url . ' ERROR: ' . serialize( $git->get_last_error() ) );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public function choose_branch() {
 | |
| 	    $gitium_submit_merge_push = filter_input(INPUT_POST, 'GitiumSubmitMergeAndPush', FILTER_SANITIZE_STRING);
 | |
|         $tracking_branch = filter_input(INPUT_POST, 'tracking_branch', FILTER_SANITIZE_STRING);
 | |
| 		if ( ! isset( $gitium_submit_merge_push ) || ! isset( $tracking_branch ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 		check_admin_referer( 'gitium-admin' );
 | |
| 		$this->git->add();
 | |
| 
 | |
| 		$branch = $tracking_branch;
 | |
| 		set_transient( 'gitium_remote_tracking_branch', $branch );
 | |
| 		$current_user = wp_get_current_user();
 | |
| 
 | |
| 		$commit = $this->git->commit( __( 'Merged existing code from ', 'gitium' ) . get_home_url(), $current_user->display_name, $current_user->user_email );
 | |
| 		if ( ! $commit ) {
 | |
| 			$this->git->cleanup();
 | |
| 			$this->redirect( __( 'Could not create initial commit -> ', 'gitium' ) . $this->git->get_last_error() );
 | |
| 		}
 | |
| 		if ( ! $this->git->merge_initial_commit( $commit, $branch ) ) {
 | |
| 			$this->git->cleanup();
 | |
| 			$this->redirect( __( 'Could not merge the initial commit -> ', 'gitium' ) . $this->git->get_last_error() );
 | |
| 		}
 | |
| 		$this->git->push( $branch );
 | |
| 		$this->success_redirect( __( 'Branch selected successfully.', 'gitium' ) );
 | |
| 	}
 | |
| 
 | |
| 	private function setup_step_1_remote_url() {
 | |
| 		?>
 | |
| 		<tr>
 | |
| 		<th scope="row"><label for="remote_url"><?php _e( 'Remote URL', 'gitium' ); ?></label></th>
 | |
| 			<td>
 | |
| 				<input type="text" class="regular-text" name="remote_url" id="remote_url" placeholder="git@github.com:user/example.git" value="">
 | |
| 				<p class="description"><?php _e( 'This URL provide access to a Git repository via SSH, HTTPS, or Subversion.', 'gitium' ); ?><br />
 | |
| 		<?php _e( 'If you need to authenticate over "https://" instead of SSH use: <code>https://user:pass@github.com/user/example.git</code>', 'gitium' ); ?></p>
 | |
| 			</td>
 | |
| 		</tr>
 | |
| 		<?php
 | |
| 	}
 | |
| 
 | |
| 	private function setup_step_1_key_pair() {
 | |
| 		if ( ! defined( 'GIT_KEY_FILE' ) || GIT_KEY_FILE == '' ) :
 | |
| 			list( $git_public_key, ) = gitium_get_keypair(); ?>
 | |
| 			<tr>
 | |
| 			<th scope="row"><label for="key_pair"><?php _e( 'Key pair', 'gitium' ); ?></label></th>
 | |
| 				<td>
 | |
| 					<p>
 | |
| 					<input type="text" class="regular-text" name="key_pair" id="key_pair" value="<?php echo esc_attr( $git_public_key ); ?>" readonly="readonly">
 | |
| 					<input type="submit" name="GitiumSubmitRegenerateKeypair" class="button" value="<?php _e( 'Regenerate Key', 'gitium' ); ?>" />
 | |
| 					</p>
 | |
| 					<p class="description"><?php _e( 'If your code use ssh keybased authentication for git you need to allow write access to your repository using this key.', 'gitium' ); ?><br />
 | |
| 			<?php _e( 'Checkout instructions for <a href="https://help.github.com/articles/generating-ssh-keys#step-3-add-your-ssh-key-to-github" target="_blank">github</a> or <a href="https://confluence.atlassian.com/display/BITBUCKET/Add+an+SSH+key+to+an+account#AddanSSHkeytoanaccount-HowtoaddakeyusingSSHforOSXorLinux" target="_blank">bitbucket</a>.', 'gitium' ); ?>
 | |
| 					</p>
 | |
| 				</td>
 | |
| 			</tr>
 | |
| 		<?php endif;
 | |
| 	}
 | |
| 
 | |
| 	private function setup_warning() {
 | |
| 		?>
 | |
| 		<div class="wrap">
 | |
| 			<h2><?php _e( 'Warning!', 'gitium' ); ?></h2>
 | |
| 			<form name="gitium_form_warning" id="gitium_form_warning" action="" method="POST">
 | |
| 				<?php wp_nonce_field( 'gitium-admin' ); ?>
 | |
| 				<p><code>wp-content</code> is already under version control. You <a onclick="document.getElementById('gitium_form_warning').submit();" style="color:red;" href="#">must remove it from version control</a> in order to continue.</p>
 | |
| 				<p><strong>NOTE</strong> by doing this you WILL LOSE commit history, but NOT the actual files.</p>
 | |
| 				<input type="hidden" name="GitiumSubmitWarning" class="button-primary" value="1" />
 | |
| 			</form>
 | |
| 		</div>
 | |
| 		<?php
 | |
| 	}
 | |
| 
 | |
| 	private function setup_step_1() {
 | |
| 		?>
 | |
| 		<div class="wrap">
 | |
| 			<h2><?php _e( 'Configuration step 1', 'gitium' ); ?></h2>
 | |
| 			<p><?php _e( 'If you need help to set this up, please click on the "Help" button from the top right corner of this screen.' ); ?></p>
 | |
| 			<form action="" method="POST">
 | |
| 				<?php wp_nonce_field( 'gitium-admin' ); ?>
 | |
| 				<table class="form-table">
 | |
| 					<?php $this->setup_step_1_remote_url(); ?>
 | |
| 					<?php $this->setup_step_1_key_pair(); ?>
 | |
| 				</table>
 | |
| 				<p class="submit">
 | |
| 				<input type="submit" name="GitiumSubmitFetch" class="button-primary" value="<?php _e( 'Fetch', 'gitium' ); ?>" />
 | |
| 				</p>
 | |
| 			</form>
 | |
| 		</div>
 | |
| 		<?php
 | |
| 	}
 | |
| 
 | |
| 	private function setup_step_2() {
 | |
| 		$git = $this->git; ?>
 | |
| 		<div class="wrap">
 | |
| 		<h2><?php _e( 'Configuration step 2', 'gitium' ); ?></h2>
 | |
| 		<p><?php _e( 'If you need help to set this up, please click on the "Help" button from the top right corner of this screen.' ); ?></p>
 | |
| 
 | |
| 
 | |
| 		<form action="" method="POST">
 | |
| 		<?php wp_nonce_field( 'gitium-admin' ); ?>
 | |
| 
 | |
| 		<table class="form-table">
 | |
| 		<tr>
 | |
| 		<th scope="row"><label for="tracking_branch"><?php _e( 'Choose tracking branch', 'gitium' ); ?></label></th>
 | |
| 			<td>
 | |
| 				<select name="tracking_branch" id="tracking_branch">
 | |
| 				<?php foreach ( $git->get_remote_branches() as $branch ) : ?>
 | |
| 					<option value="<?php echo esc_attr( $branch ); ?>"><?php echo esc_html( $branch ); ?></option>
 | |
| 				<?php endforeach; ?>
 | |
| 				</select>
 | |
| 				<p class="description"><?php _e( 'Your code origin is set to', 'gitium' ); ?> <code><?php echo esc_html( $git->get_remote_url() ); ?></code></p>
 | |
| 			</td>
 | |
| 		</tr>
 | |
| 		</table>
 | |
| 
 | |
| 		<p class="submit">
 | |
| 		<input type="submit" name="GitiumSubmitMergeAndPush" class="button-primary" value="<?php _e( 'Merge & Push', 'gitium' ); ?>" />
 | |
| 		</p>
 | |
| 		</form>
 | |
| 		<?php
 | |
| 			$this->show_disconnect_repository_button();
 | |
| 		?>
 | |
| 		</div>
 | |
| 		<?php
 | |
| 	}
 | |
| 
 | |
| 	public function page() {
 | |
| 		$this->show_message();
 | |
| 
 | |
| 		if ( wp_content_is_versioned() ) {
 | |
| 			return $this->setup_warning();
 | |
| 		}
 | |
| 
 | |
| 		if ( ! $this->git->is_status_working() || ! $this->git->get_remote_url() ) {
 | |
| 			return $this->setup_step_1();
 | |
| 		}
 | |
| 
 | |
| 		if ( ! $this->git->get_remote_tracking_branch() ) {
 | |
| 			return $this->setup_step_2();
 | |
| 		}
 | |
| 
 | |
| 		_gitium_status( true );
 | |
| 		gitium_update_is_status_working();
 | |
| 		gitium_update_remote_tracking_branch();
 | |
| 	}
 | |
| }
 |