mirror of
https://github.com/awslabs/aws-crt-php.git
synced 2026-08-17 17:47:12 +00:00
Fix PECL publish and windows CI (#85)
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
import os
|
||||
import glob
|
||||
import shutil
|
||||
|
||||
TOOLS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
WORK_DIR = os.path.join(TOOLS_DIR, '..')
|
||||
|
||||
# Remove specified directories
|
||||
DIRS_TO_REMOVE = [
|
||||
'.deps',
|
||||
'.libs',
|
||||
'build',
|
||||
'include',
|
||||
'modules',
|
||||
'vendor',
|
||||
'autom4te.cache']
|
||||
|
||||
# Remove specified files
|
||||
FILES_TO_REMOVE = [
|
||||
'Makefile',
|
||||
'Makefile.fragments',
|
||||
'Makefile.global',
|
||||
'Makefile.objects',
|
||||
'config.guess',
|
||||
'config.h',
|
||||
'config.h.in',
|
||||
'config.log',
|
||||
'config.nice',
|
||||
'config.status',
|
||||
'config.sub',
|
||||
'configure',
|
||||
'configure.in',
|
||||
'configure.ac',
|
||||
'install-sh',
|
||||
'libtool',
|
||||
'ltmain.sh',
|
||||
'missing',
|
||||
'mkinstalldirs',
|
||||
'run-tests.php',
|
||||
'awscrt.la',
|
||||
'composer.lock',
|
||||
'ext/awscrt.stub.php',
|
||||
'acinclude.m4',
|
||||
'aclocal.m4',
|
||||
'**/*.lo',
|
||||
'**/*.o',
|
||||
'**/*.la',
|
||||
'**/*.a',
|
||||
'*.tgz']
|
||||
|
||||
os.chdir(WORK_DIR)
|
||||
|
||||
|
||||
for directory in DIRS_TO_REMOVE:
|
||||
shutil.rmtree(directory, ignore_errors=True)
|
||||
|
||||
for pattern in FILES_TO_REMOVE:
|
||||
for filepath in glob.glob(pattern):
|
||||
os.remove(filepath)
|
||||
@@ -0,0 +1,19 @@
|
||||
</contents>
|
||||
<dependencies>
|
||||
<required>
|
||||
<php>
|
||||
<min>7.4.0</min>
|
||||
</php>
|
||||
<pearinstaller>
|
||||
<min>1.10.0</min>
|
||||
</pearinstaller>
|
||||
</required>
|
||||
</dependencies>
|
||||
<providesextension>awscrt</providesextension>
|
||||
<extsrcrelease/>
|
||||
<changelog>
|
||||
<release>
|
||||
|
||||
</release>
|
||||
</changelog>
|
||||
</package>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<package packagerversion="1.8.1" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
|
||||
<name>awscrt</name>
|
||||
<channel>pecl.php.net</channel>
|
||||
<summary>AWS Common Runtime PHP bindings</summary>
|
||||
<description>AWS Common Runtime provides a set of low level tools as network protocols and authentication used by the AWSSDK for PHP to provide high level API to access AWS services.</description>
|
||||
<lead>
|
||||
<name>{{{NAME}}}</name>
|
||||
<user>{{{USER}}}</user>
|
||||
<email>{{{EMAIL}}}</email>
|
||||
<active>yes</active>
|
||||
</lead>
|
||||
<date>{{{TODAY}}}</date>
|
||||
<version>
|
||||
<release>{{{VERSION}}}</release>
|
||||
<api>1.0.0</api>
|
||||
</version>
|
||||
<stability>
|
||||
<release>devel</release>
|
||||
<api>stable</api>
|
||||
</stability>
|
||||
<license uri="https://www.apache.org/licenses/LICENSE-2.0">Apache License Version 2.0</license>
|
||||
<notes>{{{NOTES}}}</notes>
|
||||
<contents>
|
||||
@@ -0,0 +1,146 @@
|
||||
#!/usr/bin/env python3
|
||||
import argparse
|
||||
import os
|
||||
import re
|
||||
from datetime import datetime
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Generate package.xml file for a release bundle.")
|
||||
parser.add_argument("--name", help="Name of the package", required=True)
|
||||
parser.add_argument(
|
||||
"--user", help="Username of the package maintainer", required=True)
|
||||
parser.add_argument(
|
||||
"--email", help="Email address of the package maintainer", default='[email protected]')
|
||||
parser.add_argument(
|
||||
"--version", help="Version number of the package", required=True)
|
||||
parser.add_argument(
|
||||
"--notes", help="Release notes for the package", default='New release')
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
name = args.name
|
||||
user = args.user
|
||||
email = args.email
|
||||
version = args.version
|
||||
notes = args.notes
|
||||
|
||||
|
||||
tools_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
work_dir = os.path.join(tools_dir, '..')
|
||||
|
||||
os.chdir(work_dir)
|
||||
|
||||
today = datetime.utcnow().strftime("%Y-%m-%d")
|
||||
|
||||
source_ext = "(c|cc|h|cpp|hpp|m4|w32|ini|frag|cmake|inl|in|py|gnu|yaml|def|pl|S|s|errordata|go|lds|num|asm|mod|peg|mk|rs|toml|sh)"
|
||||
doc_ext = "(md|json|html|dot|graphml|png|gn|sha1|css|rst)"
|
||||
|
||||
special_docs = "(LICENSE.*|NOTICE|changelog.txt|CHANGELOG|THIRD-PARTY|README.*|readme|METADATA|CONTRIBUTORS|UPDATING|doc.config|THIRD-PARTY-LICENSES.txt)"
|
||||
special_tests = "(ci-test.sh|format-check.sh|run_tests.*|sanitizer-blacklist.txt|run-clang-tidy.sh|benchmark-build-run.sh|break-tests.sh|generate-coverage.sh|test.xml)"
|
||||
special_src = "(gen_api.php|gen_stub.php|CMakeLists.txt|post.sh|postun.sh|Makefile.*|build-buildspec.sh|build-deps.sh|objects.txt|go.*|BUILD.*|DEPS|install_and_run.sh|codemod.sh|requirements.txt)"
|
||||
skip_files = "(package.xml.*|prepare_release.sh|codereview.settings|.*\\.o|.*\\.a|.*\\.obj|.*\\.lib|break-tests-android.sh|whitespace.txt|prepare_package_xml.sh|crypto_test_data.cc|.*\\.pdf|.*\\.svg|.*\\.docx|cbmc-proof.txt|codecov.*|litani.*|.*\\.toml|module\\.modulemap|cleanup.sh|^\..*)"
|
||||
|
||||
|
||||
special_scripts = "(awscrt.stub.php)"
|
||||
|
||||
skip_directories = "(tests|test|AWSCRTAndroidTestRunner|docker-images|codebuild|fuzz|third_party|docs|generated-src|aws-lc|aws-crt-sys|ecdsa-fuzz-corpus|bin|examples|compliance|verification|^\..*)"
|
||||
|
||||
output_file_name = os.path.join(work_dir, 'package.xml')
|
||||
|
||||
|
||||
def process_file(file_name, f):
|
||||
if re.match(skip_files, file_name):
|
||||
# This file is not part of the release bundle
|
||||
return
|
||||
f.write(f'<file name="{file_name}" role="')
|
||||
# Special cases
|
||||
if re.match(special_scripts, file_name):
|
||||
f.write('script')
|
||||
elif re.match(special_docs, file_name):
|
||||
f.write('doc')
|
||||
elif re.match(special_tests, file_name):
|
||||
f.write('test')
|
||||
elif re.match(special_src, file_name):
|
||||
f.write('src')
|
||||
else:
|
||||
# Extension based cases
|
||||
ext = file_name.split('.')[-1]
|
||||
if re.match(source_ext, ext):
|
||||
f.write('src')
|
||||
elif re.match(doc_ext, ext):
|
||||
f.write('doc')
|
||||
elif ext == 'php':
|
||||
f.write('script')
|
||||
else:
|
||||
f.write(f'{ext} - {file_name} - FAIL TO RECOGNIZE')
|
||||
print(f'{ext} - {file_name} - FAIL TO RECOGNIZE')
|
||||
exit(1)
|
||||
|
||||
f.write('"/>\n')
|
||||
|
||||
|
||||
def process_dir(dir_name, f):
|
||||
if re.match(skip_directories, dir_name):
|
||||
return
|
||||
|
||||
f.write(f'<dir name="{dir_name}">\n')
|
||||
os.chdir(dir_name)
|
||||
for file_name in os.listdir():
|
||||
if os.path.isfile(file_name):
|
||||
process_file(file_name, f)
|
||||
else:
|
||||
process_dir(file_name, f)
|
||||
|
||||
# Special cases for compiler features placed in tests directories in and s2n
|
||||
if dir_name == 's2n' and os.path.isdir('tests'):
|
||||
f.write('<dir name="tests">')
|
||||
f.write('<dir name="features">')
|
||||
os.chdir('tests/features')
|
||||
for a in os.listdir():
|
||||
process_file(a, f)
|
||||
os.chdir('../..')
|
||||
f.write('</dir>')
|
||||
f.write('</dir>')
|
||||
|
||||
f.write('</dir>')
|
||||
os.chdir('..')
|
||||
|
||||
|
||||
# Main code
|
||||
with open(os.path.join(tools_dir, "package.xml-template_pre"), 'r') as f:
|
||||
template_pre = f.read()
|
||||
|
||||
template_pre = re.sub(r"{{{NAME}}}", name, template_pre)
|
||||
template_pre = re.sub(r"{{{USER}}}", user, template_pre)
|
||||
template_pre = re.sub(r"{{{EMAIL}}}", email, template_pre)
|
||||
template_pre = re.sub(r"{{{TODAY}}}", today, template_pre)
|
||||
template_pre = re.sub(r"{{{VERSION}}}", version, template_pre)
|
||||
template_pre = re.sub(r"{{{NOTES}}}", notes, template_pre)
|
||||
|
||||
with open(output_file_name, "w") as f:
|
||||
f.write(template_pre)
|
||||
f.write('<dir name="/">\n')
|
||||
|
||||
with open(output_file_name, "a") as f:
|
||||
for file_name in os.listdir():
|
||||
if file_name == 'tests':
|
||||
f.write('<dir name="tests">\n')
|
||||
for test_file in os.listdir('tests'):
|
||||
f.write(
|
||||
f'<file name="{os.path.basename(test_file)}" role="test" />\n')
|
||||
f.write('</dir>\n')
|
||||
continue
|
||||
|
||||
if file_name == 'src':
|
||||
# skip the src directory as it is not part of the native extension
|
||||
continue
|
||||
|
||||
if os.path.isfile(file_name):
|
||||
process_file(file_name, f)
|
||||
else:
|
||||
process_dir(file_name, f)
|
||||
|
||||
with open(output_file_name, "a") as f:
|
||||
f.write('</dir>\n')
|
||||
with open(os.path.join(tools_dir, "package.xml-template_post"), 'r') as template:
|
||||
f.write(template.read())
|
||||
@@ -0,0 +1,58 @@
|
||||
import argparse
|
||||
import os
|
||||
import subprocess
|
||||
import xml.dom.minidom
|
||||
import sys
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser(description='PECL Package generator')
|
||||
parser.add_argument("--name", help="Name of the package", required=True)
|
||||
parser.add_argument(
|
||||
"--user", help="Username of the package maintainer", required=True)
|
||||
parser.add_argument(
|
||||
"--email", help="Email address of the package maintainer", default='[email protected]')
|
||||
parser.add_argument(
|
||||
"--version", help="Version number of the package", required=True)
|
||||
parser.add_argument(
|
||||
"--notes", help="Release notes for the package", default='New release')
|
||||
args = parser.parse_args()
|
||||
|
||||
PACKAGE = 'awscrt'
|
||||
NAME = args.name
|
||||
USER = args.user
|
||||
EMAIL = args.email
|
||||
VERSION = args.version
|
||||
NOTES = args.notes
|
||||
|
||||
TOOLS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
WORK_DIR = os.path.join(TOOLS_DIR, '..')
|
||||
|
||||
|
||||
def run(args):
|
||||
print(f"$ {subprocess.list2cmdline(args)}")
|
||||
subprocess.check_call(args)
|
||||
|
||||
|
||||
run(['python3', f'{TOOLS_DIR}/cleanup_build.py'])
|
||||
|
||||
os.chdir(WORK_DIR)
|
||||
|
||||
run(['git', 'submodule', 'update', '--init', '--recursive'])
|
||||
|
||||
try:
|
||||
run(['python3', f'{TOOLS_DIR}/prepare_pecl_package_xml.py', '--name', NAME, '--user', USER,
|
||||
'--email', EMAIL, '--version', VERSION, '--notes', NOTES])
|
||||
except subprocess.CalledProcessError as e:
|
||||
sys.exit(f'ERROR PROCESSING review package.xml: {e}')
|
||||
|
||||
with open('package.xml', 'r') as f:
|
||||
package_xml = f.read()
|
||||
doc = xml.dom.minidom.parse('package.xml')
|
||||
doc.encoding = 'UTF-8'
|
||||
xml_str = doc.toprettyxml(indent=' ', newl='')
|
||||
with open('package.xml', 'w') as f:
|
||||
f.write(xml_str)
|
||||
run(['pear', 'package-validate'])
|
||||
run(['pear', 'package'])
|
||||
|
||||
print(f'Size of {PACKAGE}-{VERSION}.tgz: {os.path.getsize(f"{PACKAGE}-{VERSION}.tgz") / 1024 / 1024:.2f} MB')
|
||||
@@ -0,0 +1,31 @@
|
||||
@echo on
|
||||
setlocal
|
||||
|
||||
|
||||
set "PHP_BINARY=php"
|
||||
|
||||
if not "%~1"=="" (
|
||||
set "PHP_BINARY=%~1"
|
||||
)
|
||||
|
||||
set "script_dir=%~dp0"
|
||||
set "work_dir=%script_dir%/.."
|
||||
cd %work_dir%
|
||||
|
||||
set vendor_path=vendor
|
||||
REM Run command to get composer_dir
|
||||
set "composer_dir="
|
||||
for /f "usebackq delims=" %%i in (`where composer.phar`) do set "composer_dir=%%i"
|
||||
|
||||
if not exist "%vendor_path%" (
|
||||
REM Check if composer_dir was found
|
||||
if "%composer_dir%"=="" (
|
||||
echo No composer found.
|
||||
exit /b 1
|
||||
)
|
||||
call %PHP_BINARY% -c php-win.ini %composer_dir% update
|
||||
)
|
||||
|
||||
call %PHP_BINARY% -c php-win.ini vendor/bin/phpunit tests --debug
|
||||
|
||||
endlocal
|
||||
Executable
+25
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -ex
|
||||
|
||||
BASENAME=${0}
|
||||
TOOLS_DIR=$(dirname ${BASENAME})
|
||||
WORK_DIR="${TOOLS_DIR}/.."
|
||||
|
||||
cd "${WORK_DIR}"
|
||||
|
||||
launcher=
|
||||
if command -v catchsegv; then
|
||||
launcher=catchsegv
|
||||
fi
|
||||
|
||||
if [ -z $PHP_BINARY ]; then
|
||||
PHP_BINARY=$(which php)
|
||||
fi
|
||||
|
||||
if [ ! -d vendor ]; then
|
||||
COMPOSER_BINARY=$(which composer)
|
||||
$PHP_BINARY -c php.ini $COMPOSER_BINARY update
|
||||
fi
|
||||
|
||||
$launcher $PHP_BINARY -c php.ini vendor/bin/phpunit tests --debug
|
||||
Reference in New Issue
Block a user