commit 41657c2e2e0ccac9ee516f2255b0aaab453e2607 Author: Haoyi Date: Wed May 8 19:07:18 2024 +0800 add gurusdk_cli diff --git a/buildtools/gurusdk_cli.py b/buildtools/gurusdk_cli.py new file mode 100755 index 0000000..87f670b --- /dev/null +++ b/buildtools/gurusdk_cli.py @@ -0,0 +1,788 @@ +#!/usr/bin/env python3 +import argparse +from collections import OrderedDict +import os +import re +import shutil +import subprocess +import yaml +import stat +import zlib +from datetime import datetime +import socket +try: + import requests +except ImportError: + print("Installing required dependencies...") + subprocess.check_call( + [ + "pip3", + "install", + "requests", + ] + ) + import requests +try: + from filelock import Timeout, FileLock +except ImportError: + print("Installing required dependencies...") + subprocess.check_call( + [ + "pip3", + "install", + "filelock", + ] + ) + from filelock import Timeout, FileLock + +guru_dir = os.path.expanduser("~/.guru-external") +current_dir = os.getcwd() + +gurusdk_giturl = "git@git.chengdu.pundit.company:castbox/gurusdk.git" +gurumodules_giturl = "git@git.chengdu.pundit.company:castbox/guru_modules.git" +gurusdk_use_submodule = False + + +def get_guru_dir(): + return guru_dir + + +def get_guru_flutter_dir(): + return f"{get_guru_dir()}/flutter" + + +def get_gurusdk_root(): + return f"{get_guru_flutter_dir()}/gurusdk" + + +def get_gurusdk_integrated_dir(app): + return f"{get_gurusdk_root()}/integrated/{app}" + + +def get_gurusdk_runtime_dir(app): + return f"{get_gurusdk_integrated_dir(app)}/gurusdk" + + +def get_gurusdk_compiler_dir(app): + return f"{get_gurusdk_integrated_dir(app)}/gurusdk_compiler" + + +def calculate_pubspec_crc32(pubpaths, initial_crc=0): + crc = initial_crc # 初始 CRC 值 + for pubspec_path in pubpaths: + # 更新 CRC 值,注意确保数据块是字节串 + with open(pubspec_path, "r") as file: + data = file.read() + crc = zlib.crc32(data.encode("utf-8"), crc) + return crc + + +def change_dart_files_readonly(directory): + for root, dirs, files in os.walk(directory): + for file in files: + if file.endswith(".dart"): + full_path = os.path.join(root, file) + current_permissions = os.stat(full_path).st_mode + readonly_permissions = current_permissions & ~stat.S_IWRITE + os.chmod(full_path, readonly_permissions) + + +def search_pkg_dirs(target_root): + results = [] + for dirpath, dirnames, filenames in os.walk(target_root): + # Check if the file is a pubspec.yaml file + for filename in filenames: + if filename == "pubspec.yaml": + dir = dirpath.removeprefix(f"{target_root}/") + results.append(dir) + return results + + +def gurusdk_crc32(version, target_dir): + pkg_dirs = search_pkg_dirs(target_dir) + pubpaths = [] + initial_crc = zlib.crc32(version.encode("utf-8"), 2627) + pkg_dirs.sort() + for dir in pkg_dirs: + package_name = os.path.basename(dir) + if package_name not in invalid_pkgs and package_name not in dev_pkgs: + pubpaths.append(f"{target_dir}/{dir}/pubspec.yaml") + return calculate_pubspec_crc32(pubpaths, initial_crc=initial_crc) + + +invalid_pkgs = {"example", "flutter_2048", "showcase"} + +dev_pkgs = {"guru_splash_flutter"} + + +def gurusdk_snapshot(version, target_dir): + os.chdir(target_dir) + crc = gurusdk_crc32(version, target_dir) + print(f"crc32: {crc}") + cmdrun(f"echo '[CRC]{crc}' > .gurusdk") + if gurusdk_use_submodule: + cmdrun(f"git submodule >> .gurusdk") + + +def gurusdk_dir(): + if not os.path.exists("gurusdk.yaml"): + gsdir = cmdrun("which gurusdk", loggable=False)[0] + while len(gsdir) > 0: + gsdir = os.path.dirname(gsdir) + if is_gurusdk_dir(gsdir): + print(gsdir) + exit(0) + exit(-1) + + with open("gurusdk.yaml", "r") as file: + config = yaml.safe_load(file) + with open("pubspec.yaml", "r") as file: + pubspec_config = yaml.safe_load(file) + if pubspec_config.get("gurulib", False): + print("\033[31m" + "`update` action Not Support gurulib!" + "\033[0m") + exit(-1) + app = pubspec_config["name"] + dir = get_gurusdk_integrated_dir(app) + print(dir) + exit(0) + + +def gurusdk_update(): + os.chdir(current_dir) + with open("gurusdk.yaml", "r") as file: + config = yaml.safe_load(file) + with open("pubspec.yaml", "r") as file: + pubspec_config = yaml.safe_load(file) + if pubspec_config.get("gurulib", False): + print("Not Support gurulib project") + print("\033[31m" + "`update` action Not Support gurulib!" + "\033[0m") + exit(0) + app = pubspec_config["name"] + gurusdk_runtime_dir = get_gurusdk_runtime_dir(app) + runtime_lock = {} + if not os.path.exists(f"{gurusdk_runtime_dir}/gurusdk.lock"): + print( + "\033[31m" + + "gurusdk.lock not found! please use `gurusdk get` command first" + + "\033[0m" + ) + exit(0) + + with open(f"{gurusdk_runtime_dir}/gurusdk.lock", "r") as file: + runtime_lock.update(yaml.safe_load(file)) + locked_version = runtime_lock["guru_sdk"] + version = config["guru_sdk"] + if locked_version != version: + print( + "\033[31m" + + f"Locked version({locked_version}) != config version({version}), please use `gurusdk get` command first" + + "\033[0m" + ) + exit(0) + version_dir = f"{get_gurusdk_root()}/{version}" + if os.path.exists(f"{version_dir}/sdk_commit"): + with open(f"{version_dir}/sdk_commit", "r") as file: + sdk_commit = file.readline().strip() + resolved_ref = cmdrun( + f"git ls-remote {gurusdk_giturl} {version} | awk '{{print $1}}'" + )[0] + print("sdk_commit: ", sdk_commit, "resolved_ref: ", resolved_ref) + if sdk_commit != resolved_ref: + gurusdk_download(version, force=True) + else: + gurusdk_download(version, force=True) + + +def gurusdk_download(version, force=False): + gurusdk_root = get_gurusdk_root() + gurusdk_version_dir = f"{gurusdk_root}/{version}" + if os.path.exists(gurusdk_version_dir): + crc32 = gurusdk_crc32(version, gurusdk_version_dir) + with open(f"{gurusdk_version_dir}/.gurusdk", "r") as file: + filedata = file.readline().strip() + crcStr = f"[CRC]{crc32}" + if filedata != crcStr: + print( + f"{filedata} != {crcStr}! remove {gurusdk_version_dir}, re-download.." + ) + shutil.rmtree(gurusdk_version_dir) + + version_dir_exists = os.path.exists(gurusdk_version_dir) + if force or not version_dir_exists: + if version_dir_exists: + shutil.rmtree(gurusdk_version_dir) + os.chdir(gurusdk_root) + os.system( + f"git clone -b {version} --single-branch --depth 1 {gurusdk_giturl} {version}" + ) + os.chdir(gurusdk_version_dir) + if gurusdk_use_submodule: + os.system("git submodule init") + os.system("git submodule update") + cmdrun("git rev-parse HEAD > sdk_commit") + shutil.rmtree(f".git") + os.remove(".gitmodules") + change_dart_files_readonly(gurusdk_version_dir) + return gurusdk_version_dir + + +def guru_modules_sync(): + guru_flutter_dir = get_guru_flutter_dir() + guru_modules_dir = f"{guru_flutter_dir}/guru_modules" + if os.path.exists(guru_modules_dir) != True: + os.makedirs(guru_flutter_dir, exist_ok=True) + os.chdir(guru_flutter_dir) + os.system( + f"git clone {gurumodules_giturl} {guru_modules_dir}" + ) + else: + os.chdir(guru_modules_dir) + cmdrun("git reset --hard HEAD") + os.system("git pull --rebase") + os.chdir(current_dir) + return guru_modules_dir + + +def get_git_relative_path(): + try: + git_root = subprocess.check_output( + ["git", "rev-parse", "--show-toplevel"], encoding="utf-8" + ).strip() + return os.path.relpath(current_dir, git_root) + except subprocess.CalledProcessError: + print("current directory is not a git repository") + + +def gurusdk_publish(): + if os.path.exists("gurusdk.yaml") != True: + print("\033[31m" + "gurusdk.yaml not found" + "\033[0m") + exit(1) + with open("gurusdk.yaml", "r") as file: + gurusdk = yaml.safe_load(file) + + if os.path.exists("pubspec.yaml") != True: + print("\033[31m" + "pubspec.yaml not found" + "\033[0m") + exit(1) + with open("pubspec.yaml", "r") as file: + pubspec = yaml.safe_load(file) + + libname = pubspec.get("name", None) + if not libname: + print("\033[31m" + "`name` is required in pubspec.yaml" + "\033[0m") + exit(1) + + if not pubspec.get("gurulib", False): + print( + "\033[31m" + + "Not a gurulib project, please set gurulib: true in pubspec.yaml" + + "\033[0m" + ) + exit(1) + + if not pubspec.get("dependencies", {}).get(f"{libname}_gurusdk", None): + print( + "\033[31m" + + f"Please use `gurusdk get` command to add {libname}_gurusdk" + + "\033[0m" + ) + if not pubspec.get("dev_dependencies", {}).get(f"{libname}_gurusdk_compiler", None): + print( + "\033[31m" + + f"Please use `gurusdk get` command to add {libname}_gurusdk_compiler" + + "\033[0m" + ) + + guru_modules_dir = guru_modules_sync() + with open(f"{guru_modules_dir}/guru_modules.yaml", "r") as file: + gurumodules = yaml.safe_load(file) + if libname in gurumodules: + print("\033[31m" + f"Module({libname}) already published" + "\033[0m") + exit(1) + + modules = gurusdk.get("modules", {}) + for module in modules.keys(): + if module not in gurumodules: + print( + "\033[31m" + + f"{libname} depends on {module}, but {module} not published! please publish {module} first" + + "\033[0m" + ) + exit(1) + + giturl = cmdrun("git remote get-url origin")[0] + gitpath = get_git_relative_path() + print("giturl: ", giturl, "gitpath: ", gitpath) + gurumodules[libname] = {"git": f"{giturl}"} + if gitpath != ".": + gurumodules[libname]["path"] = gitpath + + resolved_ref = cmdrun( + f"git ls-remote origin module/{libname} | awk '{{print $1}}'" + )[0] + if resolved_ref != "": + print( + "\033[31m" + + f"Already published {libname} module! Please contact Haoyi as soon as possible to help with the review." + + "\033[0m" + ) + exit(1) + + os.chdir(guru_modules_dir) + cmdrun(f"git checkout main") + cmdrun(f"git branch -D module/{libname}", loggable=False), + + checkout_result = checkout_result = batch_cmdrun( + [f"git checkout -b module/{libname}"] + ) + + if not checkout_result: + print("\033[31m" + "checkout failed" + "\033[0m") + exit(1) + + with open(f"{guru_modules_dir}/guru_modules.yaml", "w") as file: + yaml.dump(gurumodules, file) + + result = batch_cmdrun( + [ + "git add guru_modules.yaml", + f"git commit -s -m 'publish `{libname}` module!'", + f"git push --set-upstream origin module/{libname}", + "git checkout main", + f"git branch -D module/{libname}", + ] + ) + if not result: + print("\033[31m" + "publish failed" + "\033[0m") + exit(1) + user_name = cmdrun("git config user.name")[0] + user_email = cmdrun("git config user.email")[0] + send_module_publish_notice(libname, user_name, user_email, giturl, gitpath) + + os.chdir(current_dir) + print(f"Publish {libname} Module Success!") + +def send_module_publish_notice(module, user, email, giturl, gitpath): + now = datetime.now() + formatted_datetime = now.strftime("%Y-%m-%d %H:%M:%S") + hostname = socket.gethostname() + url = f"https://github.com/castbox/guru_modules/tree/module/{module}" + content_text = f"""【模块提审】 {user}提交「{module}」模块审核![点击跳转]({url}) + +### 审核信息 +>`仓库`: {giturl} +>`路径`: {gitpath} + +### 提交信息 +>`邮箱`: {email} +>`日期`: {formatted_datetime} +>`主机`: {hostname}""" + + content = {"content": content_text} + + body = {"msgtype": "markdown", "markdown": content} + + headers = {"Content-Type": "application/json"} + + requests.post( + "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=031c61ce-b504-45ac-b955-67c7e3ed840b", + json=body, + headers=headers, + ) + + +def extract_git_name(url): + match = re.search(r"/([^/]+)\.git$", url) or re.search(r":([^/]+)\.git$", url) + if match: + return match.group(1) + raise ValueError("Invalid git url: {url}") + + +def import_modules(app, modules, runtime_pubspec_file, locked_modules={}, refs={}): + guru_flutter_dir = get_guru_flutter_dir() + gurusdk_root = get_gurusdk_root() + gurusdk_runtime_dir = get_gurusdk_runtime_dir(app) + + os.makedirs(f"{gurusdk_root}/modules", exist_ok=True) + os.chdir(f"{gurusdk_root}/modules") + runtime_pkg_dir = f"{gurusdk_runtime_dir}/packages" + os.makedirs(f"{runtime_pkg_dir}", exist_ok=True) + + if not os.path.exists(f"{guru_flutter_dir}/guru_modules/guru_modules.yaml"): + cmdrun( + f"git clone {gurumodules_giturl} {guru_flutter_dir}/guru_modules" + ) + else: + guru_modules_sync() + + with open(f"{guru_flutter_dir}/guru_modules/guru_modules.yaml", "r") as file: + gurumodules = yaml.safe_load(file) + runtime_modules = {} + for module, branch in modules.items(): + if module in gurumodules: + if os.path.isdir(branch) and os.path.exists(f"{branch}/pubspec.yaml"): + module_path = branch + else: + module_info = gurumodules[module] + runtime_module_info = locked_modules.get(module, {}) + giturl = module_info["git"] + repo_name = extract_git_name(giturl) + resolved_ref = "" + + if ( + runtime_module_info.get("git", "-") == giturl + and runtime_module_info.get("ref", "") == branch + ): + resolved_ref = runtime_module_info["resolved-ref"] + + if resolved_ref == "": + resolved_ref = cmdrun( + f"git ls-remote {giturl} {branch} | awk '{{print $1}}'" + )[0] + + module_path = f"{gurusdk_root}/modules/{repo_name}-{resolved_ref}" + if not os.path.exists(module_path): + cmdrun( + f"git clone -b {branch} --single-branch --depth 1 {giturl} {module_path}" + ) + os.chdir(module_path) + curren_resolved_ref = cmdrun(f"git rev-parse HEAD")[0] + shutil.rmtree(f"{module_path}/.git") + print( + "resuloved_ref: ", + resolved_ref, + "curren_resolved_ref:", + curren_resolved_ref, + ) + if curren_resolved_ref != resolved_ref: + os.chdir(f"{gurusdk_root}/modules") + changed_module_path = ( + f"{gurusdk_root}/modules/{repo_name}-{curren_resolved_ref}" + ) + os.rename(module_path, changed_module_path) + resolved_ref = curren_resolved_ref + module_path = changed_module_path + print("error: resolved_ref != curren_resolved_ref: fixed!!") + runtime_modules[module] = { + "git": giturl, + "ref": branch, + "resolved-ref": resolved_ref, + } + + module_subpath = "" + if "path" in module_info: + module_subpath = f"/{module_info['path']}" + module_symlink = f"{runtime_pkg_dir}/{module}" + if os.path.islink(module_symlink): + os.unlink(module_symlink) + os.symlink(f"{module_path}{module_subpath}", module_symlink) + + new_refs = set(refs) + new_refs.add(module) + print(f"{module_path}{module_subpath}") + gurusdk_get( + f"{module_path}{module_subpath}", + gurusdk_resolved_ref=resolved_ref, + refs=new_refs, + ) + os.chdir(gurusdk_runtime_dir) + runtime_pubspec_file.write(f" {module}:\n") + runtime_pubspec_file.write(f" path: packages/{module}\n") + os.chdir(f"{gurusdk_root}/modules") + return runtime_modules + + +def is_gurusdk_dir(target_dir): + return ( + os.path.isdir(target_dir) + and os.path.isdir(f"{target_dir}/guru_app") + and os.path.isdir(f"{target_dir}/guru_ui") + and os.path.isdir(f"{target_dir}/guru_activity") + and os.path.isdir(f"{target_dir}/showcase") + ) + + +def gurusdk_get(target_dir, force=False, gurusdk_resolved_ref="", refs={}): + print("gurusdk_get: ", target_dir) + os.chdir(target_dir) + with open("gurusdk.yaml", "r") as file: + config = yaml.safe_load(file) + with open("pubspec.yaml", "r") as file: + pubspec_config = yaml.safe_load(file) + + pubname = pubspec_config["name"] + app = pubname + is_guru_lib = pubspec_config.get("gurulib", False) + if is_guru_lib: + runtime_ref_name = f"{pubname}_gurusdk" + compiler_ref_name = f"{pubname}_gurusdk_compiler" + else: + runtime_ref_name = "gurusdk" + compiler_ref_name = "gurusdk_compiler" + + if gurusdk_resolved_ref != "": + app = f"{pubname}-{gurusdk_resolved_ref}" + + gurusdk_root = get_gurusdk_root() + gurusdk_integrated_root = get_gurusdk_integrated_dir(app) + if not os.path.exists(gurusdk_integrated_root): + os.makedirs(gurusdk_integrated_root) + + if local is not None and is_gurusdk_dir(local): + print(f"use local gurusdk:{local}") + version = "local" + gurusdk_version_dir = local + else: + version = config["guru_sdk"] + gurusdk_version_dir = gurusdk_download(version, force=force) + + gurusdk_runtime_dir = get_gurusdk_runtime_dir(app) + gurusdk_compiler_dir = get_gurusdk_compiler_dir(app) + + runtime_lock = {} + if os.path.exists(f"{gurusdk_runtime_dir}/gurusdk.lock"): + with open(f"{gurusdk_runtime_dir}/gurusdk.lock", "r") as file: + runtime_lock.update(yaml.safe_load(file)) + force = force or (runtime_lock.get("guru_sdk", version) != version) + runtime_lock = {"guru_sdk": version} + print(f"gurusdk_get {force}") + if force or not os.path.exists(f"{gurusdk_runtime_dir}/pubspec.yaml"): + os.chdir(gurusdk_integrated_root) + if os.path.exists(gurusdk_runtime_dir): + shutil.rmtree(gurusdk_runtime_dir) + cmdrun("flutter create --template=package gurusdk") + os.chdir(gurusdk_runtime_dir) + if os.path.islink(version): + os.unlink(version) + if version == "local": + os.symlink(local, version) + else: + os.symlink(f"{gurusdk_root}/{version}", version) + os.chdir(target_dir) + + if force or not os.path.exists(f"{gurusdk_compiler_dir}/pubspec.yaml"): + os.chdir(gurusdk_integrated_root) + if os.path.exists(gurusdk_compiler_dir): + shutil.rmtree(gurusdk_compiler_dir) + cmdrun("flutter create --template=package gurusdk_compiler") + + os.chdir(gurusdk_compiler_dir) + if os.path.islink(version): + os.unlink(version) + if version == "local": + os.symlink(local, version) + else: + os.symlink(f"{gurusdk_root}/{version}", version) + os.chdir(target_dir) + + compiler_bin_dir = f"{gurusdk_compiler_dir}/bin" + if not os.path.exists(compiler_bin_dir): + os.makedirs(compiler_bin_dir) + + if os.path.exists(f"{gurusdk_runtime_dir}/pubspec.yaml"): + os.remove(f"{gurusdk_runtime_dir}/pubspec.yaml") + + if os.path.exists(f"{gurusdk_compiler_dir}/pubspec.yaml"): + os.remove(f"{gurusdk_compiler_dir}/pubspec.yaml") + cmdrun( + f"cp {gurusdk_version_dir}/pubspec_compiler.yaml {gurusdk_compiler_dir}/pubspec.yaml" + ) + + if os.path.exists(f"{gurusdk_runtime_dir}/build.yaml"): + os.remove(f"{gurusdk_runtime_dir}/build.yaml") + cmdrun(f"cp {gurusdk_version_dir}/build.yaml {gurusdk_compiler_dir}/build.yaml") + + supported_packages = {} + pkg_dirs = search_pkg_dirs(gurusdk_version_dir) + + for dir in pkg_dirs: + package_name = os.path.basename(dir) + if package_name not in invalid_pkgs and package_name not in dev_pkgs: + supported_packages[package_name] = f"{version}/{dir}" + + if version == "local": + origin_version = "0.0.0-local" + else: + origin_version = version.removeprefix("v") + + integrate_packages = config["integrated"] + + with open(f"{gurusdk_compiler_dir}/pubspec.yaml", "r") as file: + compiler_filedata = file.read() + + if compiler_ref_name != "gurusdk_compiler": + compiler_filedata = re.sub( + "name: gurusdk_compiler", f"name: {compiler_ref_name}", compiler_filedata + ) + + compiler_filedata = re.sub( + "version: ", f"version: {origin_version}", compiler_filedata + ) + compiler_filedata = re.sub("", f"{version}", compiler_filedata) + + for pkg in integrate_packages: + if pkg not in dev_pkgs: + continue + print(f"[compiler integrated] pkg: {pkg}") + compiler_filedata = re.sub(rf"#(.*{pkg}:\n)", rf" \1", compiler_filedata) + compiler_filedata = re.sub( + rf"#(.*path: {version}.*/{pkg}\n)", rf" \1", compiler_filedata + ) + + if pkg == "guru_splash_flutter": + if os.path.islink(f"{compiler_bin_dir}/create_splash.dart"): + os.unlink(f"{compiler_bin_dir}/create_splash.dart") + os.symlink( + f"{gurusdk_root}/{version}/guru_splash_flutter/bin/create.dart", + f"{compiler_bin_dir}/create_splash.dart", + ) + else: + os.remove(f"{compiler_bin_dir}/create_splash.dart") + + with open(f"{gurusdk_compiler_dir}/pubspec.yaml", "w") as file: + file.write(compiler_filedata) + + os.chdir(gurusdk_runtime_dir) + + with open(f"{gurusdk_version_dir}/pubspec_runtime.yaml", "r") as file: + lines = file.readlines() + with open(f"{gurusdk_runtime_dir}/pubspec.yaml", "w") as runtime_pubspec_file: + for line in lines: + if line == "name: gurusdk\n": + runtime_pubspec_file.write(f"name: {runtime_ref_name}\n") + elif line == "version: \n": + runtime_pubspec_file.write(f"version: {origin_version}\n") + elif line == "######## GURU SDK DEPENDENCIES BEGIN ########\n": + runtime_pubspec_file.write(f"{line}\n") + for dir in pkg_dirs: + package_name = os.path.basename(dir) + if ( + package_name in integrate_packages + and package_name not in invalid_pkgs + and package_name not in dev_pkgs + ): + runtime_pubspec_file.write(f" {package_name}:\n") + runtime_pubspec_file.write(f" path: {version}/{dir}\n") + if "modules" in config: + runtime_lock["modules"] = import_modules( + app, + config["modules"], + runtime_pubspec_file, + runtime_lock.get("modules", {}), + refs, + ) + else: + runtime_pubspec_file.write(line) + + with open(f"{gurusdk_runtime_dir}/gurusdk.lock", "w") as file: + yaml.dump(runtime_lock, file) + + print(target_dir) + os.chdir(target_dir) + if os.path.islink(f".gurusdk"): + os.unlink(f".gurusdk") + if os.path.islink(f".gurusdk_compiler"): + os.unlink(f".gurusdk_compiler") + + os.symlink(f"{gurusdk_runtime_dir}", f".gurusdk") + os.symlink(f"{gurusdk_compiler_dir}", f".gurusdk_compiler") + + runtime_cmd = f'dart pub add \'{runtime_ref_name}:{{"path":"./.gurusdk"}}\'' + if runtime_ref_name not in pubspec_config["dependencies"]: + os.system(runtime_cmd) + + compiler_cmd = ( + f'dart pub add \'dev:{compiler_ref_name}:{{"path":"./.gurusdk_compiler"}}\'' + ) + if compiler_ref_name not in pubspec_config["dev_dependencies"]: + os.system(compiler_cmd) + +def gurusdk_dumprefs(): + os.chdir(current_dir) + with open("gurusdk.yaml", "r") as file: + config = yaml.safe_load(file) + with open("pubspec.yaml", "r") as file: + pubspec_config = yaml.safe_load(file) + + pubname = pubspec_config["name"] + app = pubname + version = config["guru_sdk"] + gurusdk_root = get_gurusdk_root() + gurusdk_runtime_dir = get_gurusdk_runtime_dir(app) + gurusdk_version_dir = f"{gurusdk_root}/{version}" + + os.system("echo '\n============== gurusdk.lock =============='") + os.system(f"cat {gurusdk_runtime_dir}/gurusdk.lock") + os.system(f"echo '\n============== sdk_commit({version}) =============='") + os.system(f"cat {gurusdk_version_dir}/sdk_commit") + os.system("echo '\n============== .gurusdk =============='") + os.system(f"cat {gurusdk_version_dir}/.gurusdk") + +def cmdrun(command, loggable=True): + try: + if loggable: + print(f"run: {command}") + result = subprocess.run( + command, shell=True, check=True, text=True, capture_output=True + ) + return result.stdout.strip().split("\n") + except subprocess.CalledProcessError as e: + if loggable: + print(f"Error: {e}") + return [] + + +def batch_cmdrun(commands, loggable=True): + try: + for cmd in commands: + if loggable: + print(f"run: {cmd}") + subprocess.run(cmd, shell=True, check=True, text=True, capture_output=True) + return True + except subprocess.CalledProcessError as e: + if loggable: + print(f"Error: {e}") + return False + +def gurusdk_locked_get(target_dir, force=False): + lock_path = get_guru_dir() + "/.gurusdk_lock" + + lock = FileLock(lock_path, timeout=300) + try: + with lock.acquire(): + gurusdk_get(target_dir, force=force) + except Timeout: + print("lock acquire timeout") + except Exception as e: + print(f"lock acquire error: {e}") + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Process some integers.") + parser.add_argument("action", type=str, help="action") + parser.add_argument("version", nargs="?", type=str, help="checksum version") + parser.add_argument("--sdk", type=str, help="flutter sdk path") + parser.add_argument("--local", type=str, help="local path") + parser.add_argument("--force", action="store_true", help="force") + + args = parser.parse_args() + flutter_sdk = args.sdk + force = args.force + local = args.local + + if flutter_sdk: + print(f"flutter sdk: {flutter_sdk}") + os.environ["PATH"] = f"{flutter_sdk}:{os.environ['PATH']}" + + if args.action == "get": + gurusdk_locked_get(current_dir, force=force) + elif args.action == "snapshot" and args.version is not None: + gurusdk_snapshot(args.version, current_dir) + elif args.action == "update": + gurusdk_update() + elif args.action == "download": + gurusdk_download(args.version, force=True) + elif args.action == "publish": + gurusdk_publish() + elif args.action == "dir": + gurusdk_dir() + elif args.action == "dumprefs": + gurusdk_dumprefs()