#!/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")