From 527ab8a466b0fe0146590468c8ebbb2d0a56bf60 Mon Sep 17 00:00:00 2001
From: dd
Date: Fri, 31 Oct 2025 12:44:09 +0100
Subject: updated package builder support detection of changes inside dependent
repositories
---
new/lib/helpers.py | 7 ++++++
new/package_builder.py | 60 ++++++++++++++++++++++++++++++++++++++------------
2 files changed, 53 insertions(+), 14 deletions(-)
diff --git a/new/lib/helpers.py b/new/lib/helpers.py
index 187e1d9..6dfed99 100644
--- a/new/lib/helpers.py
+++ b/new/lib/helpers.py
@@ -30,6 +30,13 @@ def quote_all(*args):
return tuple(quoted)
+def sanitize_filename(any_string):
+ sanitized = re.sub(r"[^A-Za-z0-9\-._]", "_", any_string)
+ sanitized = re.sub(r"_+", "_", sanitized)
+ sanitized = sanitized.strip("_")
+ return sanitized
+
+
def execute(command, timeout: int = None, passthrough=False, passthrough_prefix=None, passthrough_output=False,
**kwargs):
if passthrough:
diff --git a/new/package_builder.py b/new/package_builder.py
index ea75c7b..83c6bf6 100755
--- a/new/package_builder.py
+++ b/new/package_builder.py
@@ -13,7 +13,7 @@ from lib.debranding import Debranding
from lib.docker import Docker
from lib.git import Git
from lib.helpers import setup_logging, ProcessException, refuse_root, get_my_log_file, data_dir, build_dir, scripts_dir, \
- quote_all, TerminalTitle, ensure_directories, replace_github_repo_org
+ quote_all, TerminalTitle, ensure_directories, replace_github_repo_org, sanitize_filename
from lib.objectstorage import ObjectStorage
from lib.packagedefinitions import PackageDefinitions
from lib.scripting import Scripting
@@ -128,24 +128,54 @@ class PackageBuilder:
git_url = replace_github_repo_org(package["git_url"], self.clone_org)
git = Git(repo_path)
+ if git.exists() and not os.path.exists(git.git_dir):
+ self.docker.rmtree(parent_path)
+
if git.exists() and self.clone_org not in git.get_remote_url("origin"):
git.set_remote_url("origin", git_url)
git.fetch()
if git.exists():
- if not os.path.exists(git.git_dir):
- self.docker.rmtree(parent_path)
- else:
- try:
- changed = git.resolve_changes(package["change_patterns"], my_state["hash"])
- if not changed and not self.force_build:
- logging.info("Package is up to date, skipping build")
- return
- except ProcessException as e:
- if "not a git repository" in str(e):
- self.docker.rmtree(parent_path)
+ up_to_date = False
+
+ try:
+ changed = git.resolve_changes(package["change_patterns"], my_state["hash"])
+ if not changed:
+ up_to_date = True
+ except ProcessException as e:
+ if "not a git repository" in str(e):
+ self.docker.rmtree(parent_path)
+ else:
+ raise
+
+ if "dependencies" in package:
+ if "dependencies" in my_state:
+ previous_dependency_hashes = my_state["dependencies"]
+ else:
+ previous_dependency_hashes = {}
+
+ for dependency_git_url in package["dependencies"]:
+ dependency_repo_name = "dependency-%s" % sanitize_filename(dependency_git_url)
+ dependency_repo_path = os.path.join(self.my_build_dir, dependency_repo_name)
+ dependency_git = Git(dependency_repo_path)
+ if dependency_git.exists():
+ dependency_git.pull()
+ else:
+ dependency_git.clone(dependency_git_url, package["branch"])
+
+ if dependency_git_url in previous_dependency_hashes:
+ my_previous_hash = previous_dependency_hashes[dependency_git_url]
else:
- raise
+ my_previous_hash = None
+
+ my_current_hash = dependency_git.get_last_commit_hash()
+ if my_previous_hash != my_current_hash:
+ up_to_date = False
+ break
+
+ if up_to_date and not self.force_build:
+ logging.info("Package is up to date, skipping build")
+ return
new = False
if repo_name not in self.updated_repos:
@@ -240,7 +270,9 @@ class PackageBuilder:
if "packages" in payload:
for package in payload["packages"]:
if "scm_url" in package:
- scm_url = replace_github_repo_org(package["scm_url"], self.clone_org, whitelist_orgs=["vyos", "VyOS-Networks"])
+ scm_url = replace_github_repo_org(
+ package["scm_url"], self.clone_org, whitelist_orgs=["vyos", "VyOS-Networks"]
+ )
if scm_url != package["scm_url"]:
changed = True
logging.info("Updating package.toml GIT url from %s to %s" % (package["scm_url"], scm_url))
--
cgit v1.2.3