scripts/verify.py (102 lines of code) (raw):
#!/usr/bin/env python3
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import subprocess
import sys
import os
from pathlib import Path
BASE_DIR = Path(os.getcwd())
# Define colors for output
YELLOW = "\033[37;1m"
GREEN = "\033[32;1m"
ENDCOLOR = "\033[0m"
def check_signature(pkg):
"""Check the GPG signature of the package."""
try:
subprocess.check_call(["gpg", "--verify", f"{pkg}.asc", pkg])
print(f"{GREEN}> Success to verify the gpg sign for {pkg}{ENDCOLOR}")
except subprocess.CalledProcessError:
print(f"{YELLOW}> Failed to verify the gpg sign for {pkg}{ENDCOLOR}")
def check_sha512sum(pkg):
"""Check the sha512 checksum of the package."""
try:
subprocess.check_call(["shasum", "-a", "512", "-c", f"{pkg}.sha512"])
print(f"{GREEN}> Success to verify the checksum for {pkg}{ENDCOLOR}")
except subprocess.CalledProcessError:
print(f"{YELLOW}> Failed to verify the checksum for {pkg}{ENDCOLOR}")
def extract_packages():
for file in BASE_DIR.glob("*.tar.gz"):
subprocess.run(["tar", "-xzf", file], check=True)
def check_license(dir):
print(f"> Start checking LICENSE file in {dir}")
if not (dir / "LICENSE").exists():
raise f"{YELLOW}> LICENSE file is not found{ENDCOLOR}"
print(f"{GREEN}> LICENSE file exists in {dir}{ENDCOLOR}")
def check_notice(dir):
print(f"> Start checking NOTICE file in {dir}")
if not (dir / "NOTICE").exists():
raise f"{YELLOW}> NOTICE file is not found{ENDCOLOR}"
print(f"{GREEN}> NOTICE file exists in {dir}{ENDCOLOR}")
def check_rust():
try:
subprocess.run(["cargo", "--version"], check=True)
return True
except FileNotFoundError:
return False
except Exception as e:
raise Exception("Check rust met unexpected error", e)
def check_java():
try:
subprocess.run(["java", "-version"], check=True)
return True
except FileNotFoundError:
return False
except Exception as e:
raise Exception("Check java met unexpected error", e)
def build_core(dir):
print("Start building opendal core")
subprocess.run(
["cargo", "build", "--release"],
cwd=dir / "core",
check=True,
stderr=subprocess.DEVNULL,
)
print(f"{GREEN}Success to build opendal core{ENDCOLOR}")
def build_java_binding(dir):
print("Start building opendal java binding")
subprocess.run(
[
"./mvnw",
"clean",
"install",
"-DskipTests=true",
"-Dcargo-build.profile=release",
],
check=True,
cwd=dir / "bindings/java",
stderr=subprocess.DEVNULL,
stdout=subprocess.DEVNULL,
)
print(f"> {GREEN}Success to build opendal java binding{ENDCOLOR}")
if __name__ == "__main__":
# Get a list of all files in the current directory
files = [f for f in os.listdir(".") if os.path.isfile(f)]
for pkg in files:
# Skip files that don't have a corresponding .asc or .sha512 file
if not os.path.exists(f"{pkg}.asc") or not os.path.exists(f"{pkg}.sha512"):
continue
print(f"> Checking {pkg}")
# Perform the checks
check_signature(pkg)
check_sha512sum(pkg)
extract_packages()
for dir in BASE_DIR.glob("apache-opendal-*-src/"):
check_license(dir)
check_notice(dir)
if "core" in dir.name:
if check_rust():
build_core(dir)
else:
print(
"Cargo is not found, please check if rust development has been setup correctly"
)
print(
"Visit https://www.rust-lang.org/tools/install for more information"
)
sys.exit(1)
if "java" in dir.name:
if check_java():
build_java_binding(dir)
else:
print("Java is not found, skipped building java binding")