Merge pull request #29 from mynetx/show_git_commit
Show Git revision details in right main.php column
This commit is contained in:
commit
f93d1e665b
@ -149,6 +149,21 @@ function PMA_current_version()
|
||||
$('#li_pma_version').append(version_information_message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads Git revision data from ajax for main.php
|
||||
*/
|
||||
function PMA_display_git_revision()
|
||||
{
|
||||
$.get("main.php?token="
|
||||
+ $("input[type=hidden][name=token]").val()
|
||||
+ "&git_revision=1&ajax_request=true", function (data) {
|
||||
if (data.error != "undefined" && data.error) {
|
||||
return;
|
||||
}
|
||||
$(data.message).insertAfter('#li_pma_version');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* for libraries/display_change_password.lib.php
|
||||
* libraries/user_password.php
|
||||
@ -3080,6 +3095,10 @@ $(document).ready(function() {
|
||||
$.getScript('http://www.phpmyadmin.net/home_page/version.js', PMA_current_version);
|
||||
}
|
||||
|
||||
if (typeof is_git_revision != "undefined") {
|
||||
setTimeout(PMA_display_git_revision, 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* Slider effect.
|
||||
*/
|
||||
|
||||
@ -349,6 +349,189 @@ class PMA_Config
|
||||
$this->set('PMA_PHP_STR_VERSION', phpversion());
|
||||
}
|
||||
|
||||
/**
|
||||
* detects if Git revision
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
function isGitRevision()
|
||||
{
|
||||
// caching
|
||||
if (isset($_SESSION['is_git_revision'])) {
|
||||
if ($_SESSION['is_git_revision']) {
|
||||
$this->set('PMA_VERSION_GIT', 1);
|
||||
}
|
||||
return $_SESSION['is_git_revision'];
|
||||
}
|
||||
// find out if there is a .git folder
|
||||
$git_folder = '.git';
|
||||
if (! @file_exists($git_folder)
|
||||
|| ! @file_exists($git_folder . '/config')) {
|
||||
$_SESSION['is_git_revision'] = false;
|
||||
return false;
|
||||
}
|
||||
$_SESSION['is_git_revision'] = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* detects Git revision, if running inside repo
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function checkGitRevision()
|
||||
{
|
||||
// find out if there is a .git folder
|
||||
$git_folder = '.git';
|
||||
if (! @file_exists($git_folder)
|
||||
|| ! @file_exists($git_folder . '/config')) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (! $ref_head = @file_get_contents($git_folder . '/HEAD')) {
|
||||
return;
|
||||
}
|
||||
$branch = false;
|
||||
// are we on any branch?
|
||||
if (strstr($ref_head, '/')) {
|
||||
$ref_head = substr(trim($ref_head), 5);
|
||||
$branch = basename($ref_head);
|
||||
|
||||
if (! $hash = @file_get_contents($git_folder . '/' . $ref_head)) {
|
||||
return;
|
||||
}
|
||||
$hash = trim($hash);
|
||||
} else {
|
||||
$hash = trim($ref_head);
|
||||
}
|
||||
|
||||
if ( !isset($_SESSION['PMA_VERSION_COMMITDATA_' . $hash])) {
|
||||
if (! $commit = @file_get_contents(
|
||||
$git_folder . '/objects/' . substr($hash, 0, 2)
|
||||
. '/' . substr($hash, 2))) {
|
||||
return;
|
||||
}
|
||||
$commit = explode("\0", gzuncompress($commit), 2);
|
||||
$commit = explode("\n", $commit[1]);
|
||||
$_SESSION['PMA_VERSION_COMMITDATA_' . $hash] = $commit;
|
||||
} else {
|
||||
$commit = $_SESSION['PMA_VERSION_COMMITDATA_' . $hash];
|
||||
}
|
||||
|
||||
$author = array('name' => '', 'email' => '', 'date' => '');
|
||||
$committer = array('name' => '', 'email' => '', 'date' => '');
|
||||
|
||||
do {
|
||||
$dataline = array_shift($commit);
|
||||
$datalinearr = explode(' ', $dataline, 2);
|
||||
$linetype = $datalinearr[0];
|
||||
if (in_array($linetype, array('author', 'committer')))
|
||||
{
|
||||
$user = $datalinearr[1];
|
||||
preg_match('/([^<]+)<([^>]+)> ([0-9]+)( [^ ]+)?/', $user, $user);
|
||||
$user2 = array(
|
||||
'name' => trim($user[1]),
|
||||
'email' => trim($user[2]),
|
||||
'date' => date('Y-m-d H:i:s', $user[3]));
|
||||
if (isset($user[4]))
|
||||
{
|
||||
$user2['date'] .= $user[4];
|
||||
}
|
||||
$$linetype = $user2;
|
||||
}
|
||||
}
|
||||
while ($dataline != '');
|
||||
$message = trim(implode(' ', $commit));
|
||||
|
||||
// check if commit exists in Github
|
||||
$is_remote_commit = false;
|
||||
if (isset($_SESSION['PMA_VERSION_REMOTECOMMIT_' . $hash])) {
|
||||
$is_remote_commit = $_SESSION['PMA_VERSION_REMOTECOMMIT_' . $hash];
|
||||
} else {
|
||||
$link = 'https://api.github.com/repos/phpmyadmin/phpmyadmin/git/commits/' . $hash;
|
||||
$is_found = $this->checkHTTP($link);
|
||||
switch($is_found) {
|
||||
case true:
|
||||
$is_remote_commit = true;
|
||||
$_SESSION['PMA_VERSION_REMOTECOMMIT_' . $hash] = true;
|
||||
break;
|
||||
case false:
|
||||
$is_remote_commit = false;
|
||||
$_SESSION['PMA_VERSION_REMOTECOMMIT_' . $hash] = false;
|
||||
break;
|
||||
case null:
|
||||
// no remote link for now, but don't cache this as Github is down
|
||||
$is_remote_commit = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$is_remote_branch = false;
|
||||
if ($is_remote_commit && $branch !== false) {
|
||||
// check if branch exists in Github
|
||||
if (isset($_SESSION['PMA_VERSION_REMOTEBRANCH_' . $hash])) {
|
||||
$is_remote_branch = $_SESSION['PMA_VERSION_REMOTEBRANCH_' . $hash];
|
||||
} else {
|
||||
$link = 'https://api.github.com/repos/phpmyadmin/phpmyadmin/git/trees/' . $branch;
|
||||
$is_found = $this->checkHTTP($link);
|
||||
switch($is_found) {
|
||||
case true:
|
||||
$is_remote_branch = true;
|
||||
$_SESSION['PMA_VERSION_REMOTEBRANCH_' . $hash] = true;
|
||||
break;
|
||||
case false:
|
||||
$is_remote_branch = false;
|
||||
$_SESSION['PMA_VERSION_REMOTEBRANCH_' . $hash] = false;
|
||||
break;
|
||||
case null:
|
||||
// no remote link for now, but don't cache this as Github is down
|
||||
$is_remote_branch = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->set('PMA_VERSION_GIT', 1);
|
||||
$this->set('PMA_VERSION_GIT_COMMITHASH', $hash);
|
||||
$this->set('PMA_VERSION_GIT_BRANCH', $branch);
|
||||
$this->set('PMA_VERSION_GIT_MESSAGE', $message);
|
||||
$this->set('PMA_VERSION_GIT_AUTHOR', $author);
|
||||
$this->set('PMA_VERSION_GIT_COMMITTER', $committer);
|
||||
$this->set('PMA_VERSION_GIT_ISREMOTECOMMIT', $is_remote_commit);
|
||||
$this->set('PMA_VERSION_GIT_ISREMOTEBRANCH', $is_remote_branch);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if given URL is 200 or 404
|
||||
*/
|
||||
function checkHTTP($link)
|
||||
{
|
||||
if (! function_exists('curl_init')) {
|
||||
return null;
|
||||
}
|
||||
$ch = curl_init($link);
|
||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
|
||||
curl_setopt($ch, CURLOPT_NOBODY, 1);
|
||||
curl_setopt($ch, CURLOPT_HEADER, 1);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
|
||||
$data = @curl_exec($ch);
|
||||
if ($data === false) {
|
||||
return null;
|
||||
}
|
||||
$ok = 'HTTP/1.1 200 OK';
|
||||
$notfound = 'HTTP/1.1 404 Not Found';
|
||||
if (substr($data, 0, strlen($ok)) === $ok) {
|
||||
return true;
|
||||
} elseif (substr($data, 0, strlen($notfound)) === $notfound) {
|
||||
return false;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* loads default values from default source
|
||||
*
|
||||
|
||||
71
libraries/display_git_revision.lib.php
Normal file
71
libraries/display_git_revision.lib.php
Normal file
@ -0,0 +1,71 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Displays form for password change
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
if (! defined('PHPMYADMIN')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints details about the current Git commit revision
|
||||
*/
|
||||
function PMA_printGitRevision()
|
||||
{
|
||||
if (! $GLOBALS['PMA_Config']->get('PMA_VERSION_GIT')) {
|
||||
PMA_ajaxResponse('', false);
|
||||
}
|
||||
|
||||
// load revision data from repo
|
||||
$GLOBALS['PMA_Config']->checkGitRevision();
|
||||
|
||||
// if using a remote commit fast-forwarded, link to Github
|
||||
$commit_hash = substr($GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_COMMITHASH'), 0, 7);
|
||||
$commit_hash = '<strong title="'
|
||||
. htmlspecialchars($GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_MESSAGE')) . '">'
|
||||
. $commit_hash . '</strong>';
|
||||
if ($GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_ISREMOTECOMMIT')) {
|
||||
$commit_hash =
|
||||
'<a href="'
|
||||
. PMA_linkURL('https://github.com/phpmyadmin/phpmyadmin/commit/'
|
||||
. $GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_COMMITHASH'))
|
||||
. '" target="_blank">' . $commit_hash . '</a>';
|
||||
}
|
||||
|
||||
$branch = $GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_BRANCH');
|
||||
if ($GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_ISREMOTEBRANCH')) {
|
||||
$branch =
|
||||
'<a href="'
|
||||
. PMA_linkURL('https://github.com/phpmyadmin/phpmyadmin/tree/'
|
||||
. $GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_BRANCH'))
|
||||
. '" target="_blank">' . $branch . '</a>';
|
||||
}
|
||||
if ($branch !== false) {
|
||||
$branch = sprintf(__('%s from %s branch'), $commit_hash, $branch);
|
||||
} else {
|
||||
$branch = $commit_hash . ' (' . __('no branch') . ')';
|
||||
}
|
||||
|
||||
ob_start();
|
||||
PMA_printListItem(__('Git revision') . ': '
|
||||
. $branch . ',<br /> '
|
||||
. sprintf(
|
||||
__('committed on %s by %s'),
|
||||
PMA_localisedDate(strtotime($GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_COMMITTER')['date'])),
|
||||
'<a href="' . PMA_linkURL('mailto:' . $GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_COMMITTER')['email']) . '">'
|
||||
. htmlspecialchars($GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_COMMITTER')['name']) . '</a>')
|
||||
. ($GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_AUTHOR') != $GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_COMMITTER')
|
||||
? ', <br />'
|
||||
. sprintf(
|
||||
__('authored on %s by %s'),
|
||||
PMA_localisedDate(strtotime($GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_AUTHOR')['date'])),
|
||||
'<a href="' . PMA_linkURL('mailto:' . $GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_AUTHOR')['email']) . '">'
|
||||
. htmlspecialchars($GLOBALS['PMA_Config']->get('PMA_VERSION_GIT_AUTHOR')['name']) . '</a>')
|
||||
: ''),
|
||||
'li_pma_version_git', null, null, null);
|
||||
$item = ob_get_contents();
|
||||
ob_end_clean();
|
||||
PMA_ajaxResponse($item, true);
|
||||
}
|
||||
12
main.php
12
main.php
@ -10,6 +10,18 @@
|
||||
*/
|
||||
require_once 'libraries/common.inc.php';
|
||||
|
||||
/**
|
||||
* display Git revision if requested
|
||||
*/
|
||||
require_once 'libraries/display_git_revision.lib.php';
|
||||
|
||||
if ($GLOBALS['PMA_Config']->isGitRevision()) {
|
||||
if (isset($_REQUEST['git_revision']) && $GLOBALS['is_ajax_request'] == true) {
|
||||
PMA_printGitRevision();
|
||||
}
|
||||
PMA_AddJSVar('is_git_revision', true);
|
||||
}
|
||||
|
||||
// Handles some variables that may have been sent by the calling script
|
||||
$GLOBALS['db'] = '';
|
||||
$GLOBALS['table'] = '';
|
||||
|
||||
Loading…
Reference in New Issue
Block a user