Compare commits

...

31 Commits

Author SHA1 Message Date
87bae1bbd1 Fix blocking test
All checks were successful
continuous-integration/drone/push Build is passing
2023-06-13 11:09:54 +02:00
a64f55f362 Properly await the server future
All checks were successful
continuous-integration/drone/push Build is passing
2023-06-13 10:42:53 +02:00
9f3c2813ab Apply cargo fmt
All checks were successful
continuous-integration/drone/push Build is passing
2023-06-13 10:26:25 +02:00
4ce8c9e523 Disable pedantic lints for now
All checks were successful
continuous-integration/drone/push Build is passing
2023-06-13 10:23:09 +02:00
361eacbe1d Fix some pedantic lints 2023-06-13 10:22:37 +02:00
b07c732475 Remove usage of outdated actions
All checks were successful
continuous-integration/drone/push Build is passing
Closes #506
2023-06-13 09:59:33 +02:00
fddb3dd3d6 Merge pull request #627 from vbrandl/dependabot/cargo/serde-1.0.164
Bump serde from 1.0.163 to 1.0.164
2023-06-09 11:43:15 +02:00
f433f27229 Update Changelog 2023-06-09 05:00:52 +00:00
8d7e97ba11 Bump serde from 1.0.163 to 1.0.164
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.163 to 1.0.164.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.163...v1.0.164)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-09 05:00:40 +00:00
59ce8e2b57 Merge pull request #626 from vbrandl/dependabot/cargo/tempfile-3.6.0
Some checks failed
Security audit / security_audit (push) Failing after 21s
/ Clippy (push) Failing after 56s
/ Rustfmt (push) Successful in 46s
/ Test Suite (ubuntu-latest) (push) Failing after 40s
continuous-integration/drone/push Build is passing
Bump tempfile from 3.5.0 to 3.6.0
2023-06-07 09:41:55 +02:00
2e5dcf4ef5 Update Changelog 2023-06-07 05:01:42 +00:00
739162d2cd Bump tempfile from 3.5.0 to 3.6.0
Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.5.0 to 3.6.0.
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.5.0...v3.6.0)

---
updated-dependencies:
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-07 05:01:28 +00:00
4be1d9881b Merge pull request #625 from vbrandl/dependabot/cargo/tokio-1.28.2
Bump tokio from 1.28.1 to 1.28.2
2023-05-29 13:34:30 +02:00
f9e5175773 Update Changelog 2023-05-29 11:28:41 +00:00
96ca6bda04 Bump tokio from 1.28.1 to 1.28.2
Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.28.1 to 1.28.2.
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.28.1...tokio-1.28.2)

