Skip to content

Commit 7243242

Browse files
partoufclaude
andcommitted
Fix Windows properties generation to use Linux version IDs
When generating Windows C++ properties, version IDs are now looked up from the Linux properties file rather than regenerated from YAML version strings. This prevents mismatches like BDE getting "43100" instead of the existing "431". The merge logic also now matches versions by their .version value, so updating an existing properties file won't create duplicate entries when the version ID format differs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 0ba9fd9 commit 7243242

2 files changed

Lines changed: 68 additions & 9 deletions

File tree

bin/lib/library_props.py

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,36 @@ def version_sort_key(v):
155155
# Preserve existing name and url properties instead of overwriting
156156
if prop_name in ("name", "url"):
157157
result_lines.append(line)
158+
elif prop_name == "versions":
159+
# Merge version lists: keep existing IDs, add only genuinely new versions
160+
_, existing_ver_str = stripped.split("=", 1)
161+
existing_ver_ids = existing_ver_str.split(":") if existing_ver_str else []
162+
new_ver_ids = library_properties[prop_name].split(":")
163+
164+
# Build a map of version value -> existing ID from the file
165+
existing_value_to_id = {}
166+
for eid in existing_ver_ids:
167+
ver_prop = f"versions.{eid}.version"
168+
ekey = generate_library_property_key(library_name, ver_prop)
169+
for eline in lines:
170+
if eline.strip().startswith(ekey + "="):
171+
existing_value_to_id[eline.strip().split("=", 1)[1]] = eid
172+
break
173+
174+
# Map new IDs to their version values
175+
new_id_to_value = {}
176+
for nid in new_ver_ids:
177+
ver_prop = f"versions.{nid}.version"
178+
new_id_to_value[nid] = library_properties.get(ver_prop, "")
179+
180+
# Merge: keep existing list, append only versions not already present by value
181+
merged = list(existing_ver_ids)
182+
for nid in new_ver_ids:
183+
ver_value = new_id_to_value.get(nid, "")
184+
if ver_value not in existing_value_to_id and nid not in existing_ver_ids:
185+
merged.append(nid)
186+
187+
result_lines.append(f"{key}={':'.join(merged)}")
158188
else:
159189
result_lines.append(f"{key}={library_properties[prop_name]}")
160190
else:
@@ -165,10 +195,35 @@ def version_sort_key(v):
165195

166196
result_lines.append(line)
167197

198+
# Collect existing version values (e.g., "1.85.0") to avoid duplicates when version IDs differ
199+
existing_version_values = set()
200+
for prop_name in seen_props:
201+
if prop_name.startswith("versions.") and prop_name.endswith(".version"):
202+
ver_id = prop_name.split(".")[1]
203+
existing_key = generate_library_property_key(library_name, prop_name)
204+
for line in lines:
205+
stripped = line.strip()
206+
if stripped.startswith(existing_key + "="):
207+
existing_version_values.add(stripped.split("=", 1)[1])
208+
break
209+
168210
props_to_add = []
169211
for prop_name, value in library_properties.items():
170-
if prop_name not in seen_props and not prop_name.startswith("_"):
171-
props_to_add.append((prop_name, value))
212+
if prop_name.startswith("_"):
213+
continue
214+
if prop_name in seen_props:
215+
continue
216+
# Skip version properties whose .version value already exists under a different ID
217+
if prop_name.startswith("versions.") and prop_name.endswith(".version") and value in existing_version_values:
218+
continue
219+
# Skip other per-version properties (path, staticliblink, etc.) if that version value exists
220+
if prop_name.startswith("versions.") and not prop_name.endswith(".version") and prop_name != "versions":
221+
ver_id = prop_name.split(".")[1]
222+
version_prop = f"versions.{ver_id}.version"
223+
version_value = library_properties.get(version_prop, "")
224+
if version_value in existing_version_values:
225+
continue
226+
props_to_add.append((prop_name, value))
172227

173228
if props_to_add:
174229
if last_library_line_idx >= 0:

bin/lib/library_yaml.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,15 @@ def add_top_rust_crates(self):
8282
for crate in crates:
8383
self.add_rust_crate(crate["libid"], crate["libversion"])
8484

85-
def get_libverid(self, libver) -> str:
85+
def get_libverid(self, libver, linux_lib=None) -> str:
8686
if isinstance(libver, dict) and "name" in libver:
8787
version_name = libver["name"]
8888
else:
8989
version_name = libver
90+
if linux_lib and "versionprops" in linux_lib:
91+
for ver_id, ver_props in linux_lib["versionprops"].items():
92+
if ver_props.get("version") == version_name:
93+
return ver_id
9094
return version_to_id(version_name)
9195

9296
def get_libvername(self, libver) -> str:
@@ -198,13 +202,13 @@ def get_ce_properties_for_cpp_windows_libraries(self, logger) -> str:
198202
if yamllibid in libraries_for_language:
199203
if "targets" in libraries_for_language[yamllibid]:
200204
for libver in libraries_for_language[yamllibid]["targets"]:
201-
all_libver_ids.append(self.get_libverid(libver))
205+
all_libver_ids.append(self.get_libverid(libver, linux_lib))
202206
if yamllibid in nightly_libraries_for_language:
203207
if not isinstance(nightly_libraries_for_language[yamllibid], dict):
204208
continue
205209
if "targets" in nightly_libraries_for_language[yamllibid]:
206210
for libver in nightly_libraries_for_language[yamllibid]["targets"]:
207-
all_libver_ids.append(self.get_libverid(libver))
211+
all_libver_ids.append(self.get_libverid(libver, linux_lib))
208212

209213
versions_property_key = generate_library_property_key(linux_libid, "versions")
210214
libverprops += f"{versions_property_key}="
@@ -218,10 +222,10 @@ def get_ce_properties_for_cpp_windows_libraries(self, logger) -> str:
218222
if yamllibid in libraries_for_language:
219223
if "targets" in libraries_for_language[yamllibid]:
220224
for libver in libraries_for_language[yamllibid]["targets"]:
221-
all_libver_ids.append(self.get_libverid(libver))
225+
all_libver_ids.append(self.get_libverid(libver, linux_lib))
222226

223227
for libver in libraries_for_language[yamllibid]["targets"]:
224-
libverid = self.get_libverid(libver)
228+
libverid = self.get_libverid(libver, linux_lib)
225229
libvername = self.get_libvername(libver)
226230
version_property_key = generate_version_property_key(linux_libid, libverid, "version")
227231
libverprops += f"{version_property_key}={libvername}\n"
@@ -242,10 +246,10 @@ def get_ce_properties_for_cpp_windows_libraries(self, logger) -> str:
242246
continue
243247
if "targets" in nightly_libraries_for_language[yamllibid]:
244248
for libver in nightly_libraries_for_language[yamllibid]["targets"]:
245-
all_libver_ids.append(self.get_libverid(libver))
249+
all_libver_ids.append(self.get_libverid(libver, linux_lib))
246250

247251
for libver in nightly_libraries_for_language[yamllibid]["targets"]:
248-
libverid = self.get_libverid(libver)
252+
libverid = self.get_libverid(libver, linux_lib)
249253
libvername = self.get_libvername(libver)
250254
version_property_key = generate_version_property_key(linux_libid, libverid, "version")
251255
libverprops += f"{version_property_key}={libvername}\n"

0 commit comments

Comments
 (0)