setting local repo location, keys etc' ); ?> create or clone a repo' ); ?> show changed/staged files' ); ?> history of commits' ); ?> push to remote repo' ); ?>

createRsaKey( 2048 ); // create private key file_put_contents( $gitpath . "/id_rsa", $privatekey ); chmod( $gitpath . "/id_rsa", 0700 ); // create public key file_put_contents( $gitpath . "/id_rsa.pub", $publickey ); chmod( $gitpath . "/id_rsa.pub", 0700 ); } // return public key echo "\n\n" . file_get_contents( $gitpath . "/id_rsa.pub" ) . "\n\n"; die(); } protected function git_open_repo() { // check the user has the permissions IDE::check_perms(); // errors need to be on while experimental error_reporting( E_ALL ); ini_set( "display_errors", 1 ); $root = apply_filters( 'aceide_filesystem_root', WP_CONTENT_DIR ); $root = trailingslashit($root); // check repo path entered or die if ( ! strlen( $_POST['gitpath'] ) ) { die( __( "Error: Path to your git repository is required! (see settings)" ) ); } $this->git_repo_path = $root . sanitize_text_field( $_POST['gitpath'] ); $gitbinary = sanitize_text_field( stripslashes( $_POST['gitbinary'] ) ); /* if ( $gitbinary==="I'll guess.." ) { // the binary path $thebinary = TQ\Git\Cli\Binary::locateBinary(); $this->git = TQ\Git\Repository\Repository::open( $this->git_repo_path, new TQ\Git\Cli\Binary( $thebinary ), 0755 ); } else { $thebinary = $_POST['gitbinary']; $this->git = TQ\Git\Repository\Repository::open( $this->git_repo_path, new TQ\Git\Cli\Binary( $thebinary ), 0755 ); } */ } public function git_status() { // check the user has the permissions IDE::check_perms(); $this->git_open_repo(); // make sure git repo is open // echo branch $branch = $this->git->getCurrentBranch(); echo '

' . __( 'Current branch:' ) . ' ' . $branch . '

'; // [0] => Array // ( // [file] => AceIDE.php // [x] => // [y] => M // [renamed] => // ) $status = $this->git->getStatus(); $i = 0;// row counter if ( count( $status ) ) { // echo out rows of staged files foreach ( $status as $item ) { echo '
{$item["file"]} [view diff]
'; $i++; } } else { echo '

' . __( 'No changed files in this repo so nothing to commit.' ) . '

'; } // output the commit message box echo '

' . __( 'Commit the staged changes' ) . '

'; die(); // this is required to return a proper result } public function git_log() { // check the user has the permissions IDE::check_perms(); $this->git_open_repo(); // make sure git repo is open $log = $this->git->getLog(50); echo '
'; foreach ( $log as $item ) { $matches = array(); $log_array = array(); $bits = explode( "\n", $item ); foreach ( $bits as $bit ) { if ( preg_match_all( "#(.*): (.*)#iS", trim( $bit ), $matches ) ) { $key = $matches[1][0]; if ( is_string( $key ) && trim( $key ) !== "" ) { $log_array[$key] = trim( $matches[2][0] ); } } } $message = explode( end( $log_array ), $item ); $commit = explode( reset( $log_array ), $item ); $log_array['message'] = trim( $message[2] ); $log_array['commit'] = trim( str_replace( array( "commit ", "Author:" ), "", $commit[0] ) ); echo ''; echo "{$log_array['message']} {$log_array['AuthorDate']} ID: {$log_array['commit']} "; echo ""; } echo "
"; die(); // this is required to return a proper result } public function git_init() { // check the user has the permissions IDE::check_perms(); $this->git_open_repo(); // make sure git repo is open // create the local repo path if it doesn't exist if ( ! file_exists( $this->git->getRepositoryPath() ) ) { mkdir( $this->git->getRepositoryPath() ); } $result = $this->git->getBinary()->{'init'}( $this->git->getRepositoryPath(), array( // What do we put here? ) ); // return $result->getStdOut(); // still not getting enough output from the push... if ( $result->getStdErr() === '' ) { echo $result->getStdOut(); } else { echo $result->getStdErr(); } die(); // this is required to return a proper result } public function git_clone() { // check the user has the permissions IDE::check_perms(); $this->git_open_repo(); // make sure git repo is open // just incase it's a private repo we will setup the keys $sshpath = preg_replace( "#/$#", "", $_POST['sshpath'] ); // get path replacing end slash if entered putenv( 'GIT_SSH=' . plugin_dir_path( __FILE__ ) . 'git-wrapper-nohostcheck.sh' ); // tell Git about our wrapper script /* See note on git_push re wrapper */ putenv( 'ACEIDE_SSH_PATH=' . $sshpath ); // no trailing slash - pass wp-content path to Git wrapper script putenv( 'HOME='. plugin_dir_path( __FILE__ ) . 'git' ); // no trailing slash - set home to the git directory (this may not be needed) if ( $_POST['repo_path'] === '' || is_null( $_POST['repo_path'] ) ) { echo ' ' . __( 'It will be cloned into the repository path/folder defined in the Git settings.' ) . '

