97 lines
No EOL
2.9 KiB
Python
97 lines
No EOL
2.9 KiB
Python
import yaml # pip install PyYAML
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
|
|
with open("config.yaml", "r") as f:
|
|
config = yaml.safe_load(f)
|
|
|
|
config_lock = {}
|
|
|
|
LOCK_FILE_NAME = "config.lock.yaml"
|
|
|
|
if os.path.exists(LOCK_FILE_NAME):
|
|
with open(LOCK_FILE_NAME, "r") as f:
|
|
config_lock = yaml.safe_load(f)
|
|
|
|
all_cloned_packages = list(config.keys())
|
|
|
|
for folder_name, data in config.items():
|
|
if "dependencies" in data:
|
|
all_cloned_packages += list(data["dependencies"].keys())
|
|
|
|
def print_blue(text):
|
|
BLUE = '\x1b[34m'
|
|
RESET = '\x1b[0m'
|
|
print(f"{BLUE}{text}{RESET}")
|
|
|
|
def get_git_head(repo_path='.'):
|
|
result = subprocess.run(
|
|
['git', 'rev-parse', 'HEAD'],
|
|
cwd=repo_path,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
text=True,
|
|
check=False
|
|
)
|
|
if result.returncode != 0:
|
|
raise RuntimeError(f"git error: {result.stderr.strip()}")
|
|
return result.stdout.strip()
|
|
|
|
def integrate_package(folder_name, data):
|
|
global config_lock
|
|
|
|
repo_url = data['git']
|
|
keep_list = ["lib", "test", "LICENSE", "pubspec.yaml"]
|
|
if "keep" in data:
|
|
keep_list += [item.rstrip('/') for item in data['keep']]
|
|
|
|
|
|
print(f"Processing {folder_name}...")
|
|
|
|
if os.path.exists(folder_name):
|
|
shutil.rmtree(folder_name)
|
|
|
|
subprocess.run(["git", "clone", repo_url, folder_name], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
|
|
last_commit_hash = get_git_head(folder_name)
|
|
|
|
if folder_name in config_lock:
|
|
if config_lock[folder_name] != last_commit_hash:
|
|
print_blue(f"{folder_name} has a new update!")
|
|
subprocess.run(["git", "checkout", config_lock[folder_name]], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=folder_name)
|
|
else:
|
|
config_lock[folder_name] = last_commit_hash
|
|
|
|
|
|
for item in os.listdir(folder_name):
|
|
if item not in keep_list:
|
|
item_path = os.path.join(folder_name, item)
|
|
|
|
if os.path.isdir(item_path):
|
|
shutil.rmtree(item_path)
|
|
else:
|
|
os.remove(item_path)
|
|
|
|
pubspec = {
|
|
"dependency_overrides": {},
|
|
}
|
|
|
|
for folder_name, data in config.items():
|
|
|
|
pubspec["dependency_overrides"][folder_name] = {}
|
|
pubspec["dependency_overrides"][folder_name]["path"] = f"./dependencies/{folder_name}"
|
|
|
|
integrate_package(folder_name, data)
|
|
if "dependencies" in data:
|
|
for folder_name, data in data["dependencies"].items():
|
|
integrate_package(folder_name, data)
|
|
pubspec["dependency_overrides"][folder_name] = {}
|
|
pubspec["dependency_overrides"][folder_name]["path"] = f"./dependencies/{folder_name}"
|
|
|
|
|
|
with open(LOCK_FILE_NAME, "w") as f:
|
|
yaml.safe_dump(config_lock, f, sort_keys=True)
|
|
|
|
with open("pubspec.yaml", "w") as f:
|
|
yaml.safe_dump(pubspec, f, sort_keys=True) |