git repos / sago_web_git

src/application.h

browsing at commit = d2d178cea97e3d1912849cb39f9d24332cce0d5d

raw · blame · history

#pragma once

#include <cppcms/application.h>

#include <memory>
#include <string>

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<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_;
};