Skip to content
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/actions/verify-generated-files/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ runs:
ext/tokenizer/tokenizer_data_gen.php
build/gen_stub.php -f --generate-optimizer-info --verify
ext/phar/makestub.php
.github/scripts/download-bundled/make-workflow-file.php
.github/scripts/test-directory-unchanged.sh .
1 change: 1 addition & 0 deletions .github/scripts/download-bundled/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
!*.patch
41 changes: 41 additions & 0 deletions .github/scripts/download-bundled/boost-context.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/bin/sh
set -ex
cd "$(dirname "$0")/../../.."

tmp_dir=/tmp/php-src-download-bundled/boost-context
rm -rf "$tmp_dir"

revision=refs/tags/boost-1.86.0

git clone --depth 1 --revision="$revision" https://github.com/boostorg/context.git "$tmp_dir"

rm -rf Zend/asm
cp -R "$tmp_dir"/src/asm Zend/asm

cd Zend/asm

# remove unneeded files
rm jump_arm_aapcs_pe_armasm.asm
rm jump_i386_ms_pe_clang_gas.S
rm jump_i386_ms_pe_gas.asm
rm jump_i386_x86_64_sysv_macho_gas.S
rm jump_ppc32_ppc64_sysv_macho_gas.S
rm jump_x86_64_ms_pe_clang_gas.S
rm make_arm_aapcs_pe_armasm.asm
rm make_i386_ms_pe_clang_gas.S
rm make_i386_ms_pe_gas.asm
rm make_i386_x86_64_sysv_macho_gas.S
rm make_ppc32_ppc64_sysv_macho_gas.S
rm make_x86_64_ms_pe_clang_gas.S
rm ontop_*.S
rm ontop_*.asm
rm tail_ontop_ppc32_sysv.cpp

# move renamed files
# GH-13896 introduced these 2 files named as .S but since https://github.com/boostorg/context/pull/265 they are named as .asm
mv jump_x86_64_ms_pe_gas.asm jump_x86_64_ms_pe_gas.S
mv make_x86_64_ms_pe_gas.asm make_x86_64_ms_pe_gas.S

# add extra files
git restore LICENSE
git restore save_xmm_x86_64_ms_masm.asm # added in GH-18352, not an upstream boost.context file
206 changes: 206 additions & 0 deletions .github/scripts/download-bundled/make-workflow-file.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
#!/usr/bin/env php
<?php

declare(strict_types=1);

namespace Phpsrc\Ci\DownloadBundled;

$bundles = [
new Bundle('boost.context', ['Zend/asm']),
new Bundle('PCRE2', ['ext/pcre/pcre2lib']),
new Bundle('uriparser', ['ext/uri/uriparser']),
];

class Bundle
{
/**
* @param list<string> $directories
*/
public function __construct(
public string $name,
public array $directories
) {}

public function getNameForPath(): string
{
return preg_replace('~\W+~', '-', strtolower($this->name));
}
}

