Skip to content
Snippets Groups Projects
Select Git revision
  • 4913b40380df8b21e7585cc49f3a59fbaa1a2c67
  • main default protected
  • issue-56
  • testing-systems
4 results

merge.php

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    merge.php 3.17 KiB
    <?php
    final class MergeController extends TracToGitlab\GitlabController
    {
        public function before_filter(&$action, &$args)
        {
            parent::before_filter($action, $args);
    
            PageLayout::setTitle(_('Übersicht noch zu portierender Bugfixes'));
            $this->activateNavigation('merge');
        }
    
        public function index_action()
        {
            $data = $this->readFromCache('issues-to-merge', true);
            if ($data === false) {
                $this->issues = $this->fetchIssues();
                $this->writeToCache('issues-to-merge', $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;
        }
    }