1 From 20a1c652f61437ac35ce85ef8a66ae93fd64b3d0 Mon Sep 17 00:00:00 20012 From: gl0w <gl0w@world>3 Date: Thu, 10 Sep 2026 07:33:15 +01004 Subject: [PATCH] m6/readme-bug: extensionless chain + regression tests5 6 ---7 src/build.rs | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++--8 1 file changed, 78 insertions(+), 2 deletions(-)9 10 diff --git a/src/build.rs b/src/build.rs11 index 5083fa7..0cf0a67 10064412 --- a/src/build.rs13 +++ b/src/build.rs14 @@ -147,8 +147,9 @@ pub fn resolve_clone_url(repo: &Path, flag: Option<&str>) -> Option<String> {15 }16 17 /// README lookup chain (f0rge convention): repo-root `README.md` >18 -/// `readme.md` > `README`, else `.forge/wiki/README.md` >19 -/// `.forge/wiki/readme.md`, else none.20 +/// `readme.md` > `README` > `readme`, else `.forge/wiki/README.md` >21 +/// `.forge/wiki/readme.md` > `.forge/wiki/README` > `.forge/wiki/readme`,22 +/// else none.23 ///24 /// Returns the winning path plus its blob.25 pub fn find_readme(repo: &Path, branch: &str) -> Option<(String, gitx::Blob)> {26 @@ -156,8 +157,11 @@ pub fn find_readme(repo: &Path, branch: &str) -> Option<(String, gitx::Blob)> {27 "README.md",28 "readme.md",29 "README",30 + "readme",31 ".forge/wiki/README.md",32 ".forge/wiki/readme.md",33 + ".forge/wiki/README",34 + ".forge/wiki/readme",35 ] {36 if let Ok(blob) = gitx::show(repo, branch, Path::new(candidate)) {37 return Some((candidate.to_string(), blob));38 @@ -946,6 +950,78 @@ mod tests {39 assert_eq!(path, "README.md");40 }41 42 + #[test]43 + fn readme_chain_shows_extensionless_wiki_readme() {44 + let dir = mktemp("readme-extless");45 + git(&dir, &["init", "-b", "main"]);46 + git(&dir, &["config", "user.name", "hu13-test"]);47 + git(&dir, &["config", "user.email", "[email protected]"]);48 + git(&dir, &["config", "commit.gpgsign", "false"]);49 + // Extensionless wiki README only (f0rge issue #35).50 + std::fs::create_dir_all(dir.join(".forge").join("wiki")).unwrap();51 + std::fs::write(52 + dir.join(".forge").join("wiki").join("README"),53 + "# Wiki extless\n",54 + )55 + .unwrap();56 + std::fs::write(dir.join("notes.txt"), "x\n").unwrap();57 + git(&dir, &["add", "-A"]);58 + git(&dir, &["commit", "-m", "wiki extless only"]);59 + let (path, _) = find_readme(&dir, "main").expect("wiki extless fallback");60 + assert_eq!(path, ".forge/wiki/README");61 + // Code tab renders it.62 + let out = mktemp("out-extless");63 + run_build(&dir, &out, &opts()).expect("build");64 + let index = std::fs::read_to_string(out.join("index.html")).expect("index");65 + assert!(index.contains("Wiki extless"), "code tab shows wiki README");66 + assert!(67 + index.contains("from <code>.forge/wiki/README</code>"),68 + "code tab names source"69 + );70 + }71 +72 + #[test]73 + fn readme_chain_full_priority_order() {74 + let dir = mktemp("readme-priority");75 + git(&dir, &["init", "-b", "main"]);76 + git(&dir, &["config", "user.name", "hu13-test"]);77 + git(&dir, &["config", "user.email", "[email protected]"]);78 + git(&dir, &["config", "commit.gpgsign", "false"]);79 + let chain = [80 + "README.md",81 + "readme.md",82 + "README",83 + "readme",84 + ".forge/wiki/README.md",85 + ".forge/wiki/readme.md",86 + ".forge/wiki/README",87 + ".forge/wiki/readme",88 + ];89 + std::fs::create_dir_all(dir.join(".forge").join("wiki")).unwrap();90 + for (i, cand) in chain.iter().enumerate() {91 + std::fs::write(dir.join(cand), format!("# marker {i}\n")).unwrap();92 + }93 + std::fs::write(dir.join("notes.txt"), "x\n").unwrap();94 + git(&dir, &["add", "-A"]);95 + git(&dir, &["commit", "-m", "all readmes"]);96 + for (i, want) in chain.iter().enumerate() {97 + let (path, blob) = find_readme(&dir, "main").expect("readme present");98 + assert_eq!(&path, want, "priority position {i}");99 + assert!(100 + blob.display.contains(&format!("marker {i}")),101 + "winning body at {want}"102 + );103 + // Root extensionless beats wiki once wiki-only remains.104 + if *want == "readme" {105 + let (p, _) = find_readme(&dir, "main").expect("root extless");106 + assert_eq!(p, "readme");107 + }108 + git(&dir, &["rm", "-q", want]);109 + git(&dir, &["commit", "-m", &format!("drop {want}")]);110 + }111 + assert!(find_readme(&dir, "main").is_none(), "none when chain empty");112 + }113 +114 #[test]115 fn build_emits_commits_and_wiki() {116 let repo = fixture_repo();117 -- 118 2.55.0119