-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathApplication.php
More file actions
74 lines (63 loc) · 2.09 KB
/
Copy pathApplication.php
File metadata and controls
74 lines (63 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
declare(strict_types=1);
namespace DockerBase\Dependency;
use DockerBase\Command\Runner;
final readonly class Application
{
public function __construct(
private Catalog $catalog,
private Dockerfile $dockerfile,
private Resolver $resolver,
private Selector $selector,
) {
}
public static function create(Runner $runner, Fetcher $fetcher): self
{
$catalog = Catalog::create();
return new self(
$catalog,
new Dockerfile(),
new Resolver($runner, $fetcher),
new Selector(),
);
}
public function plan(string $content): Plan
{
$dependencies = $this->catalog->dependencies();
$pins = $this->dockerfile->pins($content, $this->catalog);
$expected = 1 + (count($dependencies) * 2);
if (count($pins) !== $expected) {
throw new Exception(
'Every dependency must pin a version and a reference',
);
}
$digest = $this->resolver->digest();
$selected = [$digest];
$changes = [new Change($pins[0]->name, $pins[0]->current, $digest)];
foreach ($dependencies as $index => $dependency) {
$version = $pins[($index * 2) + 1];
$reference = $pins[($index * 2) + 2];
$current = new Release($version->current, $reference->current);
$releases = $this->resolver->releases($dependency);
$release = $this->selector->select($current, $releases);
$resolved = $this->resolver->reference(
$dependency,
$release->version,
$releases,
);
$selected[] = $release->version;
$selected[] = $resolved;
$changes[] = new Change(
$dependency->name,
$current->version,
$release->version,
$reference->current,
$resolved,
);
}
return new Plan(
$this->dockerfile->replace($content, $pins, $selected),
$changes,
);
}
}