268 lines
9.6 KiB
PHP
268 lines
9.6 KiB
PHP
<?php
|
|
|
|
/*
|
|
Plugin Name: Gitlab REST API Shortcodes
|
|
Plugin URI: http://tk-sls.de/ref/gitlab-list-commits
|
|
Description: Summary: Embed list of most recent commits to a Gitlab project from a Gitlab instance's public REST API. Example: Add [gitlab-list-commits url=https://tk-sls.de/gitlab project_id=42 commits="all" since="3 month" max=5 releases="latest"] for a list of at most 5 commits to that project that were made since at most 3 months ago, followed by alink to the latest release of the project (if any). To disable the list of commits, set commits="none". To generate a list of all releases, set releases="all". To disable the list of releases, omit the "releases" attribute or set releases="none".
|
|
Author: Tilman Kranz
|
|
Version: 1.4
|
|
Author URI: https://tk-sls.de
|
|
*/
|
|
|
|
class LinuxfooGitlab {
|
|
public function __construct() {
|
|
}
|
|
|
|
static function load_textdomain() {
|
|
load_plugin_textdomain('linuxfoo-gitlab', false, dirname(plugin_basename(__FILE__)).'/lang');
|
|
}
|
|
|
|
static function css() {
|
|
wp_enqueue_style('linuxfoo_gitlab_css', plugins_url('styles.css', __FILE__ ), '', '1.4' );
|
|
}
|
|
|
|
static function error ( $msg ) {
|
|
return
|
|
'<span class="error">'.
|
|
$msg.
|
|
'</span>';
|
|
}
|
|
|
|
static function format_since($since) {
|
|
preg_match('/^([0-9]+)\s+(.*)$/', $since, $m);
|
|
$num = $m[1];
|
|
$unit = $m[2];
|
|
|
|
if($unit=='days') {
|
|
$unit = __('days', 'linuxfoo-gitlab');
|
|
}
|
|
elseif($unit=='months') {
|
|
$unit = __('months', 'linuxfoo-gitlab');
|
|
}
|
|
elseif($unit=='years') {
|
|
$unit = __('years', 'linuxfoo-gitlab');
|
|
}
|
|
|
|
/* translators: %d: count, %s unit of time interval*/
|
|
return sprintf(__('since %d %s ago', 'linuxfoo-gitlab'), $num, $unit);
|
|
}
|
|
|
|
static function format_commit($atts, $commit) {
|
|
preg_match('/^....-..-../', $commit->committed_date, $m);
|
|
$date = $m[0];
|
|
|
|
$title = htmlspecialchars($commit->title, ENT_NOQUOTES|ENT_HTML5|ENT_SUBSTITUTE, 'UTF-8', FALSE);
|
|
|
|
return
|
|
$date.' '.
|
|
__('by', 'linuxfoo-gitlab').' '.$commit->author_name.
|
|
': '.
|
|
'<a href="'.$commit->web_url.'">'.$commit->short_id.'</a> '.$title;
|
|
}
|
|
|
|
static function format_commit_stats($atts, $commits_count, $branch) {
|
|
return
|
|
(
|
|
($commits_count==0)
|
|
? __('No commits', 'linuxfoo-gitlab')
|
|
/* translators: %d: maximum number of commits displayed */
|
|
: sprintf(__('Last %d commits', 'linuxfoo-gitlab'), $commits_count)
|
|
).
|
|
(is_null($branch) ? '' : ' '.__('in branch', 'linuxfoo-gitlab').' "'.$branch.'"').
|
|
(is_null($atts['since']) ? '' : ' '.self::format_since($atts['since'])).':';
|
|
}
|
|
|
|
static function commits_list($atts, $project_url) {
|
|
$since = null;
|
|
|
|
if($atts['commits']=='none') {
|
|
return '';
|
|
}
|
|
elseif(!is_null($atts['commits']) && $atts['commits']!='all') {
|
|
return self::error(__('Invalid value for parameter "commits".', 'linuxfoo-gitlab'));
|
|
}
|
|
elseif(!is_null($atts['since'])) {
|
|
if(!preg_match('/^[1-9][0-9]*\s+(days|months|years)$/', $atts['since'])) {
|
|
return self::error(__('Invalid value for parameter "since".', 'linuxfoo-gitlab'));
|
|
}
|
|
else {
|
|
$since = date(DATE_ISO8601, strtotime('-'.$atts['since']));
|
|
}
|
|
}
|
|
|
|
$out = '';
|
|
|
|
$commits_url = $project_url.'/repository/commits?';
|
|
|
|
if(!is_null($since)) {
|
|
$commits_url .= '&since='.$since;
|
|
}
|
|
|
|
if(!is_null($atts['ref_name'])) {
|
|
$commits_url .= '&ref_name='.$atts['ref_name'];
|
|
$branch = $atts['ref_name'];
|
|
}
|
|
elseif(!is_null($atts['default_branch'])) {
|
|
$commits_url .= '&ref_name='.$project->default_branch;
|
|
$branch = $project->default_branch;
|
|
}
|
|
else {
|
|
$branch = null;
|
|
}
|
|
|
|
$commits_json = file_get_contents($commits_url);
|
|
|
|
if(is_null($commits_json)) {
|
|
$out .= self::error(__('Commits URL not reachable.', 'linuxfoo-gitlab'));
|
|
}
|
|
else {
|
|
$commits = json_decode($commits_json);
|
|
|
|
if(is_null($commits)) {
|
|
$out .= self::error(__('Commits information not readable.', 'linuxfoo-gitlab'));
|
|
}
|
|
else {
|
|
$commits_count = count($commits);
|
|
$commits_count = is_null($atts['max']) ? $commits_count : min($commits_count, $atts['max']);
|
|
$commits = array_slice($commits, 0, $commits_count);
|
|
|
|
$out .=
|
|
'<span class="stats">'.
|
|
self::format_commit_stats($atts, $commits_count, $branch).
|
|
'</span>';
|
|
|
|
if($commits_count>0) {
|
|
$out .= '<ul class="commits">';
|
|
|
|
foreach($commits as $commit) {
|
|
$out .= '<li>'.self::format_commit($atts, $commit).'</li>';
|
|
}
|
|
|
|
$out .= '</ul>';
|
|
}
|
|
}
|
|
}
|
|
|
|
return $out;
|
|
}
|
|
|
|
static function releases_list($atts, $project_url) {
|
|
$out = '';
|
|
|
|
if(is_null($atts['releases']) || $atts['releases']=='none') {
|
|
$out .= '';
|
|
}
|
|
elseif(!preg_match('/^(all|latest)$/', $atts['releases'])) {
|
|
$out .= self::error(__('Invalid value for parameter "releases".', 'linuxfoo-gitlab'));
|
|
}
|
|
else {
|
|
$releases_url = $project_url.'/releases?';
|
|
$releases_json = file_get_contents($releases_url);
|
|
|
|
if(is_null($releases_json)) {
|
|
$out .= self::error(__('Releases URL not reachable.', 'linuxfoo-gitlab'));
|
|
}
|
|
else {
|
|
$releases = json_decode($releases_json);
|
|
|
|
if(is_null($releases)) {
|
|
$out .= self::error(__('Releases information not readable.', 'linuxfoo-gitlab'));
|
|
}
|
|
else {
|
|
if(count($releases)==0) {
|
|
$out .=
|
|
'<p class="releases">'.
|
|
__('This project has currently no releases.', 'linuxfoo-gitlab').
|
|
'</p>';
|
|
}
|
|
elseif($atts['releases']=='latest') {
|
|
$out .=
|
|
'<p class="releases">'.
|
|
__('Latest release', 'linuxfoo-gitlab').': '.
|
|
'<a href="'.$releases[0]->_links->self.'">'.$releases[0]->name.'</a>'.
|
|
'</p>';
|
|
}
|
|
elseif($atts['releases']=='all') {
|
|
$out .=
|
|
'<p class="releases">'.
|
|
__('Releases', 'linuxfoo-gitlab').': '.
|
|
'</p>'.
|
|
'<ul class="releases">';
|
|
|
|
foreach($releases as $release) {
|
|
$out .=
|
|
'<li>'.
|
|
'<a href="'.$release->_links->self.'">'.$release->name.'</a>'.
|
|
'</li>';
|
|
}
|
|
|
|
$out .= '</ul>';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $out;
|
|
}
|
|
|
|
static function list_commits($atts, $content, $tag) {
|
|
return self::show_project($atts, $content, $tag);
|
|
}
|
|
|
|
static function show_project($atts, $content, $tag) {
|
|
global $post;
|
|
|
|
$out = '<div class="linuxfoo_gitlab">';
|
|
|
|
if(
|
|
is_null($atts['url']) ||
|
|
is_null($atts['project_id'])
|
|
) {
|
|
$out .= self::error(__('Required parameter missing.', 'linuxfoo-gitlab'));
|
|
}
|
|
elseif(!preg_match('/^[1-9][0-9]*$/', $atts['project_id'])) {
|
|
$out .= self::error(__('Invalid value for parameter "project_id".', 'linuxfoo-gitlab'));
|
|
}
|
|
elseif(!filter_var($atts['url'], FILTER_VALIDATE_URL)) {
|
|
$out .= self::error(__('Invalid value for parameter "url".', 'linuxfoo-gitlab'));
|
|
}
|
|
elseif(!preg_match('/^[1-9][0-9]*$/', $atts['project_id'])) {
|
|
$out .= self::error(__('Invalid value for parameter "project_id".', 'linuxfoo-gitlab'));
|
|
}
|
|
else {
|
|
$project_url = $atts['url'].'/api/v4/projects/'.$atts['project_id'];
|
|
$project_json = file_get_contents($project_url);
|
|
|
|
if(is_null($project_json)) {
|
|
$out .= self::error(__('Project URL not reachable.', 'linuxfoo-gitlab'));
|
|
}
|
|
else {
|
|
$project = json_decode($project_json);
|
|
|
|
if(is_null($project)) {
|
|
$out .= self::error('Project information not readable.');
|
|
}
|
|
else {
|
|
$out .=
|
|
'<span class="project_header">'.
|
|
__('Gitlab project', 'linuxfoo-gitlab').' '.
|
|
'<a href="'.$project->web_url.'">'.$project->name.'</a>'.
|
|
'</span>';
|
|
|
|
$out .= self::commits_list($atts, $project_url);
|
|
$out .= self::releases_list($atts, $project_url);
|
|
}
|
|
}
|
|
}
|
|
|
|
$out .= '</div>';
|
|
|
|
return $out;
|
|
}
|
|
}
|
|
|
|
add_action('plugins_loaded', 'LinuxfooGitlab::load_textdomain');
|
|
add_action('wp_enqueue_scripts', 'LinuxfooGitlab::css' );
|
|
add_shortcode('gitlab-list-commits', 'LinuxfooGitlab::list_commits');
|
|
add_shortcode('gitlab-show-project', 'LinuxfooGitlab::show_project');
|