' . __( 'Clone' ) . '

'; die(); } $path = sanitize_text_field( $_POST['repo_path'] ); // create the local repo path if it doesn't exist if ( ! file_exists( $this->git->getRepositoryPath() ) ) { mkdir( $this->git->getRepositoryPath() ); } $result = $this->git->getBinary()->{'clone'}( $this->git->getRepositoryPath(), array ( $path, $this->git->getRepositoryPath(), '--recursive' ) ); // return $result->getStdOut(); // still not getting enough output from the push... if ( $result->getStdErr() === '' ) { $result = $result->getStdOut(); // format the output a little better $result = str_replace( '...', '...
', $result ); echo $result; } else { echo $result->getStdErr(); } die(); // this is required to return a proper result } public function git_push() { // check the user has the permissions IDE::check_perms(); $this->git_open_repo(); // make sure git repo is open $sshpath = preg_replace( "#/$#", "", $_POST['sshpath'] ); // get path replacing end slash if entered putenv( 'GIT_SSH=' . plugin_dir_path( __FILE__ ) . 'git-wrapper-nohostcheck.sh' ); // tell Git about our wrapper script /* The wrapper we use above doesn't do a host check which means we can't guarentee the other side is who we think it is We have this other wrapper which does a host check which we should swap to after the initial push/connection has been made and the entry automatically added to known hosts but that logic isn't in place yet. putenv("GIT_SSH=". plugin_dir_path(__FILE__) . 'git/git-wrapper.sh'); */ putenv( 'ACEIDE_SSH_PATH=' . $sshpath ); // no trailing slash - pass wp-content path to Git wrapper script putenv( 'HOME=' . plugin_dir_path( __FILE__ ) . 'git' ); // no trailing slash - set home to the git directory (this may not be needed) echo '
';
		$push_result = $this->git->push();
		echo '
'; if ( $push_result === '' ) { echo __( "Sucessfully pushed to your remote repo" ); } else { echo $push_result; } echo __( "

Git push completed.

" ); die(); // this is required to return a proper result } public function git_diff() { // check the user has the permissions IDE::check_perms(); $this->git_open_repo(); // make sure git repo is open $file = sanitize_text_field( base64_decode( $_POST['file']) ); $result = $this->git->getBinary()->{'diff'}( $this->git->getRepositoryPath(), array ( $file )); // return $result->getStdOut(); // still not getting enough output from the push... if ( $result->getStdErr() === '' ) { $diff_lines = explode( "\n", $result->getStdOut() ); foreach ( $diff_lines as $a_line ) { if ( preg_match( "#^\+#", $a_line ) ) { $a_class = 'plus'; } elseif ( preg_match("#^\-#", $a_line ) ) { $a_class = 'minus'; } else { $a_class = ''; } echo "{$a_line}"; } } else { echo $result->getStdErr(); } echo '' . __( 'Diff' ) . '' . $diff_table; die(); // this is required to return a proper result } public function git_commit() { // check the user has the permissions IDE::check_perms(); $this->git_open_repo(); // make sure git repo is open $userinfo = wp_get_current_user(); // committer name, shows under author on github putenv( sprintf( "GIT_COMMITTER_NAME=%s %s", $userinfo->user_firstname, $userinfo->user_lastname ) ); // committer email address putenv( sprintf( "GIT_COMMITTER_EMAIL=%s", $userinfo->user_email ) ); $files = array(); foreach ( $_POST['files'] as $file ) { $files[] = base64_decode( $file ); } // get the current user to be used for the commit $current_user = wp_get_current_user(); $this->git->add( $files ); $this->git->commit( sanitize_text_field( stripslashes( $_POST['gitmessage'] ) ) , $files, "{$current_user->user_firstname} {$current_user->user_lastname} <{$current_user->user_email}>" ); // output our status $this->git_status(); die(); // this is required to return a proper result } private function createRsaKey( $size ) { $config = array(); $rsa = openssl_pkey_new( array_merge( array ( 'private_key_bits' => $size ), $config ) ); openssl_pkey_export($rsa, $privatekeystr, null, $config); $publickeyarr = openssl_pkey_get_details($rsa); return array ( 'privatekey' => $privatekeystr, 'publickey' => $publickeyarr['key'] ); } }