.forge/prs/cbb4c8a3-6287-4cc7-83a7-d90e6a28580f/patch.diff 4.7 KiB 119 lines Raw
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