---
updated-dependencies:
- dependency-name: tokio
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-29 11:28:25 +00:00
df96fcb091 Merge pull request #624 from vbrandl/dependabot/cargo/git2-0.17.2
Bump git2 from 0.17.1 to 0.17.2
2023-05-29 13:27:24 +02:00
1bae5a2b99 Update Changelog 2023-05-29 05:00:27 +00:00
5924f2ab23 Bump git2 from 0.17.1 to 0.17.2
Bumps [git2](https://github.com/rust-lang/git2-rs) from 0.17.1 to 0.17.2.
- [Changelog](https://github.com/rust-lang/git2-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/git2-rs/compare/0.17.1...0.17.2)

---
updated-dependencies:
- dependency-name: git2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-29 05:00:14 +00:00
202c9ba03e Merge pull request #623 from vbrandl/dependabot/cargo/tracing-actix-web-0.7.5
Bump tracing-actix-web from 0.7.4 to 0.7.5
2023-05-25 16:54:34 +02:00
8123b59e33 Update Changelog 2023-05-25 12:55:55 +00:00
7bb8e82c3b Bump tracing-actix-web from 0.7.4 to 0.7.5
Bumps [tracing-actix-web](https://github.com/LukeMathWalker/tracing-actix-web) from 0.7.4 to 0.7.5.
- [Commits](https://github.com/LukeMathWalker/tracing-actix-web/compare/v0.7.4...v0.7.5)

---
updated-dependencies:
- dependency-name: tracing-actix-web
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-25 12:55:37 +00:00
5f1fc70a05 Merge pull request #622 from vbrandl/dependabot/cargo/vergen-8.2.1
Bump vergen from 8.2.0 to 8.2.1
2023-05-25 14:54:20 +02:00
d60462f7ce Update Changelog 2023-05-25 04:59:39 +00:00
4ce55c8e32 Bump vergen from 8.2.0 to 8.2.1
Bumps [vergen](https://github.com/rustyhorde/vergen) from 8.2.0 to 8.2.1.
- [Release notes](https://github.com/rustyhorde/vergen/releases)
- [Commits](https://github.com/rustyhorde/vergen/compare/8.2.0...8.2.1)

---
updated-dependencies:
- dependency-name: vergen
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-25 04:59:25 +00:00
1a8db00ce4 Merge pull request #621 from vbrandl/dependabot/cargo/vergen-8.2.0
Bump vergen from 8.1.3 to 8.2.0
2023-05-22 13:14:23 +02:00
c304164935 Update Changelog 2023-05-22 05:02:23 +00:00
e2594b3c5b Bump vergen from 8.1.3 to 8.2.0
Bumps [vergen](https://github.com/rustyhorde/vergen) from 8.1.3 to 8.2.0.
- [Release notes](https://github.com/rustyhorde/vergen/releases)
- [Commits](https://github.com/rustyhorde/vergen/compare/8.1.3...8.2.0)

---
updated-dependencies:
- dependency-name: vergen
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-22 05:02:05 +00:00
12c400e5b8 Merge pull request #619 from vbrandl/dependabot/cargo/reqwest-0.11.18
Bump reqwest from 0.11.17 to 0.11.18
2023-05-17 15:41:15 +02:00
745a9021cd Update Changelog 2023-05-17 13:28:43 +00:00
4bb0c8adc7 Bump reqwest from 0.11.17 to 0.11.18
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.11.17 to 0.11.18.
- [Release notes](https://github.com/seanmonstar/reqwest/releases)
- [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/seanmonstar/reqwest/compare/v0.11.17...v0.11.18)

---
updated-dependencies:
- dependency-name: reqwest
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 13:21:10 +00:00
e7cf23c625 Merge pull request #620 from vbrandl/feature/rerun-workflows
Some checks failed
/ Clippy (push) Failing after 1m8s
/ Test Suite (ubuntu-latest) (push) Failing after 42s
/ Rustfmt (push) Successful in 59s
Security audit / security_audit (push) Failing after 19s
continuous-integration/drone/push Build is passing
Use custom token to trigger reruns
2023-05-17 15:20:11 +02:00
14 changed files with 99 additions and 88 deletions

View File

@ -16,6 +16,6 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: actions-rs/audit-check@v1 - uses: rustsec/audit-check@v1
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}

View File

@ -16,18 +16,11 @@ jobs:
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Install stable toolchain - name: Install stable toolchain
uses: actions-rs/toolchain@v1 uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
profile: minimal
override: true
components: rustfmt
- name: Check Formatting - name: Check Formatting
uses: actions-rs/cargo@v1 run: cargo fmt --all -- --check
with:
command: fmt
args: --all -- --check
clippy: clippy:
name: Clippy name: Clippy
@ -37,12 +30,7 @@ jobs:
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Install stable toolchain - name: Install stable toolchain
uses: actions-rs/toolchain@v1 uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
profile: minimal
override: true
components: rustfmt
- name: Cache cargo registry, index and build directory - name: Cache cargo registry, index and build directory
uses: actions/cache@v3 uses: actions/cache@v3
@ -54,10 +42,13 @@ jobs:
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Clippy Linting - name: Clippy Linting
uses: actions-rs/cargo@v1 run: cargo clippy --all-features -- -Dclippy::all
with: # TODO
command: clippy # run: cargo clippy --all-features -- -Dclippy::all -Dclippy::pedantic
args: -- -D warnings - name: Clippy Test Linting
run: cargo clippy --tests -- -Dclippy::all
# TODO
# run: cargo clippy --tests -- -Dclippy::all -Dclippy::pedantic
test: test:
@ -74,11 +65,7 @@ jobs:
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Install stable toolchain - name: Install stable toolchain
uses: actions-rs/toolchain@v1 uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
profile: minimal
override: true
- name: Cache cargo registry, index and build directory - name: Cache cargo registry, index and build directory
uses: actions/cache@v3 uses: actions/cache@v3
@ -90,6 +77,4 @@ jobs:
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Run Tests - name: Run Tests
uses: actions-rs/cargo@v1 run: cargo test
with:
command: test

View File

@ -5,9 +5,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Dependencies ### Dependencies
- Bump `serde` from 1.0.160 to 1.0.163 (#613, #617) - Bump `serde` from 1.0.160 to 1.0.164 (#613, #617, #627)
- Bump `actions/cache` from 2 to 3 (#616) - Bump `actions/cache` from 2 to 3 (#616)
- Bump `tokio` from 1.28.0 to 1.28.1 (#618) - Bump `tokio` from 1.28.0 to 1.28.2 (#618, #625)
- Bump `reqwest` from 0.11.17 to 0.11.18 (#619)
- Bump `vergen` from 8.1.3 to 8.2.1 (#621, #622)
- Bump `tracing-actix-web` from 0.7.4 to 0.7.5 (#623)
- Bump `git2` from 0.17.1 to 0.17.2 (#624)
- Bump `tempfile` from 3.5.0 to 3.6.0 (#626)
## [0.35.0] 2023-05-04 ## [0.35.0] 2023-05-04

39
Cargo.lock generated
View File

@ -807,9 +807,9 @@ dependencies = [
[[package]] [[package]]
name = "git2" name = "git2"
version = "0.17.1" version = "0.17.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b7905cdfe33d31a88bb2e8419ddd054451f5432d1da9eaf2ac7804ee1ea12d5" checksum = "7b989d6a7ca95a362cf2cfc5ad688b3a467be1f87e480b8dad07fee8c79b0044"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"libc", "libc",
@ -1671,9 +1671,9 @@ checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317"
[[package]] [[package]]
name = "libgit2-sys" name = "libgit2-sys"
version = "0.15.1+1.6.4" version = "0.15.2+1.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb4577bde8cdfc7d6a2a4bcb7b049598597de33ffd337276e9c7db6cd4a2cee7" checksum = "a80df2e11fb4a61f4ba2ab42dbe7f74468da143f1a75c74e11dee7c813f694fa"
dependencies = [ dependencies = [
"cc", "cc",
"libc", "libc",
@ -2197,9 +2197,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.11.17" version = "0.11.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13293b639a097af28fc8a90f22add145a9c954e49d77da06263d58cf44d5fb91" checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55"
dependencies = [ dependencies = [
"base64 0.21.0", "base64 0.21.0",
"bytes", "bytes",
@ -2357,18 +2357,18 @@ checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.163" version = "1.0.164"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.163" version = "1.0.164"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -2509,15 +2509,16 @@ dependencies = [
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.5.0" version = "3.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6"
dependencies = [ dependencies = [
"autocfg",
"cfg-if", "cfg-if",
"fastrand", "fastrand",
"redox_syscall 0.3.5", "redox_syscall 0.3.5",
"rustix", "rustix",
"windows-sys 0.45.0", "windows-sys 0.48.0",
] ]
[[package]] [[package]]
@ -2596,9 +2597,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.28.1" version = "1.28.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"bytes", "bytes",
@ -2665,9 +2666,9 @@ dependencies = [
[[package]] [[package]]
name = "tracing-actix-web" name = "tracing-actix-web"
version = "0.7.4" version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2def0ffabc0116481e14e82cf705fef814f5178171d445b6790137ff8a85a73" checksum = "ce52ffaf2d544e317d3bef63f49a6a22022866505fa4840a4339b1756834a2a9"
dependencies = [ dependencies = [
"actix-web", "actix-web",
"pin-project", "pin-project",
@ -2838,9 +2839,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]] [[package]]
name = "vergen" name = "vergen"
version = "8.1.3" version = "8.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e03272e388fb78fc79481a493424f78d77be1d55f21bcd314b5a6716e195afe" checksum = "8b3c89c2c7e50f33e4d35527e5bf9c11d6d132226dbbd1753f0fbe9f19ef88c6"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"gix", "gix",

View File

@ -20,17 +20,17 @@ bytes = "1.4.0"
config = { version = "0.13.3", features = ["toml"] } config = { version = "0.13.3", features = ["toml"] }
dotenvy = "0.15.7" dotenvy = "0.15.7"
futures = "0.3.27" futures = "0.3.27"
git2 = "0.17.1" git2 = "0.17.2"
lazy_static = "1.4.0" lazy_static = "1.4.0"
mime = "0.3" mime = "0.3"
number_prefix = "0.4.0" number_prefix = "0.4.0"
openssl-probe = "0.1.5" openssl-probe = "0.1.5"
reqwest = "0.11.17" reqwest = "0.11.18"
serde = "1.0.163" serde = "1.0.164"
serde_derive = "1.0.137" serde_derive = "1.0.137"
serde_json = "1.0.94" serde_json = "1.0.94"
tracing = "0.1.37" tracing = "0.1.37"
tracing-actix-web = "0.7.3" tracing-actix-web = "0.7.5"
tracing-bunyan-formatter = "0.3.6" tracing-bunyan-formatter = "0.3.6"
tracing-futures = "0.2.5" tracing-futures = "0.2.5"
tracing-log = "0.1.3" tracing-log = "0.1.3"
@ -39,10 +39,10 @@ tracing-subscriber = { version = "0.3.17", features = ["registry", "env-filter"]
[build-dependencies] [build-dependencies]
anyhow = "1.0.71" anyhow = "1.0.71"
ructe = { version = "0.16.1", features = ["mime03"] } ructe = { version = "0.16.1", features = ["mime03"] }
vergen = { version = "8.1.3", default-features = false, features = ["git", "gitoxide"] } vergen = { version = "8.2.1", default-features = false, features = ["git", "gitoxide"] }
[dev-dependencies] [dev-dependencies]
awc = "3.1.1" awc = "3.1.1"
ructe = "0.16.1" ructe = "0.16.1"
tempfile = "3.5.0" tempfile = "3.6.0"
tokio = "1.28.1" tokio = "1.28.2"

View File

@ -36,10 +36,10 @@ impl<'a> CacheState<'a> {
trace!("Reading cache"); trace!("Reading cache");
if path.as_ref().exists() { if path.as_ref().exists() {
let cache: Cache = serde_json::from_reader(BufReader::new(File::open(path)?))?; let cache: Cache = serde_json::from_reader(BufReader::new(File::open(path)?))?;
Ok(cache Ok(cache.entries.get(branch).map_or_else(
.entries // TODO: get rid of clone
.get(branch) || CacheState::NoneForBranch(cache.clone()),
.map(|c| { |c| {
if c.head == head { if c.head == head {
trace!("Cache is up to date"); trace!("Cache is up to date");
CacheState::Current { CacheState::Current {
@ -56,9 +56,8 @@ impl<'a> CacheState<'a> {
cache: cache.clone(), cache: cache.clone(),
} }
} }
}) },
// TODO: get rid of clone ))
.unwrap_or_else(|| CacheState::NoneForBranch(cache.clone())))
} else { } else {
Ok(CacheState::No) Ok(CacheState::No)
} }

View File

@ -18,6 +18,12 @@ pub struct Settings {
} }
impl Settings { impl Settings {
/// Load the configuration from file and environment.
///
/// # Errors
///
/// * File cannot be read or parsed
/// * Environment variables cannot be parsed
pub fn load() -> Result<Self, ConfigError> { pub fn load() -> Result<Self, ConfigError> {
Config::builder() Config::builder()
.add_source(File::with_name("hoc.toml").required(false)) .add_source(File::with_name("hoc.toml").required(false))

View File

@ -22,7 +22,7 @@ use crate::{
cache::CacheState, cache::CacheState,
config::Settings, config::Settings,
error::{Error, Result}, error::{Error, Result},
service::{Bitbucket, FormService, GitHub, Gitlab, Service, Sourcehut}, service::{Bitbucket, FormValue, GitHub, Gitlab, Service, Sourcehut},
statics::{CLIENT, VERSION_INFO}, statics::{CLIENT, VERSION_INFO},
template::{RepoGeneratorInfo, RepoInfo}, template::{RepoGeneratorInfo, RepoInfo},
}; };
@ -53,7 +53,7 @@ include!(concat!(env!("OUT_DIR"), "/templates.rs"));
#[derive(Deserialize, Serialize)] #[derive(Deserialize, Serialize)]
struct GeneratorForm<'a> { struct GeneratorForm<'a> {
service: FormService, service: FormValue,
user: Cow<'a, str>, user: Cow<'a, str>,
repo: Cow<'a, str>, repo: Cow<'a, str>,
branch: Option<Cow<'a, str>>, branch: Option<Cow<'a, str>>,
@ -309,7 +309,7 @@ pub(crate) async fn json_hoc<T: Service>(
let branch = branch.branch.as_deref().unwrap_or("master"); let branch = branch.branch.as_deref().unwrap_or("master");
let rc_clone = repo_count.clone(); let rc_clone = repo_count.clone();
let mapper = move |r| match r { let mapper = move |r| match r {
HocResult::NotFound => p404(rc_clone), HocResult::NotFound => p404(&rc_clone),
HocResult::Hoc { HocResult::Hoc {
hoc, head, commits, .. hoc, head, commits, ..
} => Ok(HttpResponse::Ok().json(JsonResponse { } => Ok(HttpResponse::Ok().json(JsonResponse {
@ -345,7 +345,7 @@ pub(crate) async fn calculate_hoc<T: Service>(
let rc_clone = repo_count.clone(); let rc_clone = repo_count.clone();
let label = query.label.clone(); let label = query.label.clone();
let mapper = move |r| match r { let mapper = move |r| match r {
HocResult::NotFound => p404(rc_clone), HocResult::NotFound => p404(&rc_clone),
HocResult::Hoc { hoc_pretty, .. } => { HocResult::Hoc { hoc_pretty, .. } => {
let badge_opt = BadgeOptions { let badge_opt = BadgeOptions {
subject: label, subject: label,
@ -386,7 +386,7 @@ async fn overview<T: Service>(
let base_url = state.settings.base_url.clone(); let base_url = state.settings.base_url.clone();
let rc_clone = repo_count.clone(); let rc_clone = repo_count.clone();
let mapper = move |r| match r { let mapper = move |r| match r {
HocResult::NotFound => p404(rc_clone), HocResult::NotFound => p404(&rc_clone),
HocResult::Hoc { HocResult::Hoc {
hoc, hoc,
commits, commits,
@ -413,7 +413,7 @@ async fn overview<T: Service>(
VERSION_INFO, VERSION_INFO,
rc_clone.load(Ordering::Relaxed), rc_clone.load(Ordering::Relaxed),
repo_info, repo_info,
label, &label,
)?; )?;
Ok(HttpResponse::Ok().content_type("text/html").body(buf)) Ok(HttpResponse::Ok().content_type("text/html").body(buf))
@ -423,11 +423,13 @@ async fn overview<T: Service>(
} }
#[get("/health_check")] #[get("/health_check")]
#[allow(clippy::unused_async)]
async fn health_check() -> HttpResponse { async fn health_check() -> HttpResponse {
HttpResponse::Ok().finish() HttpResponse::Ok().finish()
} }
#[get("/")] #[get("/")]
#[allow(clippy::unused_async)]
async fn index( async fn index(
state: web::Data<State>, state: web::Data<State>,
repo_count: web::Data<AtomicUsize>, repo_count: web::Data<AtomicUsize>,
@ -443,6 +445,7 @@ async fn index(
} }
#[post("/generate")] #[post("/generate")]
#[allow(clippy::unused_async)]
async fn generate( async fn generate(
params: web::Form<GeneratorForm<'_>>, params: web::Form<GeneratorForm<'_>>,
state: web::Data<State>, state: web::Data<State>,
@ -470,20 +473,22 @@ async fn generate(
Ok(HttpResponse::Ok().content_type("text/html").body(buf)) Ok(HttpResponse::Ok().content_type("text/html").body(buf))
} }
fn p404(repo_count: web::Data<AtomicUsize>) -> Result<HttpResponse> { fn p404(repo_count: &web::Data<AtomicUsize>) -> Result<HttpResponse> {
let mut buf = Vec::new(); let mut buf = Vec::new();
templates::p404_html(&mut buf, VERSION_INFO, repo_count.load(Ordering::Relaxed))?; templates::p404_html(&mut buf, VERSION_INFO, repo_count.load(Ordering::Relaxed))?;
Ok(HttpResponse::NotFound().content_type("text/html").body(buf)) Ok(HttpResponse::NotFound().content_type("text/html").body(buf))
} }
#[allow(clippy::unused_async)]
async fn async_p404(repo_count: web::Data<AtomicUsize>) -> Result<HttpResponse> { async fn async_p404(repo_count: web::Data<AtomicUsize>) -> Result<HttpResponse> {
p404(repo_count) p404(&repo_count)
} }
/// A duration to add to current time for a far expires header. /// A duration to add to current time for a far expires header.
static FAR: Duration = Duration::from_secs(180 * 24 * 60 * 60); static FAR: Duration = Duration::from_secs(180 * 24 * 60 * 60);
#[get("/static/{filename}")] #[get("/static/{filename}")]
#[allow(clippy::unused_async)]
async fn static_file( async fn static_file(
path: web::Path<String>, path: web::Path<String>,
repo_count: web::Data<AtomicUsize>, repo_count: web::Data<AtomicUsize>,
@ -496,11 +501,11 @@ async fn static_file(
.content_type(data.mime.clone()) .content_type(data.mime.clone())
.body(data.content) .body(data.content)
}) })
.map(Result::Ok) .map_or_else(|| p404(&repo_count), Result::Ok)
.unwrap_or_else(|| p404(repo_count))
} }
#[get("/favicon.ico")] #[get("/favicon.ico")]
#[allow(clippy::unused_async)]
async fn favicon32() -> HttpResponse { async fn favicon32() -> HttpResponse {
let data = &template_statics::favicon32_png; let data = &template_statics::favicon32_png;
HttpResponse::Ok() HttpResponse::Ok()
@ -508,6 +513,7 @@ async fn favicon32() -> HttpResponse {
.body(data.content) .body(data.content)
} }
#[allow(clippy::unused_async)]
async fn start_server(listener: TcpListener, settings: Settings) -> std::io::Result<Server> { async fn start_server(listener: TcpListener, settings: Settings) -> std::io::Result<Server> {
let workers = settings.workers; let workers = settings.workers;
let repo_count = let repo_count =
@ -536,6 +542,11 @@ async fn start_server(listener: TcpListener, settings: Settings) -> std::io::Res
.run()) .run())
} }
/// Start the server.
///
/// # Errors
///
/// * server cannot bind to `listener`
pub async fn run(listener: TcpListener, settings: Settings) -> std::io::Result<Server> { pub async fn run(listener: TcpListener, settings: Settings) -> std::io::Result<Server> {
let span = info_span!("hoc", version = env!("CARGO_PKG_VERSION")); let span = info_span!("hoc", version = env!("CARGO_PKG_VERSION"));
let _ = span.enter(); let _ = span.enter();

View File

@ -29,7 +29,7 @@ pub(crate) trait Service: Sized + 'static {
} }
#[derive(Deserialize, Serialize, Clone, Copy)] #[derive(Deserialize, Serialize, Clone, Copy)]
pub enum FormService { pub enum FormValue {
#[serde(rename = "github")] #[serde(rename = "github")]
GitHub, GitHub,
#[serde(rename = "gitlab")] #[serde(rename = "gitlab")]
@ -40,22 +40,22 @@ pub enum FormService {
Sourcehut, Sourcehut,
} }
impl FormService { impl FormValue {
pub(crate) fn url(&self) -> &str { pub(crate) fn url(&self) -> &str {
match self { match self {
FormService::GitHub => "github.com", FormValue::GitHub => "github.com",
FormService::Gitlab => "gitlab.com", FormValue::Gitlab => "gitlab.com",
FormService::Bitbucket => "bitbucket.org", FormValue::Bitbucket => "bitbucket.org",
FormService::Sourcehut => "git.sr.ht", FormValue::Sourcehut => "git.sr.ht",
} }
} }
pub(crate) fn service(&self) -> &str { pub(crate) fn service(&self) -> &str {
match self { match self {
FormService::GitHub => "github", FormValue::GitHub => "github",
FormService::Gitlab => "gitlab", FormValue::Gitlab => "gitlab",
FormService::Bitbucket => "bitbucket", FormValue::Bitbucket => "bitbucket",
FormService::Sourcehut => "sourcehut", FormValue::Sourcehut => "sourcehut",
} }
} }
} }

View File

@ -1,3 +1,4 @@
#[derive(Clone, Copy)]
pub struct VersionInfo<'a> { pub struct VersionInfo<'a> {
pub commit: &'a str, pub commit: &'a str,
pub version: &'a str, pub version: &'a str,

View File

@ -1,5 +1,6 @@
use crate::service::FormService; use crate::service::FormValue;
#[derive(Clone, Copy)]
pub struct RepoInfo<'a> { pub struct RepoInfo<'a> {
pub commit_url: &'a str, pub commit_url: &'a str,
pub commits: u64, pub commits: u64,
@ -13,7 +14,7 @@ pub struct RepoInfo<'a> {
} }
pub struct RepoGeneratorInfo<'a> { pub struct RepoGeneratorInfo<'a> {
pub service: FormService, pub service: FormValue,
pub user: &'a str, pub user: &'a str,
pub repo: &'a str, pub repo: &'a str,
pub branch: &'a str, pub branch: &'a str,

View File

@ -1,4 +1,4 @@
@use super::statics::*; @use super::statics::tacit_css_min_css;
@use crate::statics::VersionInfo; @use crate::statics::VersionInfo;
@(title: &str, header: &str, content: Content, version_info: VersionInfo, repo_count: usize) @(title: &str, header: &str, content: Content, version_info: VersionInfo, repo_count: usize)

View File

@ -2,7 +2,7 @@
@use crate::statics::VersionInfo; @use crate::statics::VersionInfo;
@use crate::template::RepoInfo; @use crate::template::RepoInfo;
@(version_info: VersionInfo, repo_count: usize, repo_info: RepoInfo, label: String) @(version_info: VersionInfo, repo_count: usize, repo_info: RepoInfo, label: &str)
@:base_html("Hits-of-Code Badges", "Overview", { @:base_html("Hits-of-Code Badges", "Overview", {

View File

@ -38,6 +38,8 @@ pub async fn spawn_app() -> TestApp {
.await .await
.expect("Failed to bind address"); .expect("Failed to bind address");
#[allow(clippy::let_underscore_future)]
// don't await so the test server runs in the background
let _ = tokio::spawn(server); let _ = tokio::spawn(server);
TestApp { TestApp {