@@ -80,13 +80,14 @@ cd "${REPO_ROOT}"
8080# # Resolve and pin the latest compatible version of the codeql/<lang>-all
8181# # upstream dependency in a source pack's codeql-pack.yml.
8282# #
83- # # Uses `codeql resolve library-path --format=json` to discover the version
84- # # that the current CLI resolves for the pack, then updates codeql-pack.yml
85- # # to pin that exact version. Packs with wildcard or range dependencies
86- # # (e.g., '*') are skipped — those intentionally float.
83+ # # Strategy: run `codeql pack upgrade` first to resolve the latest compatible
84+ # # version into the lock file, then read the resolved version back and update
85+ # # the codeql-pack.yml to pin that exact version. Packs with wildcard
86+ # # dependencies (e.g., '*') are skipped — those intentionally float.
8787pin_upstream_dep () {
8888 local pack_dir=" $1 "
8989 local pack_yml=" ${pack_dir} /codeql-pack.yml"
90+ local lock_file=" ${pack_dir} /codeql-pack.lock.yml"
9091
9192 if [[ ! -f " ${pack_yml} " ]]; then
9293 return
@@ -104,43 +105,36 @@ pin_upstream_dep() {
104105 dep_name=$( echo " ${dep_line} " | sed ' s/^[[:space:]]*//' | cut -d: -f1)
105106 dep_old_version=$( echo " ${dep_line} " | sed ' s/^[^:]*:[[:space:]]*//' )
106107
107- # # Skip wildcard/range dependencies — these intentionally float
108- if [[ " ${dep_old_version} " == * " *" * || " ${dep_old_version} " == * " ^ " * || " ${dep_old_version} " == * " > " * ]]; then
109- echo " ℹ️ ${dep_name} : ${dep_old_version} (wildcard/range — skipping)"
108+ # # Skip wildcard dependencies — these intentionally float
109+ if [[ " ${dep_old_version} " == * " *" * ]]; then
110+ echo " ℹ️ ${dep_name} : ${dep_old_version} (wildcard — skipping)"
110111 return
111112 fi
112113
113- # # Resolve the library path to discover the version the CLI selects.
114- # # The JSON output contains a libraryPath array with entries like:
115- # # /path/.codeql/packages/codeql/javascript-all/2.6.26
116- # # We extract the version from the path segment matching the dep name.
117- local resolved_version=" "
118- local lib_path_json
119- lib_path_json=$( codeql resolve library-path --format=json --dir=" ${pack_dir} " 2> /dev/null || true)
120- if [[ -n " ${lib_path_json} " ]]; then
121- resolved_version=$( echo " ${lib_path_json} " \
122- | python3 -c "
123- import json, sys, os
124- data = json.load(sys.stdin)
125- for p in data.get('libraryPath', []):
126- parts = p.split(os.sep)
127- for i in range(len(parts) - 2):
128- if parts[i] + '/' + parts[i+1] == '${dep_name} ':
129- print(parts[i+2])
130- sys.exit(0)
131- " 2> /dev/null || true)
114+ # # Run codeql pack upgrade to resolve the latest compatible version
115+ codeql pack upgrade -- " ${pack_dir} " > /dev/null 2>&1
116+
117+ if [[ ! -f " ${lock_file} " ]]; then
118+ echo " ⚠️ No lock file after upgrade for ${pack_dir} " >&2
119+ return
132120 fi
133121
134- if [[ -n " ${resolved_version} " ]]; then
135- if [[ " ${dep_old_version} " != " ${resolved_version} " ]]; then
136- sed -i.bak " s|${dep_name} : ${dep_old_version} |${dep_name} : ${resolved_version} |" " ${pack_yml} "
137- rm -f " ${pack_yml} .bak"
138- echo " ✅ ${dep_name} : ${dep_old_version} -> ${resolved_version} "
139- else
140- echo " ✅ ${dep_name} : ${resolved_version} (already current)"
141- fi
122+ # # Read the resolved version from the lock file
123+ local resolved_version
124+ resolved_version=$( awk " /${dep_name// \/ / \\ / } :/{getline; print}" " ${lock_file} " \
125+ | sed ' s/.*version:[[:space:]]*//' | head -1)
126+
127+ if [[ -z " ${resolved_version} " ]]; then
128+ echo " ⚠️ ${dep_name} : not found in lock file, kept ${dep_old_version} " >&2
129+ return
130+ fi
131+
132+ if [[ " ${dep_old_version} " != " ${resolved_version} " ]]; then
133+ sed -i.bak " s|${dep_name} : ${dep_old_version} |${dep_name} : ${resolved_version} |" " ${pack_yml} "
134+ rm -f " ${pack_yml} .bak"
135+ echo " ✅ ${dep_name} : ${dep_old_version} -> ${resolved_version} "
142136 else
143- echo " ⚠️ Could not resolve version for ${dep_name} , kept ${dep_old_version} " >&2
137+ echo " ✅ ${dep_name} : ${resolved_version} (already current) "
144138 fi
145139}
146140
@@ -149,10 +143,8 @@ upgrade_packs() {
149143 local _parent_dir=" $1 "
150144
151145 if [[ -d " ${_parent_dir} /src" ]]; then
152- echo " INFO: Resolving latest upstream dependency for '${_parent_dir} /src'..."
146+ echo " INFO: Upgrading '${_parent_dir} /src'..."
153147 pin_upstream_dep " ${_parent_dir} /src"
154- echo " INFO: Running 'codeql pack upgrade' for '${_parent_dir} /src'..."
155- codeql pack upgrade -- " ${_parent_dir} /src"
156148 else
157149 echo " WARNING: Directory '${_parent_dir} /src' not found, skipping" >&2
158150 fi
0 commit comments