789 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			789 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
| #!/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()
 |