Skip to content

Commit b39da3d

Browse files
authored
Merge pull request #6940 from pmmp/r5.39.0
R5.39.0
2 parents 745071a + c490841 commit b39da3d

File tree

109 files changed

+3192
-480
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+3192
-480
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
name: Docker image CI
2+
3+
on:
4+
push:
5+
pull_request:
6+
7+
jobs:
8+
build:
9+
runs-on: ubuntu-22.04
10+
11+
steps:
12+
- uses: actions/checkout@v5
13+
with:
14+
submodules: true #needed for build/php submodule
15+
16+
- name: Set up Docker Buildx
17+
uses: docker/setup-buildx-action@v3
18+
19+
- name: Create data directories
20+
run: |
21+
mkdir ./docker/test_data
22+
sudo chown -R 1000:1000 ./docker/testsuite ./docker/test_data
23+
24+
- name: Build image for tag
25+
uses: docker/build-push-action@v6.18.0
26+
with:
27+
context: ${{ github.workspace }}
28+
push: false
29+
load: true
30+
file: ${{ github.workspace }}/docker/Dockerfile
31+
tags: local-pocketmine-mp
32+
build-args: |
33+
GIT_HASH=${{ github.sha }}
34+
cache-from: type=gha
35+
cache-to: type=gha,mode=max
36+
37+
- name: Test if it runs the normal server properly
38+
run: echo stop | docker run --rm -i -e POCKETMINE_ARGS="--settings.enable-dev-builds=1" local-pocketmine-mp
39+
40+
- name: Test if it loads plugins
41+
run: |
42+
echo stop | docker run --rm -i -v ./docker/test_data:/data -v ./docker/testsuite/create-data:/plugins -e POCKETMINE_ARGS="--settings.enable-dev-builds=1" local-pocketmine-mp
43+
test -f ./docker/test_data/plugin_data/data-test/create-data
44+
test "$(cat ./docker/test_data/plugin_data/data-test/create-data)" = "successful"
45+
46+
- name: Test if it persists plugin data
47+
run: echo stop | docker run --rm -i -v ./docker/test_data:/data -v ./docker/testsuite/verify-data:/plugins -e POCKETMINE_ARGS="--settings.enable-dev-builds=1" local-pocketmine-mp

.github/workflows/build-docker-image.yml renamed to .github/workflows/docker-image-publish.yml

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ jobs:
1616
runs-on: ubuntu-22.04
1717

1818
steps:
19+
- uses: actions/checkout@v5
20+
with:
21+
submodules: true #needed for build/php submodule
22+
1923
- name: Set up Docker Buildx
2024
uses: docker/setup-buildx-action@v3
2125

@@ -32,13 +36,6 @@ jobs:
3236
username: ${{ github.actor }}
3337
password: ${{ secrets.GITHUB_TOKEN }}
3438

