💾 Archived View for lists.flounder.online › patches › threads › 20210314225537.23237-4-johann@qwertq… captured on 2022-04-28 at 19:25:33. Gemini links have been rewritten to link to archived content

View Raw

More Information

-=-=-=-=-=-=-

[PATCH mygit 3/5] use configuration static directly

[PATCH mygit 3/5] use configuration static directly

From: johann@qwertqwefsday.eu

Date: Sun, 14 Mar 2021 23:55:35 +0100

Message-Id: 20210314225537.23237-4-johann@qwertqwefsday.eu

To: <~aw/patches@lists.sr.ht>

In-Reply-To: 20210314225537.23237-1-johann@qwertqwefsday.eu

Cc: "Johann150" <johann@qwertqwefsday.eu>

Reply

Export

--------------------------------------

From: Johann150 <johann@qwertqwefsday.eu>

This gets rid of te config variable in all the structs by using the

static variable in the basic template. To be able to access the variable

more easily use a once_cell::sync::Lazy instead of a OnceCEll because

Lazy implements Deref letting us directly access the struct fields.

---

src/main.rs | 87 ++++++++++++++++++---------------------------

templates/base.html | 2 +-

2 files changed, 35 insertions(+), 54 deletions(-)

diff --git a/src/main.rs b/src/main.rs

index 0d1f074..f2696d5 100644

--- a/src/main.rs

+++ b/src/main.rs

@@ -1,7 +1,7 @@

use anyhow::Result;

use askama::Template;

use git2::{Commit, Diff, DiffDelta, DiffFormat, Oid, Reference, Repository, Tree, TreeEntry};

-use once_cell::sync::OnceCell;

+use once_cell::sync::Lazy;

use pico_args;

use pulldown_cmark::{html, Options, Parser};

use serde::{Deserialize, Serialize};

@@ -18,24 +18,46 @@ pub struct Config {

emoji_favicon: String,

}

-static CONFIG: OnceCell<Config> = OnceCell::new();

+const HELP: &str = "\

+mygit

+

+FLAGS:

+ -h, --help Prints help information

+OPTIONS:

+ -c Path to config file

+";

+

+static CONFIG: Lazy<Config> = Lazy::new(args);

+

