• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

eliashaeussler / composer-package-url-generator / 14523277055

17 Apr 2025 07:25PM UTC coverage: 92.308% (-0.5%) from 92.857%
14523277055

Pull #22

github

eliashaeussler
[TASK] Harden check for gitlab-domains
Pull Request #22: [TASK] Update all dependencies

3 of 4 new or added lines in 1 file covered. (75.0%)

132 of 143 relevant lines covered (92.31%)

3.01 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

95.0
/src/Url/Generator/GitLabUrlGenerator.php
1
<?php
2

3
declare(strict_types=1);
4

5
/*
6
 * This file is part of the Composer package "eliashaeussler/composer-package-url-generator".
7
 *
8
 * Copyright (C) 2023-2025 Elias Häußler <elias@haeussler.dev>
9
 *
10
 * This program is free software: you can redistribute it and/or modify
11
 * it under the terms of the GNU General Public License as published by
12
 * the Free Software Foundation, either version 3 of the License, or
13
 * (at your option) any later version.
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
 * GNU General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU General Public License
21
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22
 */
23

24
namespace EliasHaeussler\ComposerPackageUrlGenerator\Url\Generator;
25

26
use Composer\Composer;
27
use GuzzleHttp\Psr7;
28
use Psr\Http\Message;
29

30
use function preg_match;
31
use function sprintf;
32
use function str_replace;
33
use function str_starts_with;
34

35
/**
36
 * GitLabUrlGenerator.
37
 *
38
 * @author Elias Häußler <elias@haeussler.dev>
39
 * @license GPL-3.0-or-later
40
 */
41
final class GitLabUrlGenerator extends VcsUrlGenerator
42
{
43
    /**
44
     * @var non-empty-array<string>
45
     */
46
    private readonly array $domains;
47

48
    public function __construct(Composer $composer)
8✔
49
    {
50
        /** @var array<string> $domains */
51
        $domains = $composer->getPackage()->getConfig()['gitlab-domains'] ?? [];
8✔
52

53
        if ([] === $domains) {
8✔
NEW
54
            $domains = ['gitlab.com'];
×
55
        }
56

57
        $this->domains = $domains;
8✔
58
    }
59

60
    protected function isApiUrl(Message\UriInterface $sourceUrl): bool
4✔
61
    {
62
        return str_starts_with($sourceUrl->getPath(), '/api/v4/');
4✔
63
    }
64

65
    protected function extractSourceUrlFromApiUrl(Message\UriInterface $apiUrl): ?Message\UriInterface
4✔
66
    {
67
        $path = $apiUrl->getPath();
4✔
68

69
        if (1 !== preg_match('#/api/v4/projects/(?<namespace>[^/]+)/repository/archive\.zip$#', $path, $matches)) {
4✔
70
            return null;
2✔
71
        }
72

73
        // https://gitlab.com/api/v4/projects/foo%2Fbaz/repository/archive.zip?sha=b9a16c6d0bc4f591d631a6ceb3c320859ce811c2 => https://gitlab.com/foo/baz
74
        return new Psr7\Uri(
2✔
75
            sprintf(
2✔
76
                'https://%s/%s',
2✔
77
                $apiUrl->getHost(),
2✔
78
                str_replace('%2F', '/', $matches['namespace']),
2✔
79
            ),
2✔
80
        );
2✔
81
    }
82

83
    protected function getDomains(): array
4✔
84
    {
85
        return $this->domains;
4✔
86
    }
87
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc