components: reuse existing git tree in components_download_git; config: update packages.list

This commit is contained in:
2025-10-01 17:47:51 +02:00
parent 4ca68ac0f7
commit 6193d241ea
7 changed files with 104 additions and 35 deletions

View File

@@ -46,7 +46,7 @@ function components_parse_sources_conf() {
# Component 2: mycelium
component_count=$((component_count + 1))
log_info "Processing component ${component_count}: mycelium (git)"
components_download_git "mycelium" "https://github.com/threefoldtech/mycelium" "v0.6.1" "$components_dir"
components_download_git "mycelium" "https://github.com/threefoldtech/mycelium" "v0.6.2" "$components_dir"
components_build_component "mycelium" "build_mycelium" "$components_dir"
# Component 3: rfs (pre-built release)
@@ -68,36 +68,106 @@ function components_parse_sources_conf() {
fi
}
# Download Git repository
# Download Git repository (reuse tree; only reclone if invalid or version not reachable)
function components_download_git() {
local name="$1"
local url="$2"
local version="$3"
local components_dir="$4"
section_header "Downloading Git Component: ${name}"
local target_dir="${components_dir}/${name}"
log_info "Repository: ${url}"
log_info "Version/Branch: ${version}"
log_info "Version/Branch/Tag: ${version}"
log_info "Target directory: ${target_dir}"
# Always do fresh clone to avoid git state issues
if [[ -d "$target_dir" ]]; then
log_info "Removing existing ${name} directory for fresh clone"
safe_execute rm -rf "$target_dir"
# Ensure parent exists
safe_mkdir "$components_dir"
# Decide whether we can reuse the existing working tree
local need_fresh_clone="0"
if [[ -d "$target_dir/.git" ]]; then
if ! git -C "$target_dir" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
log_warn "Existing ${name} directory is not a valid git repo; will reclone"
need_fresh_clone="1"
fi
elif [[ -d "$target_dir" ]]; then
log_warn "Existing ${name} directory without .git; will reclone"
need_fresh_clone="1"
fi
log_info "Cloning ${name} from ${url}"
safe_execute git clone --depth 1 --branch "$version" "$url" "$target_dir"
# Verify checkout
safe_execute cd "$target_dir"
local current_ref=$(git rev-parse HEAD)
log_info "Current commit: ${current_ref}"
log_info "Git component download complete: ${name}"
if [[ "$need_fresh_clone" == "1" || ! -d "$target_dir" ]]; then
log_info "Cloning ${name} (fresh) from ${url}"
safe_execute git clone "$url" "$target_dir"
fi
# Ensure origin URL is correct (do not delete the tree if URL changed)
local current_url
current_url=$(git -C "$target_dir" remote get-url origin 2>/dev/null || echo "")
if [[ -n "$current_url" && "$current_url" != "$url" ]]; then
log_info "Updating origin URL: ${current_url} -> ${url}"
safe_execute git -C "$target_dir" remote set-url origin "$url"
elif [[ -z "$current_url" ]]; then
log_info "Setting origin URL to ${url}"
safe_execute git -C "$target_dir" remote add origin "$url" || true
fi
# Fetch updates and tags
safe_execute git -C "$target_dir" fetch --tags --prune origin
# Resolve desired commit for the requested version/branch/tag
local desired_rev=""
if git -C "$target_dir" rev-parse --verify "${version}^{commit}" >/dev/null 2>&1; then
desired_rev=$(git -C "$target_dir" rev-parse --verify "${version}^{commit}")
elif git -C "$target_dir" rev-parse --verify "origin/${version}^{commit}" >/dev/null 2>&1; then
desired_rev=$(git -C "$target_dir" rev-parse --verify "origin/${version}^{commit}")
else
log_warn "Version '${version}' not directly resolvable; fetching explicitly"
if git -C "$target_dir" fetch origin "${version}" --depth 1; then
desired_rev=$(git -C "$target_dir" rev-parse --verify FETCH_HEAD)
fi
fi
# Fallback: shallow clone at the requested ref if we still can't resolve
if [[ -z "$desired_rev" ]]; then
log_warn "Could not resolve revision for '${version}'. Performing fresh shallow clone at requested ref."
safe_execute rm -rf "${target_dir}.tmp"
if safe_execute git clone --depth 1 --branch "$version" "$url" "${target_dir}.tmp"; then
safe_execute rm -rf "$target_dir"
safe_execute mv "${target_dir}.tmp" "$target_dir"
desired_rev=$(git -C "$target_dir" rev-parse HEAD)
else
log_error "Failed to clone ${url} at '${version}'"
return 1
fi
fi
local current_rev
current_rev=$(git -C "$target_dir" rev-parse HEAD 2>/dev/null || echo "")
log_info "Current commit: ${current_rev:-<none>}"
log_info "Desired commit: ${desired_rev}"
if [[ -n "$current_rev" && "$current_rev" == "$desired_rev" ]]; then
log_info "Repository already at requested version; reusing working tree"
else
log_info "Checking out requested version"
# Prefer named refs when available; otherwise detach to exact commit
if git -C "$target_dir" show-ref --verify --quiet "refs/heads/${version}"; then
safe_execute git -C "$target_dir" checkout -f "${version}"
elif git -C "$target_dir" show-ref --verify --quiet "refs/remotes/origin/${version}"; then
safe_execute git -C "$target_dir" checkout -f -B "${version}" "origin/${version}"
elif git -C "$target_dir" show-ref --verify --quiet "refs/tags/${version}"; then
safe_execute git -C "$target_dir" checkout -f "tags/${version}"
else
safe_execute git -C "$target_dir" checkout -f --detach "${desired_rev}"
fi
# Initialize submodules if present (non-fatal)
safe_execute git -C "$target_dir" submodule update --init --recursive || true
fi
log_info "Git component ready: ${name} @ $(git -C "$target_dir" rev-parse --short HEAD)"
}
# Download release binary/archive