src/application.h
browsing at commit = e6fed232320fc1bd4c7f35df8325080183937ba4
#pragma once
#include <cppcms/application.h>
#include <memory>
#include <string>
#include <vector>
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 about();
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 tag_archive(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);
// Serves Git's Smart HTTP protocol (clone/fetch) by proxying to
// `git http-backend`. `endpoint` is "info/refs" or "git-upload-pack".
void git_http(std::string name, std::string endpoint);
// Opens the named repo, or writes a 404 and returns nullptr.
std::unique_ptr<GitRepo> 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_;
std::string cache_root_; // where generated tag archives are cached
std::vector<std::string> github_hosts_; // extra GitHub Enterprise hostnames
bool allow_clone_ = false; // serve git clone over HTTP (ALLOW_GIT_CLONE)
};