startgit

Static page generator for git repositories
git clone git://git.dimitrijedobrota.com/startgit.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING

commit a960be80d740c029eb8c993da04efc672ebf124f
parent 0a4d95ebffd7f38581531b5f617c018d30b0eea7
author Dimitrije Dobrota <mail@dimitrijedobrota.com>
date Mon, 13 Jan 2025 14:00:51 +0100

Separate branches in its own directory

Diffstat:
M CMakeLists.txt | + -
M source/main.cpp | ++++++++++++++++++++++++++++++++++++++++++++++ ------------------------------------

2 files changed, 50 insertions(+), 39 deletions(-)


diff --git a/ CMakeLists.txt b/ CMakeLists.txt

@@ -4,7 +4,7 @@ include(cmake/prelude.cmake) project( startgit
VERSION 0.1.13
VERSION 0.1.14
DESCRIPTION "Static page generator for git repositories" HOMEPAGE_URL "https://git.dimitrijedobrota.com/stargit.git" LANGUAGES CXX

diff --git a/ source/main.cpp b/ source/main.cpp

@@ -36,7 +36,6 @@ std::string long_to_string(const git2wrap::time& time) strs << std::format("{:02}{:02}", time.offset / 60, time.offset % 60); return strs.str(); }
// NOLINTBEGIN // clang-format off

@@ -116,12 +115,17 @@ void write_header(std::ostream& ost, .set("href", "https://dimitrijedobrota.com/css/colors.css")) // Icons
.add(html::link({{"rel", "icon"}, {"type", "image/png"}})
.set("sizes", "32x32")
.set("href", "/img/favicon-32x32.png"))
.add(html::link({{"rel", "icon"}, {"type", "image/png"}})
.set("sizes", "16x16")
.set("href", "/img/favicon-16x16.png"));
.add(
html::link({{"rel", "icon"}, {"type", "image/png"}})
.set("sizes", "32x32")
.set("href",
"https://dimitrijedobrota.com/img/favicon-32x32.png"))
.add(
html::link({{"rel", "icon"}, {"type", "image/png"}})
.set("sizes", "16x16")
.set(
"href",
"https://dimitrijedobrota.com/img/favicon-16x16.png"));
ost << html::body(); ost << html::input() .set("type", "checkbox")

@@ -137,7 +141,8 @@ void write_header(std::ostream& ost, void write_title(std::ostream& ost, const startgit::repository& repo,
const std::string& branch_name)
const std::string& branch_name,
bool no_nav = false)
{ using namespace hemplate; // NOLINT

@@ -169,19 +174,22 @@ void write_title(std::ostream& ost, html::td() .add(html::text("git clone ")) .add(html::a(repo.get_url()).set("href", repo.get_url())));
ost << html::tr().add(
html::td()
.add(html::a("Log").set("href", branch_name + "_log.html"))
.add(html::text(" | "))
.add(html::a("Files").set("href", branch_name + "_files.html"))
.add(html::text(" | "))
.add(html::a("Refs").set("href", branch_name + "_refs.html"))
.add(html::text(" | "))
.add(html::a("README").set("href", "./"))
.add(html::text(" | "))
.add(html::a("LICENCE").set("href", "./"))
.add(html::text(" | "))
.add(dropdown));
if (!no_nav) {
ost << html::tr().add(html::td()
.add(html::a("Log").set("href", "log.html"))
.add(html::text(" | "))
.add(html::a("Files").set("href", "files.html"))
.add(html::text(" | "))
.add(html::a("Refs").set("href", "refs.html"))
.add(html::text(" | "))
.add(html::a("README").set("href", "./"))
.add(html::text(" | "))
.add(html::a("LICENCE").set("href", "./"))
.add(html::text(" | "))
.add(dropdown));
}
ost << html::table(); ost << html::hr(); }

@@ -204,7 +212,7 @@ void write_commit_table(std::ostream& ost, git2wrap::revwalk& rwalk) while (const auto commit = rwalk.next()) { const auto url =
std::format("./commit/{}.html", commit.get_id().get_hex_string(22));
std::format("../commit/{}.html", commit.get_id().get_hex_string(22));
const auto ptree = commit.get_parentcount() > 0 ? commit.get_parent().get_tree()

@@ -256,7 +264,7 @@ void write_repo_table(std::ostream& ost, ost << html::tr() .add(html::td().add( html::a(repo.get_name())
.set("href", repo.get_name() + "/master_log.html")))
.set("href", repo.get_name() + "/master/log.html")))
.add(html::td(repo.get_description())) .add(html::td(repo.get_owner())) .add(html::td(

@@ -500,12 +508,15 @@ void write_footer(std::ostream& ost) ost << html::main(); ost << html::div();
ost << html::script(" ").set("src", "/scripts/main.js");
ost << html::script(" ").set(
"src", "https://www.dimitrijedobrota.com/scripts/main.js");
ost << html::script(
"function switchPage(value) { "
"history.replaceState(history.state, '', value + "
"window.location.href.substring(window.location.href.lastIndexOf('_'))); "
"location.reload();}");
"function switchPage(value) {"
" let arr = window.location.href.split('/');"
" arr[4] = value;"
" history.replaceState(history.state, '', arr.join('/'));"
" location.reload();"
"}");
ost << html::style( " table { " " margin-left: 0;"

@@ -534,8 +545,7 @@ void write_log(const std::filesystem::path& base, const startgit::repository& repo, const startgit::branch& branch) {
const std::string filename = branch.get_name() + "_log.html";
std::ofstream ofs(base / filename);
std::ofstream ofs(base / "log.html");
git2wrap::revwalk rwalk(repo.get());

@@ -556,8 +566,7 @@ void write_files(const std::filesystem::path& base, const startgit::repository& repo, const startgit::branch& branch) {
const std::string filename = branch.get_name() + "_files.html";
std::ofstream ofs(base / filename);
std::ofstream ofs(base / "files.html");
const git2wrap::object obj = repo.get().revparse(branch.get_name().c_str()); const git2wrap::commit commit = repo.get().commit_lookup(obj.get_id());

@@ -576,8 +585,7 @@ void write_refs(const std::filesystem::path& base, const startgit::repository& repo, const startgit::branch& branch) {
const std::string filename = branch.get_name() + "_refs.html";
std::ofstream ofs(base / filename);
std::ofstream ofs(base / "refs.html");
const git2wrap::object obj = repo.get().revparse(branch.get_name().c_str()); const git2wrap::commit commit = repo.get().commit_lookup(obj.get_id());

@@ -619,7 +627,7 @@ void write_commits(const std::filesystem::path& base, branch.get_name(), "Dimitrije Dobrota", commit.get_summary());
write_title(ofs, repo, branch.get_name());
write_title(ofs, repo, branch.get_name(), /*no_nav=*/true);
write_commit_diff(ofs, commit); write_footer(ofs); }

@@ -693,9 +701,12 @@ int main(int argc, char* argv[]) std::filesystem::create_directory(base); for (const auto& branch : repo.get_branches()) {
write_log(base, repo, branch);
write_files(base, repo, branch);
write_refs(base, repo, branch);
const std::filesystem::path base_branch = base / branch.get_name();
std::filesystem::create_directory(base_branch);
write_log(base_branch, repo, branch);
write_files(base_branch, repo, branch);
write_refs(base_branch, repo, branch);
} const std::filesystem::path commit = base / "commit";