66version, so we fill it each build, like intros and changelogs.
77
88The value is the tracked version from .llm_cache/versions.json, looked up via the
9- original-filename field. No record yet -> {major}.0.0 from the _vN.qmd name. No
9+ original-filename field. The doc's own `version:` frontmatter is never trusted as
10+ input - it is output we overwrite. No record yet -> seed one (max(major,1).0.0,
11+ so a _v0 or a name without _vN starts at 1.0.0) so the doc becomes tracked. No
1012bump is computed here.
1113"""
1214
1315import argparse
16+ import json
1417import re
1518import sys
19+ from datetime import date
1620from pathlib import Path
1721
1822sys .path .insert (0 , str (Path (__file__ ).resolve ().parents [1 ])) # .github/scripts
1923from helpers .json_io import load_json_or_empty
24+ from helpers .doc_types import element_off
2025
2126VERSIONS_FILE = ".llm_cache/versions.json"
2227
@@ -68,7 +73,8 @@ def main():
6873 vf = Path (args .versions_file ) if args .versions_file else repo_root / VERSIONS_FILE
6974 versions = load_json_or_empty (vf , label = "versions" )
7075
71- filled = baseline = 0
76+ filled = baseline = seeded = 0
77+ today = date .today ().isoformat ()
7278 for qmd in sorted (Path (args .docs_dir ).rglob ("*.qmd" )):
7379 if {"_site" , ".quarto" , "_meta" } & set (qmd .parts ):
7480 continue
@@ -78,32 +84,54 @@ def main():
7884 continue
7985 _ , end = bounds
8086
81- src = fm_value (lines , end , "original-filename" )
82- major = major_from_name (src ) if src else None
83- if major is None :
84- major = major_from_name (qmd .name )
85- if major is None :
86- print (f"[fill_version] { qmd } : no _vN in filename, skipping" )
87+ # version-off types keep their own `version:` header, if any; don't touch.
88+ if element_off (fm_value (lines , end , "type" ), "version" ):
8789 continue
8890
91+ src = fm_value (lines , end , "original-filename" )
92+ mj = major_from_name (src ) if src else None
93+ if mj is None :
94+ mj = major_from_name (qmd .name )
95+ # First published version is 1.0.0: a _v0 or a name without _vN starts
96+ # at 1.0.0, while _v4 etc. keep their filename major.
97+ baseline_major = max (mj , 1 ) if mj is not None else 1
98+
99+ key = f"DOCS/{ src } " if src else None
89100 tracked = None
90- if src :
91- entry = versions .get (f"DOCS/ { src } " ) or versions .get (src )
101+ if key :
102+ entry = versions .get (key ) or versions .get (src )
92103 tracked = (entry or {}).get ("current_version" )
93104
94- if tracked and tracked .split ("." )[0 ] == str (major ):
105+ if tracked and ( mj is None or tracked .split ("." )[0 ] == str (mj ) ):
95106 version = tracked
96107 else :
97- version = f"{ major } .0.0"
108+ version = f"{ baseline_major } .0.0"
98109 baseline += 1
110+ # No record yet: seed one so the doc becomes tracked, rather than
111+ # re-deriving the fallback every build. Keyed by original-filename.
112+ if key and key not in versions :
113+ versions [key ] = {
114+ "current_version" : version ,
115+ "last_bump" : "initial" ,
116+ "last_bump_reason" : "First release" ,
117+ "last_release_tag" : "initial" ,
118+ "last_updated" : today ,
119+ "major_from_filename" : baseline_major ,
120+ }
121+ seeded += 1
99122
100123 if set_version (lines , end , version ):
101124 qmd .write_text ("" .join (lines ), encoding = "utf-8" )
102125 filled += 1
103126
127+ if seeded :
128+ vf .parent .mkdir (parents = True , exist_ok = True )
129+ with vf .open ("w" , encoding = "utf-8" ) as f :
130+ json .dump (versions , f , indent = 2 , sort_keys = True )
131+
104132 print (
105133 f"[fill_version] set version on { filled } files "
106- f"({ baseline } fell back to {{ major}} .0.0)"
134+ f"({ baseline } used max( major,1) .0.0 baseline, { seeded } new cache entries )"
107135 )
108136
109137
0 commit comments