From 498f8a7333a8fdecf7a527811d92249399a2d01a Mon Sep 17 00:00:00 2001 From: bryan Date: Mon, 28 Jul 2025 21:36:01 -0400 Subject: [PATCH] Use a global release object --- openwrtbuilder | 135 ++++++++++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 63 deletions(-) diff --git a/openwrtbuilder b/openwrtbuilder index d0f5b53..78515ab 100755 --- a/openwrtbuilder +++ b/openwrtbuilder @@ -315,6 +315,26 @@ install_dependencies() { fi } +# @description Determine the commit to use for the OpenWRT ImageBuilder or worktree +determine_wt_commit() { + local rel="$1" wt_commit branch tag + case "$rel" in + snapshot) wt_commit="main" ;; + [0-9][0-9].[0-9][0-9].*) + branch="openwrt-${rel%.*}" + tag="v$rel" + if ask_ok "Use $branch branch HEAD (y, recommended) or $tag tag (n)?"; then + wt_commit="$branch" + else + wt_commit="$tag" + fi + ;; + *) wt_commit="$rel" ;; + esac + echo "$wt_commit" +} + + # @description Acquires the OpenWRT Image Builder get_imagebuilder() { debug "${FUNCNAME[0]}" "$*" @@ -461,35 +481,41 @@ ssh_upgrade() { # @description Builds OpenWRT from source code using the the default buildbot as base # This enables the use of kernel config options in profiles # @arg $1 string .config seed URL +# @arg $2 string Profile name +# @arg $3 string Commit-ish or branch name from_source() { debug "${FUNCNAME[0]}" "$*" local seed_url="$1" + local profile="$2" + local wt_commit="$3" local src_url="https://github.com/openwrt/openwrt.git" - local seed_file="$WORKTREE_DIR/.config" - local worktree_name; worktree_name="$(basename "$WORKTREE_DIR")" - local worktree_meta="$SRC_DIR/.git/worktrees/$worktree_name" local pkg config commit seed_file wt_commit description local -a make_opts config_opts echo "Building from source is under development" - if ((DEBUG)); then - echo "Profile settings:" - for x in "${!P_ARR[@]}"; do printf "%s=%s\n" "$x" "${P_ARR[$x]}"; done - echo "Environment variables:" - declare -p + # Ensure branch exists locally (if it's a branch) + if git -C "$SRC_DIR" show-ref --verify --quiet "refs/heads/$wt_commit"; then + if ! git -C "$SRC_DIR" worktree list | grep -q "$wt_commit"; then + execute git -C "$SRC_DIR" fetch origin "$wt_commit:$wt_commit" + fi fi + local worktree_dir="$BUILD_ROOT/src/$profile/$wt_commit" + local seed_file="$worktree_dir/.config" + local worktree_meta="$SRC_DIR/.git/worktrees/$wt_commit" + + # existing RESET logic… if ((RESET)); then - if [[ -d "$WORKTREE_DIR" || -d "$worktree_meta" ]]; then - execute git -C "$SRC_DIR" worktree remove --force --force "$WORKTREE_DIR" - [[ -d "$WORKTREE_DIR" ]] && execute rm -rf "$WORKTREE_DIR" + if [[ -d "$worktree_dir" || -d "$worktree_meta" ]]; then + execute git -C "$SRC_DIR" worktree remove --force --force "$worktree_dir" + [[ -d "$worktree_dir" ]] && execute rm -rf "$worktree_dir" [[ -d "$worktree_meta" ]] && execute rm -rf "$worktree_meta" fi [[ -d "$BUILD_DIR" ]] && execute rm -rf "$BUILD_DIR" fi - # Pull or clone source code + # Pull or clone source repo if [[ -d "$SRC_DIR" ]]; then execute git -C "$SRC_DIR" worktree prune --verbose execute git -C "$SRC_DIR" pull @@ -498,66 +524,39 @@ from_source() { execute git clone "$src_url" "$SRC_DIR" fi - # Determine commit-ish for git worktree - case "$RELEASE" in - snapshot) wt_commit="main" ;; - [0-9][0-9].[0-9][0-9].*) - branch="openwrt-${RELEASE%.*}" - tag="v$RELEASE" - if ask_ok "Use $branch branch HEAD (y, recommended) or $tag tag (n)?"; then - wt_commit="$branch" - # Only fetch if branch is NOT checked out in any worktree - if ! git -C "$SRC_DIR" worktree list | grep -q "$branch"; then - execute git -C "$SRC_DIR" fetch origin "$branch:$branch" - fi - else - wt_commit="$tag" - fi - ;; - *) - debug "Passing '$RELEASE' commit-ish to git worktree" - wt_commit="$RELEASE" - if execute git -C "$SRC_DIR" show-ref --verify --quiet "refs/heads/$wt_commit"; then - if ! git -C "$SRC_DIR" worktree list | grep -q "$wt_commit"; then - execute git -C "$SRC_DIR" fetch origin "$wt_commit:$wt_commit" - fi - fi - ;; - esac - # Clean up orphaned worktree if needed - if [[ ! -d "$WORKTREE_DIR" || ! -d "$worktree_meta" ]]; then - [[ -d "$WORKTREE_DIR" ]] && execute rm -rf "$WORKTREE_DIR" + if [[ ! -d "$worktree_dir" || ! -d "$worktree_meta" ]]; then + [[ -d "$worktree_dir" ]] && execute rm -rf "$worktree_dir" [[ -d "$worktree_meta" ]] && execute rm -rf "$worktree_meta" execute git -C "$SRC_DIR" worktree prune --verbose fi # Add or update worktree - if [[ -d "$WORKTREE_DIR" && -d "$worktree_meta" ]]; then - execute git -C "$WORKTREE_DIR" checkout "$wt_commit" - # Only pull if wt_commit is a branch - if execute git -C "$SRC_DIR" show-ref --verify --quiet "refs/heads/$wt_commit"; then - execute git -C "$WORKTREE_DIR" pull + if [[ -d "$worktree_dir" && -d "$worktree_meta" ]]; then + execute git -C "$worktree_dir" checkout "$wt_commit" + # pull if wt_commit is a branch + if git -C "$SRC_DIR" show-ref --verify --quiet "refs/heads/$wt_commit"; then + execute git -C "$worktree_dir" pull fi else - # If wt_commit is a branch, do not use --detach - if execute git -C "$SRC_DIR" show-ref --verify --quiet "refs/heads/$wt_commit"; then - execute git -C "$SRC_DIR" worktree add "$WORKTREE_DIR" "$wt_commit" + # branch or tag? + if git -C "$SRC_DIR" show-ref --verify --quiet "refs/heads/$wt_commit"; then + execute git -C "$SRC_DIR" worktree add "$worktree_dir" "$wt_commit" else - execute git -C "$SRC_DIR" worktree add --detach "$WORKTREE_DIR" "$wt_commit" + execute git -C "$SRC_DIR" worktree add --detach "$worktree_dir" "$wt_commit" fi fi - # Print commit information from state - commit=$(git -C "$WORKTREE_DIR" rev-parse HEAD) - description=$(git -C "$WORKTREE_DIR" describe) + # Print commit info + commit=$(git -C "$worktree_dir" rev-parse HEAD) + description=$(git -C "$worktree_dir" describe) echo "Current commit hash: $commit" echo "Git worktree description: $description" - - ((DEBUG)) && git --no-pager -C "$WORKTREE_DIR" log -1 + + ((DEBUG)) && git --no-pager -C "$worktree_dir" log -1 # Enter worktree - execute pushd "$WORKTREE_DIR" || return 1 + execute pushd "$worktree_dir" || return 1 # Begin OpenWRT build process ((DEBUG)) && make_opts+=("V=sc") @@ -750,6 +749,7 @@ main() { install_dependencies + # Run selected profiles for profile in "${PROFILES[@]}"; do debug "Running profile: $profile" @@ -764,11 +764,11 @@ main() { declare -g TARGET="${P_ARR[target]}" declare -g DEVICE="${P_ARR[device]}" declare -g PACKAGES="${P_ARR[packages]:-}" - declare -g RELEASE="${USER_RELEASE:=${P_ARR[release]:=$RELEASE}}" # normalize RELEASE - case "$RELEASE" in - snapshot|latest|main|master) RELEASE="snapshot" ;; + local normalized + case "${USER_RELEASE:=${P_ARR[release]:=$RELEASE}}" in + snapshot|latest|main|master) normalized="snapshot" ;; v[0-9][0-9].[0-9][0-9].*) RELEASE="${RELEASE#v}" ;; [0-9][0-9].[0-9][0-9].*) ;; *) @@ -779,11 +779,20 @@ main() { fi ;; esac + declare -g RELEASE="$normalized" + local ref mode + if (( FROM_SOURCE )); then + ref=$(determine_wt_commit "$RELEASE") + mode="source" + else + ref="$RELEASE" + mode="imagebuilder" + fi + declare -g SRC_DIR="$BUILD_ROOT/src/openwrt" - declare -g WORKTREE_DIR="$BUILD_ROOT/src/$profile/$RELEASE-src" - declare -g BUILD_DIR="$BUILD_ROOT/src/$profile/$RELEASE" - declare -g BIN_DIR="$BUILD_ROOT/bin/$profile/$RELEASE" + declare -g BUILD_DIR="$BUILD_ROOT/src/$profile/$mode-$ref" + declare -g BIN_DIR="$BUILD_ROOT/bin/$profile/$mode-$ref" if [[ "$RELEASE" == "snapshot" ]]; then local url_prefix="https://downloads.openwrt.org/snapshots/targets/$TARGET" @@ -810,7 +819,7 @@ main() { backup "$SYSUPGRADEIMGGZ" "$BACKUP_DIR/$profile/$RELEASE" if ((FROM_SOURCE)); then - from_source "$seed_url" || return $? + from_source "$seed_url" "$profile" "$ref" || return $? else [[ -d $BUILD_DIR ]] || mkdir -p "$BUILD_DIR" get_imagebuilder "$ib_url" "$ib_file" "$ib_sha256_url" "$ib_sha256_file" &&