class Generator
{
/**
* @param list<Bundle> $bundles
*/
public function __construct(
public array $bundles
) {}

protected function getRepoDirectory(): string
{
return dirname(__DIR__, 3);
}

protected function indentString(string $value, int $levels, bool $inclFirstLine): string
{
return preg_replace(
'~' . ($inclFirstLine ? '^|' : '') . '(?<=\n)~',
str_repeat(' ', $levels),
$value
);
}

/**
* @param mixed $data
*/
protected function encodeYml($data): string
{
if (is_array($data)) {
$isList = array_is_list($data);
$resParts = [];
foreach ($data as $k => $v) {
$kEncoded = $isList
? '-'
: $this->encodeYml($k) . ':';
$vEncoded = $this->encodeYml($v);

$resParts[] = $kEncoded
. (!$isList && is_array($v) && $v !== [] ? "\n " : ' ')
. (is_array($v) ? $this->indentString($vEncoded, 1, false) : $vEncoded);
}

return implode("\n", $resParts);
}

if (preg_match('~^(\w+|\$\{\{[^\}]+\}\})$~', $data)) {
return $data;
}

return strpos($data, "\n") !== false
? '|' . "\n" . $this->indentString($data, 1, true)
: '\'' . str_replace('\'', '\'\'', $data) . '\'';
}

public function makeWorkflowFile(): void
{
$content = <<<'EOD'
name: Verify Bundled Files

on:
push:
paths: &paths
%paths%
pull_request:
paths: *paths
schedule:
- cron: "0 1 * * *"
workflow_dispatch: ~

permissions:
contents: read

jobs:
VERIFY_BUNDLED_FILES:
name: Verify Bundled Files
runs-on: ubuntu-24.04
steps:
- name: git checkout
uses: actions/checkout@v5

- name: Detect changed files
uses: dorny/paths-filter@v3
id: changes
with:
filters: %filters%

%steps%

EOD;

$paths = [
'.github/scripts/download-bundled/**',
];
foreach ($this->bundles as $bundle) {
foreach ($this->makeDornyPathsFilterFilters($bundle) as $p) {
if (str_starts_with($p, '.github/scripts/download-bundled/')) {
continue;
}

$paths[] = $p;
}
}
$content = str_replace('%paths%', $this->indentString($this->encodeYml($paths), 3, false), $content);

$filters = [];
foreach ($this->bundles as $bundle) {
$filters[$bundle->getNameForPath()] = $this->makeDornyPathsFilterFilters($bundle);
}
$content = str_replace('%filters%', $this->indentString($this->encodeYml($this->encodeYml($filters)), 5, false), $content);

$steps = [];
foreach ($this->bundles as $bundle) {
$steps[] = [
'name' => $bundle->name,
'if' => '${{ !cancelled() && (steps.changes.outputs.pcre2 == \'true\' || github.event_name == \'schedule\' || github.event_name == \'workflow_dispatch\') }}',
'run' => implode("\n", [
'echo "::group::Download"',
'.github/scripts/download-bundled/' . $bundle->getNameForPath() . '.sh',
'echo "::endgroup::"',
'echo "::group::Verify files"',
...array_map(static fn ($v) => '.github/scripts/test-directory-unchanged.sh \'' . $v . '\'', $bundle->directories),
'echo "::endgroup::"',
]),
];
}
$content = str_replace('%steps%', $this->indentString($this->encodeYml($steps), 3, false), $content);

file_put_contents($this->getRepoDirectory() . '/.github/workflows/verify-bundled-files.yml', $content);
}

protected function makeDornyPathsFilterFilters(Bundle $bundle): array
{
return [
'.github/scripts/download-bundled/' . $bundle->getNameForPath() . '.*',
...array_map(static fn ($v) => $v . '/**', $bundle->directories),
];
}

public function makeDownloadScriptHeaders(): void
{
foreach ($this->bundles as $bundle) {
$this->makeDownloadScriptHeader($bundle);
}
}

protected function makeDownloadScriptHeader(Bundle $bundle): void
{
$scriptPath = $this->getRepoDirectory() . '/.github/scripts/download-bundled/' . $bundle->getNameForPath() . '.sh';

$content = !file_exists($scriptPath)
? "# TODO\n"
: file_get_contents($scriptPath);

$header = <<<'EOD'
#!/bin/sh
set -ex
cd "$(dirname "$0")/../../.."

tmp_dir=%tmp_dir%
rm -rf "$tmp_dir"


EOD;

$header = str_replace('%tmp_dir%', '/tmp/php-src-download-bundled/' . $bundle->getNameForPath(), $header);

if (!str_starts_with($content, $header)) {
$content = $header . $content;
}

file_put_contents($scriptPath, $content);
}
}

$generator = new Generator($bundles);
$generator->makeWorkflowFile();
$generator->makeDownloadScriptHeaders();
7 changes: 5 additions & 2 deletions .github/scripts/download-bundled/pcre2.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@
set -ex
cd "$(dirname "$0")/../../.."

tmp_dir=/tmp/php-src-download-bundled/pcre2
rm -rf "$tmp_dir"

revision=refs/tags/pcre2-10.44

git clone --depth 1 --recurse-submodules --revision="$revision" https://github.com/PCRE2Project/pcre2.git /tmp/php-src-bundled/pcre2
git clone --depth 1 --recurse-submodules --revision="$revision" https://github.com/PCRE2Project/pcre2.git "$tmp_dir"

rm -rf ext/pcre/pcre2lib
cp -R /tmp/php-src-bundled/pcre2/src ext/pcre/pcre2lib
cp -R "$tmp_dir"/src ext/pcre/pcre2lib

cd ext/pcre/pcre2lib

Expand Down
14 changes: 14 additions & 0 deletions .github/scripts/download-bundled/uriparser.config.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
diff --git a/ext/uri/uriparser/src/UriConfig.h b/ext/uri/uriparser/src/UriConfig.h
index b9a85a8..ab78b96 100644
--- a/ext/uri/uriparser/src/UriConfig.h
+++ b/ext/uri/uriparser/src/UriConfig.h
@@ -41,7 +41,9 @@