+fn args() -> Config {

+ // TODO cli

-impl Config {

- pub fn global() -> &'static Config {

- CONFIG.get().expect("Config is not initialized")

+ let mut pargs = pico_args::Arguments::from_env();

+

+ if pargs.contains(["-h", "--help"]) {

+ print!("{}", HELP);

+ std::process::exit(0);

+ }

+

+ let toml_text =

+ fs::read_to_string("mygit.toml").expect("expected configuration file mygit.toml");

+ match toml::from_str(&toml_text) {

+ Ok(config) => config,

+ Err(e) => {

+ eprintln!("could not read configuration file: {}", e);

+ std::process::exit(1);

+ }

}

}

#[derive(Template)]

#[template(path = "index.html")] // using the template in this path, relative

-struct IndexTemplate<'a> {

+struct IndexTemplate {

repos: Vec<Repository>,

- config: &'a Config,

}

async fn index(req: Request<()>) -> tide::Result {

- let config = &Config::global();

- let repos = fs::read_dir(&config.repo_directory)

+ let repos = fs::read_dir(&CONFIG.repo_directory)

.map(|entries| {

entries

.filter_map(|entry| Some(entry.ok()?.path()))

@@ -50,7 +72,7 @@ async fn index(req: Request<()>) -> tide::Result {

})

.map_err(|e| tide::log::warn!("can not read repositories: {}", e))

.unwrap_or_default();

- let mut index_template = IndexTemplate { repos, config };

+ let index_template = IndexTemplate { repos };

Ok(index_template.into())

}

@@ -60,18 +82,16 @@ async fn index(req: Request<()>) -> tide::Result {

struct RepoHomeTemplate<'a> {

repo: &'a Repository,

readme_text: &'a str,

- config: &'a Config,

}

fn repo_from_request(repo_name: &str) -> Result<Repository> {

- let repo_path = Path::new(&Config::global().repo_directory).join(repo_name);

+ let repo_path = Path::new(&CONFIG.repo_directory).join(repo_name);

// TODO CLEAN PATH! VERY IMPORTANT! DONT FORGET!

let r = Repository::open(repo_path)?;

Ok(r)

}

async fn repo_home(req: Request<()>) -> tide::Result {

- let config = &Config::global();

let repo = repo_from_request(&req.param("repo_name")?)?;

let readme = &repo.revparse_single("HEAD:README.md")?; // TODO allow more incl plaintext

let markdown_input = std::str::from_utf8(readme.as_blob().unwrap().content())?;

@@ -82,7 +102,6 @@ async fn repo_home(req: Request<()>) -> tide::Result {

let tmpl = RepoHomeTemplate {

repo: &repo,

readme_text: &html_output,

- config,

};

Ok(tmpl.into())

}

@@ -91,12 +110,10 @@ async fn repo_home(req: Request<()>) -> tide::Result {

#[template(path = "log.html")] // using the template in this path, relative

struct RepoLogTemplate<'a> {

repo: &'a Repository,

- config: &'a Config,

commits: Vec<Commit<'a>>,

}

async fn repo_log(req: Request<()>) -> tide::Result {

- let config = &Config::global();

let repo = repo_from_request(&req.param("repo_name")?)?;

let mut revwalk = repo.revwalk()?;

match req.param("ref") {

@@ -109,7 +126,6 @@ async fn repo_log(req: Request<()>) -> tide::Result {

.collect();

let tmpl = RepoLogTemplate {

repo: &repo,

- config,

commits,

};

Ok(tmpl.into())

@@ -119,12 +135,10 @@ async fn repo_log(req: Request<()>) -> tide::Result {

#[template(path = "refs.html")] // using the template in this path, relative

struct RepoRefTemplate<'a> {

repo: &'a Repository,

- config: &'a Config,

branches: Vec<Reference<'a>>,

tags: Vec<Reference<'a>>,

}

async fn repo_refs(req: Request<()>) -> tide::Result {

- let config = &Config::global();

let repo = repo_from_request(&req.param("repo_name")?)?;

let branches = repo

.references()?

@@ -138,7 +152,6 @@ async fn repo_refs(req: Request<()>) -> tide::Result {

.collect();

let tmpl = RepoRefTemplate {

repo: &repo,

- config,

branches,

tags,

};

@@ -149,22 +162,16 @@ async fn repo_refs(req: Request<()>) -> tide::Result {

#[template(path = "tree.html")] // using the template in this path, relative

struct RepoTreeTemplate<'a> {

repo: &'a Repository,

- config: &'a Config,

tree: Tree<'a>,

}

async fn repo_tree(req: Request<()>) -> tide::Result {

// TODO handle subtrees

- let config = &Config::global();

let repo = repo_from_request(&req.param("repo_name")?)?;

// TODO accept reference or commit id

let spec = req.param("ref").unwrap_or("HEAD");

let commit = repo.revparse_single(spec)?.peel_to_commit()?;

let tree = commit.tree()?;

- let tmpl = RepoTreeTemplate {

- repo: &repo,

- config,

- tree,

- };

+ let tmpl = RepoTreeTemplate { repo: &repo, tree };

Ok(tmpl.into())

}

@@ -172,7 +179,6 @@ async fn repo_tree(req: Request<()>) -> tide::Result {

#[template(path = "commit.html")] // using the template in this path, relative

struct RepoCommitTemplate<'a> {

repo: &'a Repository,

- config: &'a Config,

commit: Commit<'a>,

parent: Commit<'a>,

diff: &'a Diff<'a>,

@@ -180,7 +186,6 @@ struct RepoCommitTemplate<'a> {

}

async fn repo_commit(req: Request<()>) -> tide::Result {

- let config = &Config::global();

let repo = repo_from_request(req.param("repo_name")?)?;

let commit = repo

.revparse_single(req.param("commit")?)?

@@ -197,7 +202,6 @@ async fn repo_commit(req: Request<()>) -> tide::Result {

// TODO accept reference or commit id

let tmpl = RepoCommitTemplate {

repo: &repo,

- config,

commit,

parent,

diff: &diff,

@@ -243,31 +247,8 @@ mod filters {

}

}

-const HELP: &str = "\

-mygit

-

-FLAGS:

- -h, --help Prints help information

-OPTIONS:

- -c Path to config file

-";

-

#[async_std::main]

async fn main() -> Result<(), std::io::Error> {

- let mut pargs = pico_args::Arguments::from_env();

-

- if pargs.contains(["-h", "--help"]) {

- print!("{}", HELP);

- std::process::exit(0);

- }

-

- // TODO cli

-

- let toml_text =

- fs::read_to_string("mygit.toml").expect("expected configuration file mygit.toml");

- let config: Config = toml::from_str(&toml_text)?;

- CONFIG.set(config).unwrap();

-

tide::log::start();

let mut app = tide::new();

app.at("/").get(index);

diff --git a/templates/base.html b/templates/base.html

index fa13a3a..e47495c 100644

--- a/templates/base.html

+++ b/templates/base.html

@@ -4,7 +4,7 @@

<meta charset="utf-8">

<link rel="stylesheet" type="text/css" href="/style.css" />

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0" />

- <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>{{config.emoji_favicon}}</text></svg>">

+ <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>{{crate::CONFIG.emoji_favicon}}</text></svg>">

<meta name="description" content="My self-hosted git repositories">

<title>{% block title %}My Site{% endblock %}</title>

{% block head %}{% endblock %}

--

2.20.1