add gurusdk_cli
						commit
						5f3f63e4a4
					
				|  | @ -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") | ||||||
|  |             os.remove(".gitmodules") | ||||||
|  |         cmdrun("git rev-parse HEAD > sdk_commit") | ||||||
|  |         shutil.rmtree(f".git") | ||||||
|  |         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"""<font color=\"info\">【模块提审】</font> <font color=\"warning\">{user}</font>提交<font color=\"warning\">「{module}」</font>模块审核 | ||||||
|  | 
 | ||||||
|  | ### 审核信息 | ||||||
|  | >`仓库`: <font color=\"info\">{giturl}</font> | ||||||
|  | >`路径`: <font color=\"info\">{gitpath}</font> | ||||||
|  | 
 | ||||||
|  | ### 提交信息 | ||||||
|  | >`邮箱`: <font color=\"comment\">{email}</font> | ||||||
|  | >`日期`: <font color=\"comment\">{formatted_datetime}</font> | ||||||
|  | >`主机`: <font color=\"comment\">{hostname}</font>""" | ||||||
|  | 
 | ||||||
|  |     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: <gurusdk_version>", f"version: {origin_version}", compiler_filedata | ||||||
|  |     ) | ||||||
|  |     compiler_filedata = re.sub("<gurusdk_version>", 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: <gurusdk_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() | ||||||
		Loading…
	
		Reference in New Issue