#pragma once #include #include #include class RepoScanner; class GitRepo; // Serves the multi-repository git frontend. One instance per worker thread; // the shared RepoScanner is read-only after construction. class GitApp : public cppcms::application { public: GitApp(cppcms::service &srv, const RepoScanner *scanner); // Defaults every response to UTF-8 before dispatching; handlers that emit // other content types (raw files, static assets) override it themselves. void main(std::string url) override; private: void frontpage(); void repos_list(); void repo_home(std::string name); void tree(std::string name, std::string path); void raw(std::string name, std::string path); void blame(std::string name, std::string path); void log(std::string name); void object(std::string name, std::string oid); void tags(std::string name); void tag(std::string name, std::string tag_name); void branches(std::string name); void commit(std::string name, std::string oid); void commit_patch(std::string name, std::string oid); void static_file(std::string rel); // Opens the named repo, or writes a 404 and returns nullptr. std::unique_ptr open(const std::string &name); // Resolves the commit to display from the "id" query parameter (or HEAD). // Throws GitError on an invalid id. std::string commit_from_request(const GitRepo &repo); void show_error(int code, const std::string &message); const RepoScanner *scanner_; std::string static_root_; };