35-
- name: Clone pmmp/PocketMine-Docker repository
36-
uses: actions/checkout@v6
37-
with:
38-
repository: pmmp/PocketMine-Docker
39-
fetch-depth: 1
40-
41-
4239
- name: Get tag name
4340
id: tag-name
4441
run: |
@@ -73,49 +70,45 @@ jobs:
7370
uses: docker/build-push-action@v6.18.0
7471
with:
7572
push: true
76-
context: ./pocketmine-mp
73+
file: ./docker/Dockerfile
7774
tags: |
7875
${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.TAG_NAME }}
7976
ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.tag-name.outputs.TAG_NAME }}
8077
build-args: |
81-
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
82-
PMMP_REPO=${{ github.repository }}
78+
GIT_HASH=${{ github.sha }}
8379
8480
- name: Build image for major tag
8581
if: steps.channel.outputs.CHANNEL == 'stable'
8682
uses: docker/build-push-action@v6.18.0
8783
with:
8884
push: true
89-
context: ./pocketmine-mp
85+
file: ./docker/Dockerfile
9086
tags: |
9187
${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.version.outputs.MAJOR }}
9288
ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.version.outputs.MAJOR }}
9389
build-args: |
94-
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
95-
PMMP_REPO=${{ github.repository }}
90+
GIT_HASH=${{ github.sha }}
9691
9792
- name: Build image for minor tag
9893
if: steps.channel.outputs.CHANNEL == 'stable'
9994
uses: docker/build-push-action@v6.18.0
10095
with:
10196
push: true
102-
context: ./pocketmine-mp
97+
file: ./docker/Dockerfile
10398
tags: |
10499
${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.version.outputs.MINOR }}
105100
ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:${{ steps.version.outputs.MINOR }}
106101
build-args: |
107-
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
108-
PMMP_REPO=${{ github.repository }}
102+
GIT_HASH=${{ github.sha }}
109103
110104
- name: Build image for latest tag
111105
if: steps.channel.outputs.CHANNEL == 'stable'
112106
uses: docker/build-push-action@v6.18.0
113107
with:
114108
push: true
115-
context: ./pocketmine-mp
109+
file: ./docker/Dockerfile
116110
tags: |
117111
${{ steps.docker-repo-name.outputs.NAME }}:latest
118112
ghcr.io/${{ steps.docker-repo-name.outputs.NAME }}:latest
119113
build-args: |
120-
PMMP_TAG=${{ steps.tag-name.outputs.TAG_NAME }}
121-
PMMP_REPO=${{ github.repository }}
114+
GIT_HASH=${{ github.sha }}

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ memory_dumps/*
1717
resource_packs/
1818
server.lock
1919
/phpstan.neon
20+
/docker/test_data/
2021

2122
# Common IDEs
2223
.idea/*

build/generate-known-translation-apis.php

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,23 @@
2424
namespace pocketmine\build\generate_known_translation_apis;
2525

2626
use pocketmine\lang\Translatable;
27+
use pocketmine\utils\AssumptionFailedError;
2728
use pocketmine\utils\Utils;
2829
use Symfony\Component\Filesystem\Path;
2930
use function array_map;
3031
use function count;
3132
use function dirname;
33+
use function fclose;
3234
use function file_put_contents;
35+
use function fopen;
3336
use function fwrite;
3437
use function implode;
3538
use function is_numeric;
3639
use function ksort;
3740
use function ob_get_clean;
3841
use function ob_start;
3942
use function parse_ini_file;
43+
use function preg_last_error_msg;
4044
use function preg_match_all;
4145
use function str_replace;
4246
use function strtoupper;
@@ -45,6 +49,8 @@
4549
use const SORT_STRING;
4650
use const STDERR;
4751

52+
const PARAMETER_REGEX = '/{%(.+?)}/';
53+
4854
require dirname(__DIR__) . '/vendor/autoload.php';
4955

5056
function constantify(string $permissionName) : string{
@@ -117,6 +123,51 @@ final class KnownTranslationKeys{
117123
echo "Done generating KnownTranslationKeys.\n";
118124
}
119125

126+
/**
127+
* @param string[] $languageDefinitions
128+
* @phpstan-param array<string, string> $languageDefinitions
129+
*/
130+
function generate_known_translation_parameter_info(array $languageDefinitions) : void{
131+
$file = fopen(dirname(__DIR__) . '/src/lang/KnownTranslationParameterInfo.php', 'wb');
132+
if($file === false){
133+
fwrite(STDERR, "Unable to open KnownTranslationParameterInfo file\n");
134+
exit(1);
135+
}
136+
137+
fwrite($file, SHARED_HEADER);
138+
fwrite($file, <<<'HEADER'
139+
use pocketmine\lang\KnownTranslationKeys as Keys;
140+
141+
/**
142+
* This class contains constants for all the translations known to PocketMine-MP as per the used version of pmmp/Language.
143+
* This class is generated automatically, do NOT modify it by hand.
144+
*
145+
* @internal
146+
*/
147+
final class KnownTranslationParameterInfo{
148+
HEADER);
149+
ksort($languageDefinitions, SORT_STRING);
150+
151+
fwrite($file, "\n\tpublic const TABLE = [\n");
152+
foreach(Utils::stringifyKeys($languageDefinitions) as $k => $v){
153+
if(preg_match_all(PARAMETER_REGEX, $v, $matches) === false){
154+
throw new AssumptionFailedError(preg_last_error_msg());
155+
}
156+
$uniqueParameters = [];
157+
foreach($matches[1] as $parameterName){
158+
$uniqueParameters[$parameterName] = $parameterName;
159+
}
160+
fwrite($file, "\t\tKeys::" . constantify($k) . " => [" . implode(", ", array_map(fn(string $s) => "\"$s\"", $uniqueParameters)) . "],\n");
161+
}
162+
fwrite($file, "\t];\n");
163+
164+
fwrite($file, "}\n");
165+
166+
fclose($file);
167+
168+
echo "Done generating KnownTranslationParameterInfo.\n";
169+
}
170+
120171
/**
121172
* @param string[] $languageDefinitions
122173
* @phpstan-param array<string, string> $languageDefinitions
@@ -138,7 +189,7 @@ final class KnownTranslationFactory{
138189
HEADER;
139190
ksort($languageDefinitions, SORT_STRING);
140191

141-
$parameterRegex = '/{%(.+?)}/';
192+
$parameterRegex = PARAMETER_REGEX;
142193

143194
$translationContainerClass = (new \ReflectionClass(Translatable::class))->getShortName();
144195
foreach(Utils::stringifyKeys($languageDefinitions) as $key => $value){
@@ -190,4 +241,5 @@ functionify($key) .
190241
}
191242

192243
generate_known_translation_keys($lang);
244+
generate_known_translation_parameter_info($lang);
193245
generate_known_translation_factory($lang);

build/generate-registry-annotations.php

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
namespace pocketmine\build\update_registry_annotations;
2525

2626
use pocketmine\utils\Utils;
27+
use function array_diff;
28+
use function array_map;
29+
use function array_unshift;
2730
use function basename;
2831
use function class_exists;
2932
use function count;
@@ -64,15 +67,23 @@ function generateMethodAnnotations(string $namespaceName, array $members) : stri
6467
$memberLines = [];
6568
foreach(Utils::stringifyKeys($members) as $name => $member){
6669
$reflect = new \ReflectionClass($member);
67-
while($reflect !== false && $reflect->isAnonymous()){
68-
$reflect = $reflect->getParentClass();
70+
$types = $reflect->getInterfaceNames();
71+
$concreteClass = $reflect;
72+
while($concreteClass !== false && $concreteClass->isAnonymous()){
73+
$concreteClass = $concreteClass->getParentClass();
6974
}
70-
if($reflect === false){
75+
76+
if($concreteClass === false){
7177
$typehint = "object";
72-
}elseif($reflect->getNamespaceName() === $namespaceName){
73-
$typehint = $reflect->getShortName();
7478
}else{
75-
$typehint = '\\' . $reflect->getName();
79+
$types = array_diff($types, $concreteClass->getInterfaceNames());
80+
array_unshift($types, $concreteClass->getName());
81+
$typehint = implode("&", array_map(function(string $class) use ($namespaceName) : string{
82+
$reflect = new \ReflectionClass($class);
83+
return $reflect->getNamespaceName() === $namespaceName ?
84+
$reflect->getShortName() :
85+
'\\' . $reflect->getName();
86+
}, $types));
7687
}
7788
$accessor = mb_strtoupper($name);
7889
$memberLines[$accessor] = sprintf($lineTmpl, $accessor, $typehint);

0 commit comments

Comments
 (0)