UPDATE: There is a new version of this effort.
I needed to modify a local git servers web interface to indicate which revision a remote repo was currently on. This is what happened:
The PHP:
// make sure we have what we need
if( $_SERVER['REQUEST_METHOD'] == 'GET' && !empty($_GET['path'])){
// our return array
$return = array();
// build the git command with the supplied path
$gitCmd = 'git --git-dir='. $_GET['path'] . '.git --work-tree=' . $_GET['path'] . ' rev-parse HEAD';
// configure the connection using the local keys
$connection = ssh2_connect('host.domain.tld', 22, array('hostkey' => 'ssh-rsa'));
// attempt to authenticate
if( ssh2_auth_pubkey_file($connection, 'ssh_user', '/path/to/id_rsa.pub', '/path/to/id_rsa') ){
// capture the return stream, blocking is set to ensure that we have data before we try to read from the stream
$stream = ssh2_exec($connection, $gitCmd);
stream_set_blocking($stream, true);
// $result is the current head revision
$result = stream_get_contents($stream);
// make sure we have something and it's not FALSE
if(!empty($result)){
$return['head'] = $result;
}else{
$return['error'] = 'Error retrieving HEAD of remote repository.';
}
}else{
// fail
$return['error'] = 'SSH Authentication Failed.';
}
// send the data back as a json obj
echo json_encode($return);
}
// done
die();
And the JS:
// update this object with the repos and their paths
var repoObject = {
'repoName.git' : {
'path' : '/path/to/local/repo/'
}
};
// this is our success function
function querySuccess(data){
// if we have errors, display them
if( 'error' in data ){
$('#query_error').text(data.error);
}else{
$('.' + data.head).addClass('currentHead');
}
}
// we run this on document ready for great justice
$(function(){
var repoTitle = $('#project_name').val();
// only check rev if we are within a recognized repo
if ( repoTitle in repoObject) {
var rData = {
'path' : repoObject[repoTitle].path
};
$.ajax({
dataType: 'json',
url: '/get_head.php',
data: rData,
success: function(data){
querySuccess(data);
},
beforeSend: function(){
$('#busy_anim').css('display','inline-block');
},
complete: function(){
$('#busy_anim').css('display','none');
}
});
}
});
You are going to want to ensure that you protect the keys you generate to do this, in this example they are in the web directory only protected by Apache.