# define PACKAGE_VERSION "@PROJECT_VERSION@"

+/*
#cmakedefine HAVE_WPRINTF
#cmakedefine HAVE_REALLOCARRAY
+*/

#endif /* !defined(URI_CONFIG_H) */
24 changes: 24 additions & 0 deletions .github/scripts/download-bundled/uriparser.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/bin/sh
set -ex
cd "$(dirname "$0")/../../.."

tmp_dir=/tmp/php-src-download-bundled/uriparser
rm -rf "$tmp_dir"

revision=c3b49569f1f25550a16d9a18207e498d77458b27 # refs/tags/uriparser-0.9.9 with https://github.com/uriparser/uriparser/pull/276

git clone --depth 1 --revision="$revision" https://github.com/uriparser/uriparser.git "$tmp_dir"

rm -rf ext/uri/uriparser
mkdir ext/uri/uriparser
cp -R "$tmp_dir"/src ext/uri/uriparser
cp -R "$tmp_dir"/include ext/uri/uriparser
cp "$tmp_dir"/COPYING.BSD-3-Clause ext/uri/uriparser

cd ext/uri/uriparser

# move renamed files
mv src/UriConfig.h.in src/UriConfig.h

# patch customized files
git apply -v ../../../.github/scripts/download-bundled/uriparser.config.patch
11 changes: 7 additions & 4 deletions .github/scripts/test-directory-unchanged.sh
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
#!/bin/sh
set -ex

cd "$(dirname "$0")/../../$1"
# use the repo root directory as "--git-dir"
cd "$(dirname "$0")/../.."
Comment on lines +4 to +5
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is important as the original cd "$(dirname "$0")/../../$1" did not detected any changes in case of the checked directory was containing .git.

Example: git clone https://github.com/derickr/timelib.git ext/date/lib


dir="$1"

# notify git about untracked (except ignored) files
git add -N .
git add -N "$dir"

# display overview of changed files
git status .
git status "$dir"

# display diff of working directory vs HEAD commit and set exit code
git diff -a --exit-code HEAD .
git diff -a --exit-code HEAD "$dir"
33 changes: 29 additions & 4 deletions .github/workflows/verify-bundled-files.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ name: Verify Bundled Files
on:
push:
paths: &paths
- '.github/scripts/download-bundled/pcre2.sh'
- '.github/scripts/download-bundled/**'
- 'Zend/asm/**'
- 'ext/pcre/pcre2lib/**'
- 'ext/uri/uriparser/**'
pull_request:
paths: *paths
schedule:
Expand All @@ -26,18 +28,41 @@ jobs:
uses: dorny/paths-filter@v3
id: changes
with:
base: master
filters: |
'boost-context':
- '.github/scripts/download-bundled/boost-context.*'
- 'Zend/asm/**'
pcre2:
- '.github/scripts/download-bundled/pcre2.sh'
- '.github/scripts/download-bundled/pcre2.*'
- 'ext/pcre/pcre2lib/**'
uriparser:
- '.github/scripts/download-bundled/uriparser.*'
- 'ext/uri/uriparser/**'

- name: 'boost.context'
if: ${{ !cancelled() && (steps.changes.outputs.pcre2 == 'true' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') }}
run: |
echo "::group::Download"
.github/scripts/download-bundled/boost-context.sh
echo "::endgroup::"
echo "::group::Verify files"
.github/scripts/test-directory-unchanged.sh 'Zend/asm'
echo "::endgroup::"
- name: PCRE2
if: ${{ !cancelled() && (steps.changes.outputs.pcre2 == 'true' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') }}
run: |
echo "::group::Download"
.github/scripts/download-bundled/pcre2.sh
echo "::endgroup::"
echo "::group::Verify files"
.github/scripts/test-directory-unchanged.sh ext/pcre/pcre2lib
.github/scripts/test-directory-unchanged.sh 'ext/pcre/pcre2lib'
echo "::endgroup::"
- name: uriparser
if: ${{ !cancelled() && (steps.changes.outputs.pcre2 == 'true' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') }}
run: |
echo "::group::Download"
.github/scripts/download-bundled/uriparser.sh
echo "::endgroup::"
echo "::group::Verify files"
.github/scripts/test-directory-unchanged.sh 'ext/uri/uriparser'
echo "::endgroup::"
Loading