Skip to content
Snippets Groups Projects

show open merge requests

4 files
+ 159
0
Compare changes
  • Side-by-side
  • Inline

Files

+ 110
0
 
<?php
 
final class MergerequestsController extends TracToGitlab\GitlabController
 
{
 
public function before_filter(&$action, &$args)
 
{
 
parent::before_filter($action, $args);
 
 
PageLayout::setTitle(_('Merge Requests'));
 
$this->activateNavigation('merge-requests');
 
}
 
 
public function index_action()
 
{
 
$data = $this->readFromCache('merge-requests', true);
 
if ($data === false) {
 
$this->issues = $this->fetchIssues();
 
$this->writeToCache('merge-requests', $this->issues);
 
} else {
 
$this->issues = $data['data'];
 
 
Sidebar::get()->addWidget(new TemplateWidget(
 
'Aus dem Cache',
 
$this->get_template_factory()->open(
 
$this->get_default_template('sidebar')
 
),
 
['time' => time()]
 
));
 
}
 
}
 
 
public function diff_action($mr_iid)
 
{
 
// $versions = $this->gitlab->mergeRequests()->
 
}
 
 
private function fetchIssues(): array
 
{
 
$issues = $this->gitlabPager->fetchAll(
 
$this->gitlab->issues(),
 
'all',
 
[
 
$this->gitlabProjectId,
 
[
 
'sort' => 'asc',
 
'scope' => 'all',
 
'milestone' => 'None',
 
'labels' => 'BIEST',
 
'state' => 'closed',
 
]
 
]
 
);
 
 
$issues = array_filter($issues, function ($issue) {
 
if ($issue['confidential']) {
 
return false;
 
}
 
 
foreach (['worksforme', 'wontfix', 'Duplicate', 'invalid'] as $label) {
 
if (in_array($label, $issue['labels'])) {
 
return false;
 
}
 
}
 
 
$has_version = array_reduce($issue['labels'], function ($has_version, $label) {
 
return $has_version || strpos($label, 'Version::') === 0;
 
}, false);
 
return $has_version;
 
});
 
 
$issues = array_map(function ($issue) {
 
$issue['studip_version'] = $this->extractVersion($issue['labels']);
 
$issue['mr'] = $this->fetchRelatedMergeRequest($issue['iid']);
 
return $issue;
 
}, $issues);
 
 
usort($issues, function ($a, $b) {
 
return strcmp($b['studip_version'], $a['studip_version']);
 
});
 
 
return $issues;
 
}
 
 
private function fetchRelatedMergeRequest(int $issue_id)
 
{
 
$mrs = $this->gitlab->issues()->closedByMergeRequests(
 
$this->gitlabProjectId,
 
$issue_id
 
);
 
foreach ($mrs as $mr) {
 
if ($mr['state'] === 'merged') {
 
return $mr['iid'];
 
}
 
}
 
return null;
 
}
 
 
private function extractVersion(array $labels): string
 
{
 
$version = '';
 
foreach ($labels as $label) {
 
if (strpos($label, 'Version::') === 0) {
 
$v = substr($label, 9);
 
if (!$version || $v < $version) {
 
$version = $v;
 
}
 
}
 
}
 
return $version;
 
}
 
}
Loading