Compare commits

...

215 Commits

Author SHA1 Message Date
04a90469fe Remove .gitlab-ci.yml
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-19 09:01:06 +02:00
117a052aa5 Merge pull request #259 from vbrandl/dependabot/cargo/futures-0.3.14
Bump futures from 0.3.13 to 0.3.14
2021-04-19 08:59:59 +02:00
b2bc7fc217 Bump futures from 0.3.13 to 0.3.14
Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.13 to 0.3.14.
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/futures-rs/compare/0.3.13...0.3.14)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-13 17:58:36 +00:00
cd2624ae11 Merge pull request #256 from vbrandl/dependabot/cargo/tracing-bunyan-formatter-0.2.0
Bump tracing-bunyan-formatter from 0.1.7 to 0.2.0
2021-04-13 19:56:58 +02:00
fa9601bb9a Merge pull request #258 from vbrandl/dependabot/cargo/vergen-5.1.1
Bump vergen from 5.1.0 to 5.1.1
2021-04-13 19:55:14 +02:00
ae9d31b82c Bump vergen from 5.1.0 to 5.1.1
Bumps [vergen](https://github.com/rustyhorde/vergen) from 5.1.0 to 5.1.1.
- [Release notes](https://github.com/rustyhorde/vergen/releases)
- [Commits](https://github.com/rustyhorde/vergen/compare/5.1.0...5.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-08 04:18:02 +00:00
2afe5fc172 Bump tracing-bunyan-formatter from 0.1.7 to 0.2.0
Bumps [tracing-bunyan-formatter](https://github.com/LukeMathWalker/tracing-bunyan-formatter) from 0.1.7 to 0.2.0.
- [Release notes](https://github.com/LukeMathWalker/tracing-bunyan-formatter/releases)
- [Commits](https://github.com/LukeMathWalker/tracing-bunyan-formatter/commits/v0.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-30 04:19:49 +00:00
ea7f074661 Merge pull request #244 from vbrandl/dependabot/cargo/ructe-0.13.2
Bump ructe from 0.13.0 to 0.13.2
2021-03-29 14:45:53 +02:00
d5e3cad299 Bump ructe from 0.13.0 to 0.13.2
Bumps [ructe](https://github.com/kaj/ructe) from 0.13.0 to 0.13.2.
- [Release notes](https://github.com/kaj/ructe/releases)
- [Changelog](https://github.com/kaj/ructe/blob/master/CHANGELOG.md)
- [Commits](https://github.com/kaj/ructe/compare/v0.13.0...v0.13.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-29 10:56:11 +00:00
6570daef02 Remove macos from test matrix
Some checks failed
continuous-integration/drone/push Build is failing
2021-03-29 12:55:49 +02:00
6ac389e3ee Merge pull request #239 from vbrandl/dependabot/cargo/serde_json-1.0.64
Bump serde_json from 1.0.63 to 1.0.64
2021-03-29 12:55:14 +02:00
36196975ac Merge pull request #251 from vbrandl/dependabot/cargo/vergen-5.1.0
Bump vergen from 4.1.0 to 5.1.0
2021-03-29 12:54:28 +02:00
1dd83829b2 Bump serde_json from 1.0.63 to 1.0.64
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.63 to 1.0.64.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.63...v1.0.64)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-29 10:48:28 +00:00
1b0817bc25 Bump vergen from 4.1.0 to 5.1.0
All checks were successful
continuous-integration/drone/push Build is passing
Bumps [vergen](https://github.com/rustyhorde/vergen) from 4.1.0 to 5.1.0.
- [Release notes](https://github.com/rustyhorde/vergen/releases)
- [Commits](https://github.com/rustyhorde/vergen/compare/4.1.0...5.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-29 12:45:49 +02:00
f57dc8e890 Fix vergen 2021-03-29 12:45:49 +02:00
bdda6292d2 Bump vergen from 4.1.0 to 5.1.0
Bumps [vergen](https://github.com/rustyhorde/vergen) from 4.1.0 to 5.1.0.
- [Release notes](https://github.com/rustyhorde/vergen/releases)
- [Commits](https://github.com/rustyhorde/vergen/compare/4.1.0...5.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-29 12:45:49 +02:00
a2826c9922 Remove windows from test matrix
Some checks failed
continuous-integration/drone/push Build is failing
2021-03-29 12:44:55 +02:00
3b2a368df0 Merge pull request #247 from vbrandl/dependabot/cargo/config-0.11.0
Bump config from 0.10.1 to 0.11.0
2021-03-29 12:23:55 +02:00
8b7444bd7c Merge pull request #253 from vbrandl/feature/refactor2
Feature/refactor2
2021-03-29 12:12:58 +02:00
9d719e7d85 Merge pull request #252 from vbrandl/master
Refactor for testability
2021-03-29 12:12:09 +02:00
584379e047 Merge pull request #250 from vbrandl/dependabot/cargo/serde-1.0.125
Bump serde from 1.0.123 to 1.0.125
2021-03-29 12:10:50 +02:00
951124e038 Bump serde from 1.0.123 to 1.0.125
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.123 to 1.0.125.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.123...v1.0.125)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-23 04:24:16 +00:00
e574f4bdd0 Run tests also on windows
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-22 13:41:50 +01:00
5c8e3fa35d Add badge test
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-22 13:34:26 +01:00
4c0df1fa19 Add config so tests will work 2021-03-22 13:34:18 +01:00
f6b46a1e90 Add config so tests will work
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-22 13:33:56 +01:00
5eb16ac38e Remove unused code
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-22 12:52:24 +01:00
3486d44bc5 Restructure for testability and implement first tests 2021-03-22 12:46:10 +01:00
1311e724ce Bump version (v0.17.1)
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2021-03-22 08:38:45 +01:00
5da9e74992 Merge pull request #248 from strdr4605/patch-1
fix: remove redundant param in md url
2021-03-22 08:37:53 +01:00
8dadc0ddea fix: remove redundant param in md url 2021-03-22 00:16:31 +02:00
cba235eadf Bump config from 0.10.1 to 0.11.0
Bumps [config](https://github.com/mehcode/config-rs) from 0.10.1 to 0.11.0.
- [Release notes](https://github.com/mehcode/config-rs/releases)
- [Changelog](https://github.com/mehcode/config-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mehcode/config-rs/commits/0.11.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-18 04:18:27 +00:00
5284249acf Bump version (v0.17.0)
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2021-02-26 16:38:26 +01:00
d28f56dac0 Updgrade serde_derive and futures
All checks were successful
continuous-integration/drone/push Build is passing
2021-02-26 16:35:14 +01:00
ab02a45bf6 Update dependencies
All checks were successful
continuous-integration/drone/push Build is passing
2021-02-26 16:28:04 +01:00
837c1c160b Merge pull request #234 from vbrandl/dependabot/cargo/vergen-4.1.0
Bump vergen from 3.2.0 to 4.1.0
2021-02-26 16:17:56 +01:00
3d26823425 Fix breaking changes in vergen
All checks were successful
continuous-integration/drone/push Build is passing
2021-02-26 16:12:58 +01:00
d9553871fa Deactivate unused features of vergen 2021-02-26 16:12:47 +01:00
d2bc9c2149 Bump vergen from 3.2.0 to 4.1.0
Bumps [vergen](https://github.com/rustyhorde/vergen) from 3.2.0 to 4.1.0.
- [Release notes](https://github.com/rustyhorde/vergen/releases)
- [Commits](https://github.com/rustyhorde/vergen/compare/v3.2.0...4.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-26 15:06:33 +00:00
b0b97653a9 Rollback reqwest to 0.10.10
All checks were successful
continuous-integration/drone/push Build is passing
2021-02-26 16:04:58 +01:00
0b1bc60790 Merge pull request #238 from vbrandl/revert-236-dependabot/cargo/actix-rt-2.1.0
Revert "Bump actix-rt from 1.1.1 to 2.1.0"
2021-02-26 15:51:46 +01:00
e93588a6d9 Revert "Bump actix-rt from 1.1.1 to 2.1.0" 2021-02-26 15:51:35 +01:00
cd5046a276 Merge pull request #236 from vbrandl/dependabot/cargo/actix-rt-2.1.0
Bump actix-rt from 1.1.1 to 2.1.0
2021-02-26 15:41:54 +01:00
919348d49d Merge pull request #229 from vbrandl/dependabot/cargo/tracing-futures-0.2.5
Bump tracing-futures from 0.2.4 to 0.2.5
2021-02-26 15:31:26 +01:00
8378b0b51b Bump tracing-futures from 0.2.4 to 0.2.5
Bumps [tracing-futures](https://github.com/tokio-rs/tracing) from 0.2.4 to 0.2.5.
- [Release notes](https://github.com/tokio-rs/tracing/releases)
- [Commits](https://github.com/tokio-rs/tracing/compare/tracing-futures-0.2.4...tracing-futures-0.2.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-26 14:31:17 +00:00
0394ae52e9 Merge pull request #235 from vbrandl/dependabot/cargo/tracing-0.1.25
Bump tracing from 0.1.23 to 0.1.25
2021-02-26 15:29:55 +01:00
fb34f6bf2f Bump tracing from 0.1.23 to 0.1.25
Bumps [tracing](https://github.com/tokio-rs/tracing) from 0.1.23 to 0.1.25.
- [Release notes](https://github.com/tokio-rs/tracing/releases)
- [Commits](https://github.com/tokio-rs/tracing/compare/tracing-0.1.23...tracing-0.1.25)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-26 14:29:17 +00:00
36622ad322 Merge pull request #232 from vbrandl/dependabot/cargo/tracing-subscriber-0.2.16
Bump tracing-subscriber from 0.2.15 to 0.2.16
2021-02-26 15:28:11 +01:00
89bb27e137 Merge pull request #237 from vbrandl/dependabot/cargo/serde_json-1.0.63
Bump serde_json from 1.0.62 to 1.0.63
2021-02-26 15:27:53 +01:00
7d4385764c Bump serde_json from 1.0.62 to 1.0.63
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.62 to 1.0.63.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.62...v1.0.63)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-26 04:19:16 +00:00
5df97f0e64 Bump actix-rt from 1.1.1 to 2.1.0
Bumps [actix-rt](https://github.com/actix/actix-net) from 1.1.1 to 2.1.0.
- [Release notes](https://github.com/actix/actix-net/releases)
- [Commits](https://github.com/actix/actix-net/compare/rt-1.1.1...rt-v2.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-26 04:18:49 +00:00
a3d98a326e Bump tracing-subscriber from 0.2.15 to 0.2.16
Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.2.15 to 0.2.16.
- [Release notes](https://github.com/tokio-rs/tracing/releases)
- [Commits](https://github.com/tokio-rs/tracing/compare/tracing-subscriber-0.2.15...tracing-subscriber-0.2.16)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-22 04:14:56 +00:00
76bf5f2f98 Merge pull request #221 from vbrandl/dependabot/cargo/serde-1.0.123
Bump serde from 1.0.118 to 1.0.123
2021-02-11 11:17:34 +01:00
e827d2ef39 Bump serde from 1.0.118 to 1.0.123
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.118 to 1.0.123.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.118...v1.0.123)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-11 10:12:45 +00:00
65576140ce Merge pull request #212 from vbrandl/dependabot/cargo/reqwest-0.11.0
Bump reqwest from 0.10.10 to 0.11.0
2021-02-11 11:11:14 +01:00
cea54cf2f3 Bump reqwest from 0.10.10 to 0.11.0
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.10.10 to 0.11.0.
- [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.10.10...v0.11.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-11 10:10:09 +00:00
8c28c68c17 Merge pull request #215 from vbrandl/dependabot/cargo/bytes-1.0.1
Bump bytes from 1.0.0 to 1.0.1
2021-02-11 11:09:27 +01:00
b86a080ead Merge pull request #223 from vbrandl/dependabot/cargo/tracing-0.1.23
Bump tracing from 0.1.22 to 0.1.23
2021-02-11 11:08:42 +01:00
1b0c959a8d Bump bytes from 1.0.0 to 1.0.1
Bumps [bytes](https://github.com/tokio-rs/bytes) from 1.0.0 to 1.0.1.
- [Release notes](https://github.com/tokio-rs/bytes/releases)
- [Changelog](https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/bytes/compare/v1.0.0...v1.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-10 17:07:29 +00:00
806baf7460 Bump tracing from 0.1.22 to 0.1.23
Bumps [tracing](https://github.com/tokio-rs/tracing) from 0.1.22 to 0.1.23.
- [Release notes](https://github.com/tokio-rs/tracing/releases)
- [Commits](https://github.com/tokio-rs/tracing/compare/tracing-0.1.22...tracing-0.1.23)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-10 17:06:26 +00:00
080f7379ea Merge pull request #216 from vbrandl/dependabot/cargo/tempfile-3.2.0
Bump tempfile from 3.1.0 to 3.2.0
2021-02-10 18:06:14 +01:00
7409de5dba Merge pull request #219 from vbrandl/dependabot/cargo/git2-0.13.17
Bump git2 from 0.13.14 to 0.13.17
2021-02-10 18:05:52 +01:00
07f4ef518a Merge pull request #225 from vbrandl/dependabot/cargo/serde_json-1.0.62
Bump serde_json from 1.0.61 to 1.0.62
2021-02-10 18:04:58 +01:00
820ebdd899 Bump tempfile from 3.1.0 to 3.2.0
Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/Stebalien/tempfile/releases)
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/NEWS)
- [Commits](https://github.com/Stebalien/tempfile/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-10 17:04:57 +00:00
527d793914 Merge pull request #226 from vbrandl/dependabot/cargo/vergen-3.2.0
Bump vergen from 3.1.0 to 3.2.0
2021-02-10 18:03:26 +01:00
7df6c3fc75 Bump vergen from 3.1.0 to 3.2.0
Bumps [vergen](https://github.com/rustyhorde/vergen) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/rustyhorde/vergen/releases)
- [Commits](https://github.com/rustyhorde/vergen/compare/v3.1.0...v3.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-10 04:16:04 +00:00
17e1af1dd7 Bump serde_json from 1.0.61 to 1.0.62
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.61 to 1.0.62.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.61...v1.0.62)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-08 04:17:19 +00:00
baade8fbc2 Bump git2 from 0.13.14 to 0.13.17
Bumps [git2](https://github.com/rust-lang/git2-rs) from 0.13.14 to 0.13.17.
- [Release notes](https://github.com/rust-lang/git2-rs/releases)
- [Commits](https://github.com/rust-lang/git2-rs/compare/0.13.14...0.13.17)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-25 04:16:33 +00:00
cfc07664fc Merge pull request #211 from vbrandl/dependabot/cargo/serde_json-1.0.61
Bump serde_json from 1.0.60 to 1.0.61
2021-01-06 18:11:44 +01:00
52938c9106 Bump serde_json from 1.0.60 to 1.0.61
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.60 to 1.0.61.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.60...v1.0.61)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-29 04:18:23 +00:00
b64f573a38 Bump version (v0.16.0)
All checks were successful
continuous-integration/drone/push Build is passing
2020-12-23 21:44:46 +01:00
ebbd1ea8cb Merge pull request #204 from vbrandl/dependabot/cargo/reqwest-0.10.10
Bump reqwest from 0.10.9 to 0.10.10
2020-12-23 21:33:54 +01:00
93a0147a78 Merge pull request #208 from vbrandl/dependabot/cargo/bytes-1.0.0
Bump bytes from 0.6.0 to 1.0.0
2020-12-23 21:33:27 +01:00
2040e718d7 Bump reqwest from 0.10.9 to 0.10.10
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.10.9 to 0.10.10.
- [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.10.9...v0.10.10)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-23 20:33:00 +00:00
5679f67de0 Bump bytes from 0.6.0 to 1.0.0
Bumps [bytes](https://github.com/tokio-rs/bytes) from 0.6.0 to 1.0.0.
- [Release notes](https://github.com/tokio-rs/bytes/releases)
- [Changelog](https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/bytes/compare/v0.6.0...v1.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-23 20:32:36 +00:00
8babdb978e Merge pull request #207 from vbrandl/dependabot/cargo/git2-0.13.14
Bump git2 from 0.13.12 to 0.13.14
2020-12-23 21:32:20 +01:00
b3388912c2 Merge pull request #203 from vbrandl/dependabot/cargo/serde-1.0.118
Bump serde from 1.0.117 to 1.0.118
2020-12-23 21:31:41 +01:00
bce511ce0b Merge pull request #202 from vbrandl/dependabot/cargo/serde_json-1.0.60
Bump serde_json from 1.0.59 to 1.0.60
2020-12-23 21:31:25 +01:00
50e36769d1 Merge pull request #201 from vbrandl/dependabot/cargo/actix-web-3.3.2
Bump actix-web from 3.3.1 to 3.3.2
2020-12-23 21:31:09 +01:00
9477338331 Bump git2 from 0.13.12 to 0.13.14
Bumps [git2](https://github.com/rust-lang/git2-rs) from 0.13.12 to 0.13.14.
- [Release notes](https://github.com/rust-lang/git2-rs/releases)
- [Commits](https://github.com/rust-lang/git2-rs/compare/0.13.12...0.13.14)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-22 04:18:08 +00:00
c1d0930354 Bump serde from 1.0.117 to 1.0.118
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.117 to 1.0.118.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.117...v1.0.118)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-07 04:17:13 +00:00
688067e5c5 Bump serde_json from 1.0.59 to 1.0.60
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.59 to 1.0.60.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.59...v1.0.60)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-03 04:16:41 +00:00
529f36dc40 Bump actix-web from 3.3.1 to 3.3.2
Bumps [actix-web](https://github.com/actix/actix-web) from 3.3.1 to 3.3.2.
- [Release notes](https://github.com/actix/actix-web/releases)
- [Changelog](https://github.com/actix/actix-web/blob/master/CHANGES.md)
- [Commits](https://github.com/actix/actix-web/compare/web-v3.3.1...web-v3.3.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-02 04:17:45 +00:00
d8fdabfca6 Merge pull request #200 from vbrandl/dependabot/cargo/actix-web-3.3.1
Bump actix-web from 3.2.0 to 3.3.1
2020-11-30 23:37:56 +01:00
8060b80ae6 Bump actix-web from 3.2.0 to 3.3.1
Bumps [actix-web](https://github.com/actix/actix-web) from 3.2.0 to 3.3.1.
- [Release notes](https://github.com/actix/actix-web/releases)
- [Changelog](https://github.com/actix/actix-web/blob/master/CHANGES.md)
- [Commits](https://github.com/actix/actix-web/compare/web-v3.2.0...web-v3.3.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-30 04:17:12 +00:00
15965c5b5f Bump version (v0.15.0)
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2020-11-24 19:34:20 +01:00
1eade03b63 Load env in docker-compose setup
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-24 19:33:12 +01:00
f41fbc8baf Fix test
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-24 19:24:35 +01:00
14cd21dc1c Make paths consistent
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-24 19:13:08 +01:00
1bdee4ee36 Document new config mechanism
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-24 19:07:21 +01:00
9e33742d81 Use new config 2020-11-24 19:06:49 +01:00
8e78d13443 Make full base URL configurable 2020-11-24 19:06:42 +01:00
391fa39470 Use config and dotenv over structopt 2020-11-24 19:06:18 +01:00
e6e90214e2 Add example configurations 2020-11-24 19:05:56 +01:00
6f734b103a Ignore actual configs 2020-11-24 19:05:46 +01:00
413bb824e1 Merge pull request #198 from vbrandl/dependabot/cargo/tracing-0.1.22
All checks were successful
continuous-integration/drone/push Build is passing
Bump tracing from 0.1.21 to 0.1.22
2020-11-24 18:22:29 +01:00
58ad13dbad Bump tracing from 0.1.21 to 0.1.22
Bumps [tracing](https://github.com/tokio-rs/tracing) from 0.1.21 to 0.1.22.
- [Release notes](https://github.com/tokio-rs/tracing/releases)
- [Commits](https://github.com/tokio-rs/tracing/compare/tracing-0.1.21...tracing-0.1.22)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-24 04:17:21 +00:00
9f8b781f7b Bump version (v0.14.5)
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2020-11-23 14:47:22 +01:00
175b7c828b Cleanup cache keys
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-23 14:36:43 +01:00
002119324f Remove unused dependencies 2020-11-23 14:35:12 +01:00
df78b6f1e5 Revert "Dummy modification for audit"
All checks were successful
continuous-integration/drone/push Build is passing
This reverts commit e1bff0d280.
2020-11-23 14:21:46 +01:00
e1bff0d280 Dummy modification for audit
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-23 14:19:39 +01:00
4c9454aa9e Use different cache keys per pipeline 2020-11-23 14:19:11 +01:00
e9e57495a6 Disable nix-build
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-23 14:13:02 +01:00
b6505f6a37 Disable nix-build
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-23 14:12:32 +01:00
a2463bf657 Release binaries on github release page
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-23 14:11:36 +01:00
53cb73cd9b Use checkout@v2 2020-11-23 14:11:18 +01:00
423a3aa0b0 Split formatting and clippy checks into separate pipelines 2020-11-23 14:11:01 +01:00
7a2c6b6f06 Merge pull request #197 from vbrandl/dependabot/cargo/reqwest-0.10.9
Bump reqwest from 0.10.8 to 0.10.9
2020-11-23 12:13:19 +01:00
ffb306a7a8 Merge pull request #196 from vbrandl/dependabot/cargo/ructe-0.13.0
Bump ructe from 0.12.0 to 0.13.0
2020-11-23 12:13:08 +01:00
cef2ae2299 Merge pull request #195 from vbrandl/dependabot/cargo/futures-0.3.8
Bump futures from 0.3.7 to 0.3.8
2020-11-23 12:07:59 +01:00
b91de72d19 Remove travis
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-23 12:07:26 +01:00
fd08489587 Bump futures from 0.3.7 to 0.3.8
Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.7 to 0.3.8.
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/futures-rs/compare/0.3.7...0.3.8)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-23 10:57:43 +00:00
ce0d6041ea Bump reqwest from 0.10.8 to 0.10.9
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.10.8 to 0.10.9.
- [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.10.8...v0.10.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-23 10:57:41 +00:00
3af60a82ce Merge pull request #194 from vbrandl/dependabot/cargo/tracing-subscriber-0.2.15
Bump tracing-subscriber from 0.2.14 to 0.2.15
2020-11-23 11:56:47 +01:00
bcdf7db549 Merge pull request #189 from vbrandl/dependabot/cargo/actix-web-3.2.0
Bump actix-web from 3.1.0 to 3.2.0
2020-11-23 11:56:24 +01:00
9b2f1f4ebb Bump ructe from 0.12.0 to 0.13.0
Bumps [ructe](https://github.com/kaj/ructe) from 0.12.0 to 0.13.0.
- [Release notes](https://github.com/kaj/ructe/releases)
- [Changelog](https://github.com/kaj/ructe/blob/master/CHANGELOG.md)
- [Commits](https://github.com/kaj/ructe/compare/v0.12.0...v0.13.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-16 04:19:05 +00:00
84e47237de Bump tracing-subscriber from 0.2.14 to 0.2.15
Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.2.14 to 0.2.15.
- [Release notes](https://github.com/tokio-rs/tracing/releases)
- [Commits](https://github.com/tokio-rs/tracing/compare/tracing-subscriber-0.2.14...tracing-subscriber-0.2.15)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-03 04:18:03 +00:00
909f6585b5 Always return a SVG badge
All checks were successful
continuous-integration/drone/push Build is passing
2020-11-01 13:57:56 +01:00
b48d7f1492 Bump actix-web from 3.1.0 to 3.2.0
Bumps [actix-web](https://github.com/actix/actix-web) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/actix/actix-web/releases)
- [Changelog](https://github.com/actix/actix-web/blob/master/CHANGES.md)
- [Commits](https://github.com/actix/actix-web/compare/web-v3.1.0...web-v3.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-30 20:02:12 +00:00
f1e9d1806f Bump version (v0.14.4)
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2020-10-30 21:01:37 +01:00
8c62d01f3c Merge pull request #191 from vbrandl/feature/tracing
Use `tracing` instead of `slog` for better ergonomics
2020-10-30 21:00:46 +01:00
26a5025a32 Fix state in test
All checks were successful
continuous-integration/drone/push Build is passing
2020-10-30 17:15:09 +01:00
6f931ce46f Use tracing instead of slog for better ergonomics
All checks were successful
continuous-integration/drone/push Build is passing
2020-10-30 16:40:35 +01:00
2d46592c4a Merge pull request #190 from vbrandl/feature/structured-logging
Feature/structured logging
2020-10-30 13:24:45 +01:00
c2d496f2b4 Add logger to test state
All checks were successful
continuous-integration/drone/push Build is passing
2020-10-30 13:20:24 +01:00
19d37806f2 Remove unused import
All checks were successful
continuous-integration/drone/push Build is passing
2020-10-30 13:11:05 +01:00
b4bd9b8830 Refactor to use slog for structured logging
All checks were successful
continuous-integration/drone/push Build is passing
2020-10-30 13:03:06 +01:00
3c8227d0e9 Add slog dependencies 2020-10-30 13:02:53 +01:00
d6409c21ec Bump version (v0.14.3)
All checks were successful
continuous-integration/drone/tag Build is passing
2020-10-28 09:08:30 +01:00
990b5acbda Merge pull request #184 from vbrandl/dependabot/cargo/git2-0.13.12
Bump git2 from 0.13.11 to 0.13.12
2020-10-28 09:07:35 +01:00
f9e14e2ffd Bump git2 from 0.13.11 to 0.13.12
Bumps [git2](https://github.com/rust-lang/git2-rs) from 0.13.11 to 0.13.12.
- [Release notes](https://github.com/rust-lang/git2-rs/releases)
- [Commits](https://github.com/rust-lang/git2-rs/compare/0.13.11...0.13.12)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-28 08:05:44 +00:00
a73afe6851 Merge pull request #186 from vbrandl/dependabot/cargo/bytes-0.6.0
Bump bytes from 0.5.6 to 0.6.0
2020-10-28 09:04:22 +01:00
20544b27d9 Bump bytes from 0.5.6 to 0.6.0
Bumps [bytes](https://github.com/tokio-rs/bytes) from 0.5.6 to 0.6.0.
- [Release notes](https://github.com/tokio-rs/bytes/releases)
- [Changelog](https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/bytes/compare/v0.5.6...v0.6.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-27 09:32:39 +00:00
288573b1a4 Merge pull request #178 from vbrandl/dependabot/cargo/actix-web-3.1.0
Bump actix-web from 3.0.2 to 3.1.0
2020-10-27 10:31:01 +01:00
a12755d7be Merge pull request #182 from vbrandl/dependabot/cargo/structopt-0.3.20
Bump structopt from 0.3.17 to 0.3.20
2020-10-27 09:10:24 +01:00
a248531ce2 Bump actix-web from 3.0.2 to 3.1.0
Bumps [actix-web](https://github.com/actix/actix-web) from 3.0.2 to 3.1.0.
- [Release notes](https://github.com/actix/actix-web/releases)
- [Changelog](https://github.com/actix/actix-web/blob/master/CHANGES.md)
- [Commits](https://github.com/actix/actix-web/compare/web-v3.0.2...web-v3.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-27 08:07:18 +00:00
de7919a031 Bump structopt from 0.3.17 to 0.3.20
Bumps [structopt](https://github.com/TeXitoi/structopt) from 0.3.17 to 0.3.20.
- [Release notes](https://github.com/TeXitoi/structopt/releases)
- [Changelog](https://github.com/TeXitoi/structopt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/TeXitoi/structopt/compare/v0.3.17...v0.3.20)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-27 08:07:15 +00:00
3913039010 Merge pull request #183 from vbrandl/dependabot/cargo/serde_json-1.0.59
Bump serde_json from 1.0.57 to 1.0.59
2020-10-27 09:05:57 +01:00
078d3cdcf9 Merge pull request #185 from vbrandl/dependabot/cargo/serde-1.0.117
Bump serde from 1.0.116 to 1.0.117
2020-10-27 09:05:49 +01:00
c552a84870 Merge pull request #188 from vbrandl/dependabot/cargo/futures-0.3.7
Bump futures from 0.3.5 to 0.3.7
2020-10-27 09:05:37 +01:00
7c1a14b6ad Bump futures from 0.3.5 to 0.3.7
Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.5 to 0.3.7.
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/futures-rs/compare/0.3.5...0.3.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-26 04:17:33 +00:00
c69b8207b8 Bump serde from 1.0.116 to 1.0.117
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.116 to 1.0.117.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.116...v1.0.117)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-16 04:22:26 +00:00
a319f400e9 Bump serde_json from 1.0.57 to 1.0.59
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.57 to 1.0.59.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.57...v1.0.59)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-13 04:19:16 +00:00
ddcb041f3f Bump version
All checks were successful
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2020-09-19 14:23:21 +02:00
2a73370c9f Use normalize path middleware 2020-09-19 14:22:56 +02:00
689a2109fa Merge pull request #175 from vbrandl/dependabot/cargo/actix-web-3.0.2
Bump actix-web from 3.0.0 to 3.0.2
2020-09-19 14:16:00 +02:00
e82146c912 Merge pull request #174 from vbrandl/dependabot/cargo/serde-1.0.116
Bump serde from 1.0.115 to 1.0.116
2020-09-19 14:15:51 +02:00
568398f1c6 Bump actix-web from 3.0.0 to 3.0.2
Bumps [actix-web](https://github.com/actix/actix-web) from 3.0.0 to 3.0.2.
- [Release notes](https://github.com/actix/actix-web/releases)
- [Changelog](https://github.com/actix/actix-web/blob/master/CHANGES.md)
- [Commits](https://github.com/actix/actix-web/compare/web-v3.0.0...web-v3.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-16 04:18:46 +00:00
1cc6363cba Bump serde from 1.0.115 to 1.0.116
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.115 to 1.0.116.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.115...v1.0.116)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-14 04:18:28 +00:00
dcfca96051 Bump version
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2020-09-12 14:22:00 +02:00
981c347acf Bump version 2020-09-12 14:14:12 +02:00
22aad6ed77 Fix breaking changes 2020-09-12 14:13:19 +02:00
b06bbbba8f Upgrade actix-web to 3.0.0 2020-09-12 14:01:59 +02:00
e06e6736c0 Merge pull request #170 from vbrandl/dependabot/cargo/reqwest-0.10.8
Bump reqwest from 0.10.6 to 0.10.8
2020-09-11 19:48:23 +02:00
0abfba8b4f Bump reqwest from 0.10.6 to 0.10.8
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.10.6 to 0.10.8.
- [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.10.6...v0.10.8)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-11 17:40:12 +00:00
ca87bf9282 Merge pull request #172 from vbrandl/dependabot/cargo/git2-0.13.11
Bump git2 from 0.13.5 to 0.13.11
2020-09-11 19:39:02 +02:00
4f37b101ae Merge pull request #169 from vbrandl/dependabot/cargo/structopt-0.3.17
Bump structopt from 0.3.15 to 0.3.17
2020-09-11 19:38:52 +02:00
e16f02d729 Merge pull request #166 from vbrandl/dependabot/cargo/serde-1.0.115
Bump serde from 1.0.114 to 1.0.115
2020-09-11 19:38:35 +02:00
1256996d19 Bump structopt from 0.3.15 to 0.3.17
Bumps [structopt](https://github.com/TeXitoi/structopt) from 0.3.15 to 0.3.17.
- [Release notes](https://github.com/TeXitoi/structopt/releases)
- [Changelog](https://github.com/TeXitoi/structopt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/TeXitoi/structopt/compare/v0.3.15...v0.3.17)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-11 17:21:11 +00:00
c1d1551283 Bump git2 from 0.13.5 to 0.13.11
Bumps [git2](https://github.com/rust-lang/git2-rs) from 0.13.5 to 0.13.11.
- [Release notes](https://github.com/rust-lang/git2-rs/releases)
- [Commits](https://github.com/rust-lang/git2-rs/compare/0.13.5...0.13.11)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-11 17:21:09 +00:00
26bdb3dbb5 Bump serde from 1.0.114 to 1.0.115
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.114 to 1.0.115.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.114...v1.0.115)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-11 17:20:46 +00:00
c9d959d4c5 Merge pull request #167 from vbrandl/dependabot/cargo/ructe-0.12.0
Bump ructe from 0.11.4 to 0.12.0
2020-09-11 19:19:51 +02:00
15ca2f10b8 Merge pull request #164 from vbrandl/dependabot/cargo/serde_json-1.0.57
Bump serde_json from 1.0.56 to 1.0.57
2020-09-11 19:19:40 +02:00
2a81fbe9f2 Merge pull request #161 from vbrandl/dependabot/cargo/log4rs-0.13.0
Bump log4rs from 0.12.0 to 0.13.0
2020-09-11 19:19:21 +02:00
fe276458db Merge pull request #162 from vbrandl/dependabot/cargo/badge-0.3.0
Bump badge from 0.2.0 to 0.3.0
2020-09-11 19:16:54 +02:00
73d034ff00 Bump ructe from 0.11.4 to 0.12.0
Bumps [ructe](https://github.com/kaj/ructe) from 0.11.4 to 0.12.0.
- [Release notes](https://github.com/kaj/ructe/releases)
- [Commits](https://github.com/kaj/ructe/compare/v0.11.4...v0.12.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-17 04:17:07 +00:00
63e6a3d2db Bump serde_json from 1.0.56 to 1.0.57
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.56 to 1.0.57.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.56...v1.0.57)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-27 04:17:23 +00:00
fbb5bbd20e Bump badge from 0.2.0 to 0.3.0
Bumps [badge](https://github.com/rust-lang/docs.rs) from 0.2.0 to 0.3.0.
- [Release notes](https://github.com/rust-lang/docs.rs/releases)
- [Commits](https://github.com/rust-lang/docs.rs/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-27 04:16:38 +00:00
7ff238fea6 Bump log4rs from 0.12.0 to 0.13.0
Bumps [log4rs](https://github.com/estk/log4rs) from 0.12.0 to 0.13.0.
- [Release notes](https://github.com/estk/log4rs/releases)
- [Changelog](https://github.com/estk/log4rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/estk/log4rs/compare/v0.12.0...v0.13.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-23 04:19:01 +00:00
06e9926cb5 Bump version number
All checks were successful
continuous-integration/drone/push Build is passing
2020-07-20 20:18:05 +02:00
c9a54eda49 Allow requesting badges for branches != master
This changed the cache structure to allow caching data for multiple
branches. The service still assumes a default branch named `master` but
using the `branch` get parameter, the default branch can be changed.

The 404 page for the missing `master` branch was changed to explain the
new parameter.
2020-07-20 20:14:22 +02:00
382cd73bae Merge pull request #146 from vbrandl/dependabot/cargo/reqwest-0.10.6
Bump reqwest from 0.10.4 to 0.10.6
2020-07-17 14:26:31 +02:00
8e5270a1d8 Bump reqwest from 0.10.4 to 0.10.6
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.10.4 to 0.10.6.
- [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.10.4...v0.10.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-17 11:13:46 +00:00
fdf3fda24a Merge pull request #151 from vbrandl/dependabot/cargo/structopt-0.3.15
Bump structopt from 0.3.14 to 0.3.15
2020-07-17 13:12:29 +02:00
219099779b Merge pull request #153 from vbrandl/dependabot/cargo/serde-1.0.114
Bump serde from 1.0.110 to 1.0.114
2020-07-17 13:12:10 +02:00
7393ba54f1 Bump structopt from 0.3.14 to 0.3.15
Bumps [structopt](https://github.com/TeXitoi/structopt) from 0.3.14 to 0.3.15.
- [Release notes](https://github.com/TeXitoi/structopt/releases)
- [Changelog](https://github.com/TeXitoi/structopt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/TeXitoi/structopt/compare/v0.3.14...v0.3.15)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-16 19:17:00 +00:00
c14cf28a3e Bump serde from 1.0.110 to 1.0.114
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.110 to 1.0.114.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.110...v1.0.114)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-16 19:16:22 +00:00
68a0604365 Merge pull request #154 from vbrandl/dependabot/cargo/serde_json-1.0.56
Bump serde_json from 1.0.53 to 1.0.56
2020-07-16 21:15:26 +02:00
8dc07554f6 Merge pull request #157 from vbrandl/dependabot/cargo/bytes-0.5.6
Bump bytes from 0.5.4 to 0.5.6
2020-07-16 21:15:04 +02:00
64bb6c2922 Merge pull request #158 from vbrandl/dependabot/cargo/log-0.4.11
Bump log from 0.4.8 to 0.4.11
2020-07-16 21:14:42 +02:00
4be0cdeb5f Bump log from 0.4.8 to 0.4.11
Bumps [log](https://github.com/rust-lang/log) from 0.4.8 to 0.4.11.
- [Release notes](https://github.com/rust-lang/log/releases)
- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/log/compare/0.4.8...0.4.11)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-16 04:17:29 +00:00
0c9da804bb Bump bytes from 0.5.4 to 0.5.6
Bumps [bytes](https://github.com/tokio-rs/bytes) from 0.5.4 to 0.5.6.
- [Release notes](https://github.com/tokio-rs/bytes/releases)
- [Changelog](https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/bytes/compare/v0.5.4...v0.5.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-14 04:19:23 +00:00
f95a2a7923 Bump serde_json from 1.0.53 to 1.0.56
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.53 to 1.0.56.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.53...v1.0.56)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-30 04:15:29 +00:00
8eff7db8ae Document deletion feature
All checks were successful
continuous-integration/drone/push Build is passing
2020-05-15 14:03:17 +02:00
57df8ab209 Update dependencies
All checks were successful
continuous-integration/drone/push Build is passing
2020-05-15 13:58:57 +02:00
ffea4f21ef Update nixpkgs channel 2020-05-15 13:58:45 +02:00
0b0e88c604 Bump version number
All checks were successful
continuous-integration/drone/push Build is passing
2020-05-15 13:44:02 +02:00
c48e27c649 Merge pull request #138 from vbrandl/dependabot/cargo/log4rs-0.12.0
Bump log4rs from 0.11.0 to 0.12.0
2020-05-15 13:43:21 +02:00
dfa353c356 Bump log4rs from 0.11.0 to 0.12.0
Bumps [log4rs](https://github.com/estk/log4rs) from 0.11.0 to 0.12.0.
- [Release notes](https://github.com/estk/log4rs/releases)
- [Changelog](https://github.com/estk/log4rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/estk/log4rs/compare/v0.11.0...v0.12.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-15 11:37:13 +00:00
2f1209d1e0 Create folders to fix test
All checks were successful
continuous-integration/drone/push Build is passing
2020-05-15 13:34:48 +02:00
195815fc8a Merge pull request #139 from vbrandl/dependabot/cargo/serde-1.0.110
Bump serde from 1.0.106 to 1.0.110
2020-05-15 13:17:10 +02:00
4e393fdd57 Merge pull request #140 from vbrandl/dependabot/cargo/serde_json-1.0.53
Bump serde_json from 1.0.52 to 1.0.53
2020-05-15 13:17:02 +02:00
75f14f7878 Merge pull request #141 from vbrandl/dependabot/cargo/futures-0.3.5
Bump futures from 0.3.4 to 0.3.5
2020-05-15 13:16:39 +02:00
349640acc5 Implement endpoint for cache deletion
All checks were successful
continuous-integration/drone/push Build is passing
2020-05-15 13:15:54 +02:00
1d0eca90a7 Implement simple integration test 2020-05-15 12:15:18 +02:00
81bb65db4e Use async/await syntax 2020-05-15 12:15:02 +02:00
6295477ccf Bump futures from 0.3.4 to 0.3.5
Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.4 to 0.3.5.
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/futures-rs/compare/0.3.4...0.3.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-11 04:19:54 +00:00
b7324b3b38 Bump serde_json from 1.0.52 to 1.0.53
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.52 to 1.0.53.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.52...v1.0.53)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-11 04:19:34 +00:00
e90fb7f54c Bump serde from 1.0.106 to 1.0.110
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.106 to 1.0.110.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.106...v1.0.110)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-11 04:19:10 +00:00
253de8cea2 Merge pull request #132 from vbrandl/dependabot/cargo/structopt-0.3.14
All checks were successful
continuous-integration/drone/push Build is passing
Bump structopt from 0.3.12 to 0.3.14
2020-05-01 13:18:45 +02:00
bd014301fd Merge pull request #124 from vbrandl/dependabot/cargo/number_prefix-0.4.0
Bump number_prefix from 0.3.0 to 0.4.0
2020-05-01 13:18:38 +02:00
45c0d26e33 Use new number_prefix API 2020-05-01 13:18:22 +02:00
0edceb6a7d Bump number_prefix from 0.3.0 to 0.4.0
Bumps [number_prefix](https://github.com/ogham/rust-number-prefix) from 0.3.0 to 0.4.0.
- [Release notes](https://github.com/ogham/rust-number-prefix/releases)
- [Commits](https://github.com/ogham/rust-number-prefix/compare/v0.3.0...v0.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-01 11:11:21 +00:00
056d798d61 Bump structopt from 0.3.12 to 0.3.14
Bumps [structopt](https://github.com/TeXitoi/structopt) from 0.3.12 to 0.3.14.
- [Release notes](https://github.com/TeXitoi/structopt/releases)
- [Changelog](https://github.com/TeXitoi/structopt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/TeXitoi/structopt/compare/v0.3.12...v0.3.14)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-01 11:11:16 +00:00
96f2e9422c Merge pull request #122 from vbrandl/dependabot/cargo/serde-1.0.106
Bump serde from 1.0.105 to 1.0.106
2020-05-01 13:10:00 +02:00
df19951729 Bump serde from 1.0.105 to 1.0.106
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.105 to 1.0.106.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.105...v1.0.106)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-01 11:09:53 +00:00
bfc97dad32 Merge pull request #134 from vbrandl/dependabot/cargo/git2-0.13.5
Bump git2 from 0.13.1 to 0.13.5
2020-05-01 13:09:35 +02:00
d28ac95aa2 Merge pull request #135 from vbrandl/dependabot/cargo/ructe-0.11.4
Bump ructe from 0.9.2 to 0.11.4
2020-05-01 13:08:58 +02:00
8a0df3e52c Merge pull request #136 from vbrandl/dependabot/cargo/serde_json-1.0.52
Bump serde_json from 1.0.50 to 1.0.52
2020-05-01 13:08:49 +02:00
e2c42a5287 Merge pull request #137 from vbrandl/dependabot/cargo/actix-rt-1.1.1
Bump actix-rt from 1.0.0 to 1.1.1
2020-05-01 13:08:35 +02:00
f638124930 Bump actix-rt from 1.0.0 to 1.1.1
Bumps [actix-rt](https://github.com/actix/actix-net) from 1.0.0 to 1.1.1.
- [Release notes](https://github.com/actix/actix-net/releases)
- [Commits](https://github.com/actix/actix-net/compare/rt-1.0.0...rt-1.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-01 04:16:49 +00:00
9cabea63c3 Bump serde_json from 1.0.50 to 1.0.52
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.50 to 1.0.52.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.50...v1.0.52)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-29 04:18:02 +00:00
20074ac4e1 Bump ructe from 0.9.2 to 0.11.4
Bumps [ructe](https://github.com/kaj/ructe) from 0.9.2 to 0.11.4.
- [Release notes](https://github.com/kaj/ructe/releases)
- [Commits](https://github.com/kaj/ructe/compare/v0.9.2...v0.11.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-27 04:16:47 +00:00
0ec7bd93d8 Bump git2 from 0.13.1 to 0.13.5
Bumps [git2](https://github.com/rust-lang/git2-rs) from 0.13.1 to 0.13.5.
- [Release notes](https://github.com/rust-lang/git2-rs/releases)
- [Commits](https://github.com/rust-lang/git2-rs/compare/0.13.1...0.13.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-27 04:16:26 +00:00
35 changed files with 2420 additions and 1678 deletions

7
.env.example Normal file
View File

@ -0,0 +1,7 @@
HOC_REPODIR='./repos'
HOC_CACHEDIR='./cache'
HOC_PORT=8080
HOC_HOST='0.0.0.0'
HOC_WORKERS=4
HOC_BASE_URL='http://0.0.0.0:8080'

View File

@ -4,27 +4,24 @@ on:
- cron: '0 1 * * *'
push:
paths:
- 'Cargo.toml'
- 'Cargo.lock'
- '**/Cargo.toml'
- '**/Cargo.lock'
pull_request:
jobs:
security_audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v2
- name: Cache cargo registry
uses: actions/cache@v1
- name: Cache cargo registry, index and build directory
uses: actions/cache@v2
with:
path: /usr/share/rust/.cargo/registry
key: ${{ runner.os }}-cargo-registry
- name: Cache cargo index
uses: actions/cache@v1
with:
path: /usr/share/rust/.cargo/git
key: ${{ runner.os }}-cargo-index
path: |
~/.cargo/registry
~/.cargo/git
./target
key: audit-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- uses: actions-rs/audit-check@v1
with:

View File

@ -1,20 +0,0 @@
name: "Nix Build"
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: cachix/install-nix-action@v8
- name: Cache nix store
uses: actions/cache@v1
with:
path: /nix
key: ${{ runner.os }}-nix-store
- uses: cachix/cachix-action@v5
with:
name: hitsofcode
signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
attributes: package

76
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,76 @@
name: Release
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
jobs:
publish:
name: Publishing for ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
rust: [stable]
include:
- os: macos-latest
artifact_prefix: macos
target: x86_64-apple-darwin
binary_postfix: ""
- os: ubuntu-latest
artifact_prefix: linux
target: x86_64-unknown-linux-gnu
binary_postfix: ""
- os: windows-latest
artifact_prefix: windows
target: x86_64-pc-windows-msvc
binary_postfix: ".exe"
steps:
- name: Checkout sources
uses: actions/checkout@v2
- name: Install stable toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: ${{ matrix.rust }}
override: true
- name: Cache cargo registry, index and build directory
uses: actions/cache@v2
with:
path: |
~/.cargo/registry
~/.cargo/git
./target
key: release-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Cargo build
uses: actions-rs/cargo@v1
with:
command: build
toolchain: ${{ matrix.rust }}
args: --release --target ${{ matrix.target }}
- name: Packaging final binary
shell: bash
run: |
cd target/${{ matrix.target }}/release
strip hoc${{ matrix.binary_postfix }}
tar czvf hoc-${{ matrix.artifact_prefix }}.tar.gz hoc${{ matrix.binary_postfix }}
if [[ ${{ runner.os }} == 'Windows' ]]; then
certutil -hashfile hoc-${{ matrix.artifact_prefix }}.tar.gz sha256 | grep -E [A-Fa-f0-9]{64} > hoc-${{ matrix.artifact_prefix }}.sha256
else
shasum -a 256 hoc-${{ matrix.artifact_prefix }}.tar.gz > hoc-${{ matrix.artifact_prefix }}.sha256
fi
- name: Releasing assets
uses: softprops/action-gh-release@v1
with:
files: |
target/${{ matrix.target }}/release/hoc-${{ matrix.artifact_prefix }}.tar.gz
target/${{ matrix.target }}/release/hoc-${{ matrix.artifact_prefix }}.sha256
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,41 +1,30 @@
name: Rust
on: [push, pull_request]
jobs:
lint:
name: Linting and Formatting Checks
rustfmt:
name: Rustfmt
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v1
uses: actions/checkout@v2
- name: Install stable toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
profile: minimal
override: true
components: rustfmt
- name: Install rustfmt
run: rustup component add rustfmt
- name: Cache cargo registry
uses: actions/cache@v1
- name: Cache cargo registry, index and build directory
uses: actions/cache@v2
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo index
uses: actions/cache@v1
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo build
uses: actions/cache@v1
with:
path: target
key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
path: |
~/.cargo/registry
~/.cargo/git
./target
key: rustfmt-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Check Formatting
uses: actions-rs/cargo@v1
@ -43,8 +32,29 @@ jobs:
command: fmt
args: --all -- --check
- name: Install clippy
run: rustup component add clippy
clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v2
- name: Install stable toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
profile: minimal
override: true
components: rustfmt
- name: Cache cargo registry, index and build directory
uses: actions/cache@v2
with:
path: |
~/.cargo/registry
~/.cargo/git
./target
key: clippy-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Clippy Linting
uses: actions-rs/cargo@v1
@ -52,41 +62,35 @@ jobs:
command: clippy
args: -- -D warnings
test:
name: Run Tests
name: Test Suite
runs-on: ${{ matrix.os }}
strategy:
matrix:
# add windows-latest when it is clear why tests are failing
os: [ubuntu-latest, macos-latest]
# os: [ubuntu-latest, macos-latest]
os: [ubuntu-latest]
steps:
- name: Checkout sources
uses: actions/checkout@v1
uses: actions/checkout@v2
- name: Install stable toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
profile: minimal
override: true
- name: Cache cargo registry
uses: actions/cache@v1
- name: Cache cargo registry, index and build directory
uses: actions/cache@v2
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo index
uses: actions/cache@v1
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo build
uses: actions/cache@v1
with:
path: target
key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
path: |
~/.cargo/registry
~/.cargo/git
./target
key: test-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Run Tests
uses: actions-rs/cargo@v1

1
.gitignore vendored
View File

@ -4,3 +4,4 @@ repos
cache
hoc.log
result
.env

View File

@ -1,53 +0,0 @@
image: docker:19.03
services:
- docker:19.03-dind
stages:
- build
- release
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_DRIVER: overlay2
# DOCKER_TLS_CERTDIR: "/certs"
DOCKER_TLS_CERTDIR: ""
CONTAINER_BUILDER_IMAGE: $CI_REGISTRY_IMAGE:builder-latest
CONTAINER_TEST_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE:latest
before_script:
- export CONTAINER_TAG_IMAGE="$CI_REGISTRY_IMAGE:${CI_COMMIT_TAG:1}"
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
build:
stage: build
script:
- docker pull $CONTAINER_TEST_IMAGE || true
- docker pull $CONTAINER_RELEASE_IMAGE || true
- docker pull $CONTAINER_TAG_IMAGE || true
- docker pull $CONTAINER_BUILDER_IMAGE || true
- docker build --pull -t $CONTAINER_BUILDER_IMAGE --target builder .
- docker build --pull -t $CONTAINER_TEST_IMAGE .
- docker push $CONTAINER_BUILDER_IMAGE
- docker push $CONTAINER_TEST_IMAGE
release-image:
stage: release
script:
- docker pull $CONTAINER_TEST_IMAGE
- docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
- docker push $CONTAINER_RELEASE_IMAGE
only:
- master
release-tag:
stage: release
script:
- docker pull $CONTAINER_TEST_IMAGE
- docker tag $CONTAINER_TEST_IMAGE $CONTAINER_TAG_IMAGE
- docker push $CONTAINER_TAG_IMAGE
only:
- /^v\d+\.\d+\.\d+/
except:
- branch

View File

@ -1,17 +0,0 @@
language: rust
rust:
- stable
- beta
- nightly
cache:
- cargo
matrix:
allow_failures:
- rust: nightly
notifications:
email:
on_failure: always

1922
Cargo.lock generated

File diff suppressed because it is too large Load Diff

387
Cargo.nix
View File

@ -27,7 +27,7 @@ in
{
cargo2nixVersion = "0.8.2";
workspace = {
hoc = rustPackages.unknown.hoc."0.11.8";
hoc = rustPackages.unknown.hoc."0.12.0";
};
"registry+https://github.com/rust-lang/crates.io-index".actix-codec."0.2.0" = overridableMkRustCrate (profileName: rec {
name = "actix-codec";
@ -37,8 +37,8 @@ in
dependencies = {
bitflags = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."1.2.1" { inherit profileName; };
bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."0.5.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.5" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."0.2.11" { inherit profileName; };
tokio_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.2.0" { inherit profileName; };
@ -57,12 +57,12 @@ in
];
dependencies = {
actix_codec = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-codec."0.2.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.0.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.1.1" { inherit profileName; };
actix_service = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-service."1.0.5" { inherit profileName; };
actix_utils = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-utils."1.0.6" { inherit profileName; };
derive_more = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".derive_more."0.99.2" { profileName = "__noProfile"; };
either = rustPackages."registry+https://github.com/rust-lang/crates.io-index".either."1.5.3" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.4" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.5" { inherit profileName; };
http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.0" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
trust_dns_proto = rustPackages."registry+https://github.com/rust-lang/crates.io-index".trust-dns-proto."0.18.0-alpha.2" { inherit profileName; };
@ -86,7 +86,7 @@ in
dependencies = {
actix_codec = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-codec."0.2.0" { inherit profileName; };
actix_connect = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-connect."1.0.2" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.0.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.1.1" { inherit profileName; };
actix_service = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-service."1.0.5" { inherit profileName; };
actix_threadpool = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-threadpool."0.3.1" { inherit profileName; };
actix_utils = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-utils."1.0.6" { inherit profileName; };
@ -101,9 +101,9 @@ in
encoding_rs = rustPackages."registry+https://github.com/rust-lang/crates.io-index".encoding_rs."0.8.22" { inherit profileName; };
fail_ure = rustPackages."registry+https://github.com/rust-lang/crates.io-index".failure."0.1.6" { inherit profileName; };
flate2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".flate2."1.0.13" { inherit profileName; };
futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.4" { inherit profileName; };
futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.5" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.5" { inherit profileName; };
fxhash = rustPackages."registry+https://github.com/rust-lang/crates.io-index".fxhash."0.2.1" { inherit profileName; };
h2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.2.4" { inherit profileName; };
http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.0" { inherit profileName; };
@ -117,8 +117,8 @@ in
pin_project = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."0.4.8" { inherit profileName; };
rand = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.7.3" { inherit profileName; };
regex = rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.3.4" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.50" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.53" { inherit profileName; };
serde_urlencoded = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_urlencoded."0.6.1" { inherit profileName; };
sha1 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha1."0.6.0" { inherit profileName; };
slab = rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.2" { inherit profileName; };
@ -151,20 +151,22 @@ in
http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.0" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
regex = rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.3.4" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
};
});
"registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.0.0" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.1.1" = overridableMkRustCrate (profileName: rec {
name = "actix-rt";
version = "1.0.0";
version = "1.1.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "3f6a0a55507046441a496b2f0d26a84a65e67c8cafffe279072412f624b5fb6d"; };
src = fetchCratesIo { inherit name version; sha256 = "143fcc2912e0d1de2bcf4e2f720d2a60c28652ab4179685a1ee159e0fb3db227"; };
dependencies = {
actix_macros = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-macros."0.1.1" { profileName = "__noProfile"; };
actix_threadpool = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-threadpool."0.3.1" { inherit profileName; };
copyless = rustPackages."registry+https://github.com/rust-lang/crates.io-index".copyless."0.1.4" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.4" { inherit profileName; };
futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.5" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.5" { inherit profileName; };
smallvec = rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.2.0" { inherit profileName; };
tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."0.2.11" { inherit profileName; };
};
});
@ -179,10 +181,10 @@ in
];
dependencies = {
actix_codec = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-codec."0.2.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.0.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.1.1" { inherit profileName; };
actix_service = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-service."1.0.5" { inherit profileName; };
actix_utils = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-utils."1.0.6" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.4" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.5" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
mio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".mio."0.6.21" { inherit profileName; };
mio_uds = rustPackages."registry+https://github.com/rust-lang/crates.io-index".mio-uds."0.6.7" { inherit profileName; };
@ -198,7 +200,7 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "d3e4fc95dfa7e24171b2d0bb46b85f8ab0e8499e4e3caec691fc4ea65c287564"; };
dependencies = {
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.4" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.5" { inherit profileName; };
pin_project = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."0.4.8" { inherit profileName; };
};
});
@ -210,10 +212,10 @@ in
src = fetchCratesIo { inherit name version; sha256 = "48494745b72d0ea8ff0cf874aaf9b622a3ee03d7081ee0c04edea4f26d32c911"; };
dependencies = {
actix_macros = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-macros."0.1.1" { profileName = "__noProfile"; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.0.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.1.1" { inherit profileName; };
actix_server = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-server."1.0.1" { inherit profileName; };
actix_service = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-service."1.0.5" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.4" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.5" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
net2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".net2."0.2.33" { inherit profileName; };
};
@ -226,7 +228,7 @@ in
src = fetchCratesIo { inherit name version; sha256 = "cf4082192601de5f303013709ff84d81ca6a1bc4af7fb24f367a500a23c6e84e"; };
dependencies = {
derive_more = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".derive_more."0.99.2" { profileName = "__noProfile"; };
futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.4" { inherit profileName; };
futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.5" { inherit profileName; };
lazy_static = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
num_cpus = rustPackages."registry+https://github.com/rust-lang/crates.io-index".num_cpus."1.12.0" { inherit profileName; };
@ -245,12 +247,12 @@ in
];
dependencies = {
actix_codec = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-codec."0.2.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.0.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.1.1" { inherit profileName; };
actix_service = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-service."1.0.5" { inherit profileName; };
actix_utils = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-utils."1.0.6" { inherit profileName; };
derive_more = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".derive_more."0.99.2" { profileName = "__noProfile"; };
either = rustPackages."registry+https://github.com/rust-lang/crates.io-index".either."1.5.3" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.4" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.5" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
};
});
@ -262,12 +264,12 @@ in
src = fetchCratesIo { inherit name version; sha256 = "fcf8f5631bf01adec2267808f00e228b761c60c0584cc9fa0b5364f41d147f4e"; };
dependencies = {
actix_codec = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-codec."0.2.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.0.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.1.1" { inherit profileName; };
actix_service = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-service."1.0.5" { inherit profileName; };
bitflags = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."1.2.1" { inherit profileName; };
bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."0.5.4" { inherit profileName; };
either = rustPackages."registry+https://github.com/rust-lang/crates.io-index".either."1.5.3" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.4" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.5" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
pin_project = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."0.4.8" { inherit profileName; };
slab = rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.2" { inherit profileName; };
@ -289,7 +291,7 @@ in
actix_http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-http."1.0.1" { inherit profileName; };
actix_macros = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-macros."0.1.1" { profileName = "__noProfile"; };
actix_router = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-router."0.2.4" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.0.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.1.1" { inherit profileName; };
actix_server = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-server."1.0.1" { inherit profileName; };
actix_service = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-service."1.0.5" { inherit profileName; };
actix_testing = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-testing."1.0.0" { inherit profileName; };
@ -301,15 +303,15 @@ in
bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."0.5.4" { inherit profileName; };
derive_more = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".derive_more."0.99.2" { profileName = "__noProfile"; };
encoding_rs = rustPackages."registry+https://github.com/rust-lang/crates.io-index".encoding_rs."0.8.22" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.4" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.5" { inherit profileName; };
fxhash = rustPackages."registry+https://github.com/rust-lang/crates.io-index".fxhash."0.2.1" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
mime = rustPackages."registry+https://github.com/rust-lang/crates.io-index".mime."0.3.16" { inherit profileName; };
net2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".net2."0.2.33" { inherit profileName; };
pin_project = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."0.4.8" { inherit profileName; };
regex = rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.3.4" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.50" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.53" { inherit profileName; };
serde_urlencoded = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_urlencoded."0.6.1" { inherit profileName; };
time = rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.1.42" { inherit profileName; };
url = rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.1.1" { inherit profileName; };
@ -434,18 +436,18 @@ in
dependencies = {
actix_codec = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-codec."0.2.0" { inherit profileName; };
actix_http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-http."1.0.1" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.0.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.1.1" { inherit profileName; };
actix_service = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-service."1.0.5" { inherit profileName; };
base64 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.11.0" { inherit profileName; };
bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."0.5.4" { inherit profileName; };
derive_more = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".derive_more."0.99.2" { profileName = "__noProfile"; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
mime = rustPackages."registry+https://github.com/rust-lang/crates.io-index".mime."0.3.16" { inherit profileName; };
percent_encoding = rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.1.0" { inherit profileName; };
rand = rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.7.3" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.50" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.53" { inherit profileName; };
serde_urlencoded = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_urlencoded."0.6.1" { inherit profileName; };
};
});
@ -518,6 +520,17 @@ in
];
});
"registry+https://github.com/rust-lang/crates.io-index".base64."0.12.0" = overridableMkRustCrate (profileName: rec {
name = "base64";
version = "0.12.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "7d5ca2cd0adc3f48f9e9ea5a6bbdf9ccc0bfade884847e484d452414c7ccffb3"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
});
"registry+https://github.com/rust-lang/crates.io-index".bitflags."1.2.1" = overridableMkRustCrate (profileName: rec {
name = "bitflags";
version = "1.2.1";
@ -899,11 +912,11 @@ in
src = fetchCratesIo { inherit name version; sha256 = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"; };
});
"registry+https://github.com/rust-lang/crates.io-index".futures."0.3.4" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".futures."0.3.5" = overridableMkRustCrate (profileName: rec {
name = "futures";
version = "0.3.4";
version = "0.3.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "5c329ae8753502fb44ae4fc2b622fa2a94652c41e795143765ba0927f92ab780"; };
src = fetchCratesIo { inherit name version; sha256 = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613"; };
features = builtins.concatLists [
[ "alloc" ]
[ "async-await" ]
@ -913,21 +926,21 @@ in
[ "std" ]
];
dependencies = {
futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_executor = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.4" { inherit profileName; };
futures_io = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.4" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.4" { inherit profileName; };
futures_task = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.4" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.4" { inherit profileName; };
futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.5" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
futures_executor = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.5" { inherit profileName; };
futures_io = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.5" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.5" { inherit profileName; };
futures_task = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.5" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.5" { inherit profileName; };
};
});
"registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.4" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.5" = overridableMkRustCrate (profileName: rec {
name = "futures-channel";
version = "0.3.4";
version = "0.3.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8"; };
src = fetchCratesIo { inherit name version; sha256 = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
@ -936,16 +949,16 @@ in
[ "std" ]
];
dependencies = {
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.5" { inherit profileName; };
};
});
"registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" = overridableMkRustCrate (profileName: rec {
name = "futures-core";
version = "0.3.4";
version = "0.3.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a"; };
src = fetchCratesIo { inherit name version; sha256 = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
@ -953,36 +966,36 @@ in
];
});
"registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.4" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.5" = overridableMkRustCrate (profileName: rec {
name = "futures-executor";
version = "0.3.4";
version = "0.3.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba"; };
src = fetchCratesIo { inherit name version; sha256 = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314"; };
features = builtins.concatLists [
[ "std" ]
];
dependencies = {
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_task = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.4" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
futures_task = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.5" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.5" { inherit profileName; };
};
});
"registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.4" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.5" = overridableMkRustCrate (profileName: rec {
name = "futures-io";
version = "0.3.4";
version = "0.3.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6"; };
src = fetchCratesIo { inherit name version; sha256 = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789"; };
features = builtins.concatLists [
[ "std" ]
];
});
"registry+https://github.com/rust-lang/crates.io-index".futures-macro."0.3.4" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".futures-macro."0.3.5" = overridableMkRustCrate (profileName: rec {
name = "futures-macro";
version = "0.3.4";
version = "0.3.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7"; };
src = fetchCratesIo { inherit name version; sha256 = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39"; };
dependencies = {
proc_macro_hack = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-hack."0.5.11" { profileName = "__noProfile"; };
proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.8" { inherit profileName; };
@ -991,11 +1004,11 @@ in
};
});
"registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.4" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.5" = overridableMkRustCrate (profileName: rec {
name = "futures-sink";
version = "0.3.4";
version = "0.3.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6"; };
src = fetchCratesIo { inherit name version; sha256 = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
@ -1003,22 +1016,26 @@ in
];
});
"registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.4" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.5" = overridableMkRustCrate (profileName: rec {
name = "futures-task";
version = "0.3.4";
version = "0.3.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27"; };
src = fetchCratesIo { inherit name version; sha256 = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626"; };
features = builtins.concatLists [
[ "alloc" ]
[ "once_cell" ]
[ "std" ]
];
dependencies = {
once_cell = rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.3.1" { inherit profileName; };
};
});
"registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.4" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.5" = overridableMkRustCrate (profileName: rec {
name = "futures-util";
version = "0.3.4";
version = "0.3.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5"; };
src = fetchCratesIo { inherit name version; sha256 = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6"; };
features = builtins.concatLists [
[ "alloc" ]
[ "async-await" ]
@ -1038,14 +1055,15 @@ in
[ "std" ]
];
dependencies = {
futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_io = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.4" { inherit profileName; };
futures_macro = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-macro."0.3.4" { profileName = "__noProfile"; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.4" { inherit profileName; };
futures_task = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.4" { inherit profileName; };
futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.5" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
futures_io = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.5" { inherit profileName; };
futures_macro = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-macro."0.3.5" { profileName = "__noProfile"; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.5" { inherit profileName; };
futures_task = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.5" { inherit profileName; };
memchr = rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.3.0" { inherit profileName; };
pin_utils = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0-alpha.4" { inherit profileName; };
pin_project = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."0.4.8" { inherit profileName; };
pin_utils = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0" { inherit profileName; };
proc_macro_hack = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-hack."0.5.11" { profileName = "__noProfile"; };
proc_macro_nested = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-nested."0.1.3" { inherit profileName; };
slab = rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.2" { inherit profileName; };
@ -1077,11 +1095,11 @@ in
};
});
"registry+https://github.com/rust-lang/crates.io-index".git2."0.13.1" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".git2."0.13.5" = overridableMkRustCrate (profileName: rec {
name = "git2";
version = "0.13.1";
version = "0.13.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "ef222034f2069cfc5af01ce423574d3d9a3925bd4052912a14e5bcfd7ca9e47a"; };
src = fetchCratesIo { inherit name version; sha256 = "e1e02a51cd90229028c9bd8be0a0364f85b6b3199cccaa0ef39005ddbd5ac165"; };
features = builtins.concatLists [
[ "default" ]
[ "https" ]
@ -1093,7 +1111,7 @@ in
dependencies = {
bitflags = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."1.2.1" { inherit profileName; };
libc = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.66" { inherit profileName; };
libgit2_sys = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libgit2-sys."0.12.2+1.0.0" { inherit profileName; };
libgit2_sys = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libgit2-sys."0.12.5+1.0.0" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
${ if hostPlatform.isUnix && !(hostPlatform.parsed.kernel.name == "darwin") then "openssl_probe" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".openssl-probe."0.1.2" { inherit profileName; };
${ if hostPlatform.isUnix && !(hostPlatform.parsed.kernel.name == "darwin") then "openssl_sys" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".openssl-sys."0.9.54" { inherit profileName; };
@ -1109,9 +1127,9 @@ in
dependencies = {
bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."0.5.4" { inherit profileName; };
fnv = rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.6" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.4" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.5" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.5" { inherit profileName; };
http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.0" { inherit profileName; };
indexmap = rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."1.3.2" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
@ -1144,31 +1162,34 @@ in
};
});
"unknown".hoc."0.11.8" = overridableMkRustCrate (profileName: rec {
"unknown".hoc."0.12.0" = overridableMkRustCrate (profileName: rec {
name = "hoc";
version = "0.11.8";
version = "0.12.0";
registry = "unknown";
src = fetchCrateLocal ./.;
dependencies = {
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.0.0" { inherit profileName; };
actix_rt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-rt."1.1.1" { inherit profileName; };
actix_web = rustPackages."registry+https://github.com/rust-lang/crates.io-index".actix-web."2.0.0" { inherit profileName; };
badge = rustPackages."registry+https://github.com/rust-lang/crates.io-index".badge."0.2.0" { inherit profileName; };
bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."0.5.4" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.4" { inherit profileName; };
git2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".git2."0.13.1" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.5" { inherit profileName; };
git2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".git2."0.13.5" { inherit profileName; };
lazy_static = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
log4rs = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log4rs."0.11.0" { inherit profileName; };
number_prefix = rustPackages."registry+https://github.com/rust-lang/crates.io-index".number_prefix."0.3.0" { inherit profileName; };
log4rs = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log4rs."0.12.0" { inherit profileName; };
number_prefix = rustPackages."registry+https://github.com/rust-lang/crates.io-index".number_prefix."0.4.0" { inherit profileName; };
openssl_probe = rustPackages."registry+https://github.com/rust-lang/crates.io-index".openssl-probe."0.1.2" { inherit profileName; };
reqwest = rustPackages."registry+https://github.com/rust-lang/crates.io-index".reqwest."0.10.4" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.105" { profileName = "__noProfile"; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.50" { inherit profileName; };
structopt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".structopt."0.3.12" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
serde_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.110" { profileName = "__noProfile"; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.53" { inherit profileName; };
structopt = rustPackages."registry+https://github.com/rust-lang/crates.io-index".structopt."0.3.14" { inherit profileName; };
};
devDependencies = {
tempfile = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tempfile."3.1.0" { inherit profileName; };
};
buildDependencies = {
ructe = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".ructe."0.9.2" { profileName = "__noProfile"; };
ructe = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".ructe."0.11.4" { profileName = "__noProfile"; };
vergen = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".vergen."3.1.0" { profileName = "__noProfile"; };
};
});
@ -1239,9 +1260,9 @@ in
];
dependencies = {
bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."0.5.4" { inherit profileName; };
futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.4" { inherit profileName; };
futures_channel = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.5" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
futures_util = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.5" { inherit profileName; };
h2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.2.4" { inherit profileName; };
http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.0" { inherit profileName; };
http_body = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.3.1" { inherit profileName; };
@ -1316,11 +1337,11 @@ in
};
});
"registry+https://github.com/rust-lang/crates.io-index".itertools."0.8.2" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".itertools."0.9.0" = overridableMkRustCrate (profileName: rec {
name = "itertools";
version = "0.8.2";
version = "0.9.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484"; };
src = fetchCratesIo { inherit name version; sha256 = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"; };
features = builtins.concatLists [
[ "default" ]
[ "use_std" ]
@ -1423,11 +1444,11 @@ in
];
});
"registry+https://github.com/rust-lang/crates.io-index".libgit2-sys."0.12.2+1.0.0" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".libgit2-sys."0.12.5+1.0.0" = overridableMkRustCrate (profileName: rec {
name = "libgit2-sys";
version = "0.12.2+1.0.0";
version = "0.12.5+1.0.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "a12c878ccc1a49ff71e264233a66d2114cdcc7fdc44c0ebe2b54075240831238"; };
src = fetchCratesIo { inherit name version; sha256 = "3eadeec65514971355bf7134967a543f71372f35b53ac6c7143e7bd157f07535"; };
features = builtins.concatLists [
[ "https" ]
[ "libssh2-sys" ]
@ -1507,7 +1528,7 @@ in
];
dependencies = {
cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."0.1.10" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
};
});
@ -1518,11 +1539,11 @@ in
src = fetchCratesIo { inherit name version; sha256 = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7"; };
});
"registry+https://github.com/rust-lang/crates.io-index".log4rs."0.11.0" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".log4rs."0.12.0" = overridableMkRustCrate (profileName: rec {
name = "log4rs";
version = "0.11.0";
version = "0.12.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "b47ba5437ccdf01e4addd4d2347ef561911d57f908f4db1e1b192d5c25a92715"; };
src = fetchCratesIo { inherit name version; sha256 = "f4d8e6e1d5f89acca713132acc6034f30bad09b961d1338161bdb71c08f6e4fa"; };
features = builtins.concatLists [
[ "all_components" ]
[ "ansi_writer" ]
@ -1567,10 +1588,10 @@ in
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
log_mdc = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log-mdc."0.1.0" { inherit profileName; };
parking_lot = rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot."0.10.0" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
serde_value = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde-value."0.6.0" { inherit profileName; };
serde_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.105" { profileName = "__noProfile"; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.50" { inherit profileName; };
serde_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.110" { profileName = "__noProfile"; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.53" { inherit profileName; };
serde_yaml = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_yaml."0.8.11" { inherit profileName; };
thread_id = rustPackages."registry+https://github.com/rust-lang/crates.io-index".thread-id."3.3.0" { inherit profileName; };
typemap = rustPackages."registry+https://github.com/rust-lang/crates.io-index".typemap."0.3.3" { inherit profileName; };
@ -1831,17 +1852,27 @@ in
};
});
"registry+https://github.com/rust-lang/crates.io-index".number_prefix."0.3.0" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".number_prefix."0.4.0" = overridableMkRustCrate (profileName: rec {
name = "number_prefix";
version = "0.3.0";
version = "0.4.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a"; };
src = fetchCratesIo { inherit name version; sha256 = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
});
"registry+https://github.com/rust-lang/crates.io-index".once_cell."1.3.1" = overridableMkRustCrate (profileName: rec {
name = "once_cell";
version = "1.3.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b"; };
features = builtins.concatLists [
[ "std" ]
];
});
"registry+https://github.com/rust-lang/crates.io-index".openssl."0.10.28" = overridableMkRustCrate (profileName: rec {
name = "openssl";
version = "0.10.28";
@ -1970,11 +2001,11 @@ in
src = fetchCratesIo { inherit name version; sha256 = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae"; };
});
"registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0-alpha.4" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0" = overridableMkRustCrate (profileName: rec {
name = "pin-utils";
version = "0.1.0-alpha.4";
version = "0.1.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587"; };
src = fetchCratesIo { inherit name version; sha256 = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"; };
});
"registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.17" = overridableMkRustCrate (profileName: rec {
@ -1995,34 +2026,36 @@ in
];
});
"registry+https://github.com/rust-lang/crates.io-index".proc-macro-error."0.4.8" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".proc-macro-error."1.0.2" = overridableMkRustCrate (profileName: rec {
name = "proc-macro-error";
version = "0.4.8";
version = "1.0.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "875077759af22fa20b610ad4471d8155b321c89c3f2785526c9839b099be4e0a"; };
src = fetchCratesIo { inherit name version; sha256 = "98e9e4b82e0ef281812565ea4751049f1bdcdfccda7d3f459f2e138a40c08678"; };
dependencies = {
proc_macro_error_attr = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-error-attr."0.4.8" { profileName = "__noProfile"; };
proc_macro_error_attr = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-error-attr."1.0.2" { profileName = "__noProfile"; };
proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.8" { inherit profileName; };
quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.2" { inherit profileName; };
syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.14" { inherit profileName; };
};
buildDependencies = {
rustversion = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".rustversion."1.0.2" { profileName = "__noProfile"; };
version_check = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".version_check."0.9.1" { profileName = "__noProfile"; };
};
});
"registry+https://github.com/rust-lang/crates.io-index".proc-macro-error-attr."0.4.8" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".proc-macro-error-attr."1.0.2" = overridableMkRustCrate (profileName: rec {
name = "proc-macro-error-attr";
version = "0.4.8";
version = "1.0.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "c5717d9fa2664351a01ed73ba5ef6df09c01a521cb42cb65a061432a826f3c7a"; };
src = fetchCratesIo { inherit name version; sha256 = "4f5444ead4e9935abd7f27dc51f7e852a0569ac888096d5ec2499470794e2e53"; };
dependencies = {
proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.8" { inherit profileName; };
quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.2" { inherit profileName; };
rustversion = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".rustversion."1.0.2" { profileName = "__noProfile"; };
syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.14" { inherit profileName; };
syn_mid = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn-mid."0.5.0" { inherit profileName; };
};
buildDependencies = {
version_check = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".version_check."0.9.1" { profileName = "__noProfile"; };
};
});
"registry+https://github.com/rust-lang/crates.io-index".proc-macro-hack."0.5.11" = overridableMkRustCrate (profileName: rec {
@ -2223,8 +2256,8 @@ in
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "base64" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.11.0" { inherit profileName; };
bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."0.5.4" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "encoding_rs" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".encoding_rs."0.8.22" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "futures_core" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "futures_util" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.4" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "futures_core" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "futures_util" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.5" { inherit profileName; };
http = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.0" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "http_body" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.3.1" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "hyper" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.13.4" { inherit profileName; };
@ -2237,7 +2270,7 @@ in
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "native_tls_crate" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".native-tls."0.2.3" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "percent_encoding" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.1.0" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "pin_project_lite" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.1.4" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "serde_urlencoded" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_urlencoded."0.6.1" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "time" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.1.42" { inherit profileName; };
${ if !(hostPlatform.parsed.cpu.name == "wasm32") then "tokio" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."0.2.11" { inherit profileName; };
@ -2265,15 +2298,15 @@ in
};
});
"registry+https://github.com/rust-lang/crates.io-index".ructe."0.9.2" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".ructe."0.11.4" = overridableMkRustCrate (profileName: rec {
name = "ructe";
version = "0.9.2";
version = "0.11.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "c85620b8046f88a870d93d90fa56904dec76cc79139bfcc22e71e87f0cd2169f"; };
src = fetchCratesIo { inherit name version; sha256 = "f615d1e172dcc01a7cd78c7f77f21a5669c6de4341548ad2e7764e9045d06657"; };
dependencies = {
base64 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.11.0" { inherit profileName; };
base64 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.12.0" { inherit profileName; };
bytecount = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytecount."0.6.0" { inherit profileName; };
itertools = rustPackages."registry+https://github.com/rust-lang/crates.io-index".itertools."0.8.2" { inherit profileName; };
itertools = rustPackages."registry+https://github.com/rust-lang/crates.io-index".itertools."0.9.0" { inherit profileName; };
md5 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".md5."0.7.0" { inherit profileName; };
nom = rustPackages."registry+https://github.com/rust-lang/crates.io-index".nom."5.1.0" { inherit profileName; };
};
@ -2308,18 +2341,6 @@ in
};
});
"registry+https://github.com/rust-lang/crates.io-index".rustversion."1.0.2" = overridableMkRustCrate (profileName: rec {
name = "rustversion";
version = "1.0.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "b3bba175698996010c4f6dce5e7f173b6eb781fce25d2cfc45e27091ce0b79f6"; };
dependencies = {
proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.8" { inherit profileName; };
quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.2" { inherit profileName; };
syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.14" { inherit profileName; };
};
});
"registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.2" = overridableMkRustCrate (profileName: rec {
name = "ryu";
version = "1.0.2";
@ -2399,11 +2420,11 @@ in
src = fetchCratesIo { inherit name version; sha256 = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"; };
});
"registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" = overridableMkRustCrate (profileName: rec {
name = "serde";
version = "1.0.105";
version = "1.0.110";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "e707fbbf255b8fc8c3b99abb91e7257a622caeb20a9818cbadbeeede4e0932ff"; };
src = fetchCratesIo { inherit name version; sha256 = "99e7b308464d16b56eba9964e4972a3eee817760ab60d88c3f86e1fecb08204c"; };
features = builtins.concatLists [
[ "default" ]
[ "derive" ]
@ -2411,7 +2432,7 @@ in
[ "std" ]
];
dependencies = {
serde_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.105" { profileName = "__noProfile"; };
serde_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.110" { profileName = "__noProfile"; };
};
});
@ -2422,15 +2443,15 @@ in
src = fetchCratesIo { inherit name version; sha256 = "5a65a7291a8a568adcae4c10a677ebcedbc6c9cec91c054dee2ce40b0e3290eb"; };
dependencies = {
ordered_float = rustPackages."registry+https://github.com/rust-lang/crates.io-index".ordered-float."1.0.2" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
};
});
"registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.105" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.110" = overridableMkRustCrate (profileName: rec {
name = "serde_derive";
version = "1.0.105";
version = "1.0.110";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "ac5d00fc561ba2724df6758a17de23df5914f20e41cb00f94d5b7ae42fffaff8"; };
src = fetchCratesIo { inherit name version; sha256 = "818fbf6bfa9a42d3bfcaca148547aa00c7b915bec71d1757aa2d44ca68771984"; };
features = builtins.concatLists [
[ "default" ]
];
@ -2441,11 +2462,11 @@ in
};
});
"registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.50" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.53" = overridableMkRustCrate (profileName: rec {
name = "serde_json";
version = "1.0.50";
version = "1.0.53";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "78a7a12c167809363ec3bd7329fc0a3369056996de43c4b37ef3cd54a6ce4867"; };
src = fetchCratesIo { inherit name version; sha256 = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
@ -2453,7 +2474,7 @@ in
dependencies = {
itoa = rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."0.4.5" { inherit profileName; };
ryu = rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.2" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
};
});
@ -2465,7 +2486,7 @@ in
dependencies = {
dtoa = rustPackages."registry+https://github.com/rust-lang/crates.io-index".dtoa."0.4.5" { inherit profileName; };
itoa = rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."0.4.5" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
url = rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.1.1" { inherit profileName; };
};
});
@ -2478,7 +2499,7 @@ in
dependencies = {
dtoa = rustPackages."registry+https://github.com/rust-lang/crates.io-index".dtoa."0.4.5" { inherit profileName; };
linked_hash_map = rustPackages."registry+https://github.com/rust-lang/crates.io-index".linked-hash-map."0.5.2" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
yaml_rust = rustPackages."registry+https://github.com/rust-lang/crates.io-index".yaml-rust."0.4.3" { inherit profileName; };
};
});
@ -2573,29 +2594,29 @@ in
src = fetchCratesIo { inherit name version; sha256 = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"; };
});
"registry+https://github.com/rust-lang/crates.io-index".structopt."0.3.12" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".structopt."0.3.14" = overridableMkRustCrate (profileName: rec {
name = "structopt";
version = "0.3.12";
version = "0.3.14";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "c8faa2719539bbe9d77869bfb15d4ee769f99525e707931452c97b693b3f159d"; };
src = fetchCratesIo { inherit name version; sha256 = "863246aaf5ddd0d6928dfeb1a9ca65f505599e4e1b399935ef7e75107516b4ef"; };
features = builtins.concatLists [
[ "default" ]
];
dependencies = {
clap = rustPackages."registry+https://github.com/rust-lang/crates.io-index".clap."2.33.0" { inherit profileName; };
lazy_static = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; };
structopt_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".structopt-derive."0.4.5" { profileName = "__noProfile"; };
structopt_derive = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".structopt-derive."0.4.7" { profileName = "__noProfile"; };
};
});
"registry+https://github.com/rust-lang/crates.io-index".structopt-derive."0.4.5" = overridableMkRustCrate (profileName: rec {
"registry+https://github.com/rust-lang/crates.io-index".structopt-derive."0.4.7" = overridableMkRustCrate (profileName: rec {
name = "structopt-derive";
version = "0.4.5";
version = "0.4.7";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "3f88b8e18c69496aad6f9ddf4630dd7d585bcaf765786cb415b9aec2fe5a0430"; };
src = fetchCratesIo { inherit name version; sha256 = "d239ca4b13aee7a2142e6795cbd69e457665ff8037aed33b3effdc430d2f927a"; };
dependencies = {
heck = rustPackages."registry+https://github.com/rust-lang/crates.io-index".heck."0.3.1" { inherit profileName; };
proc_macro_error = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-error."0.4.8" { inherit profileName; };
proc_macro_error = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-error."1.0.2" { inherit profileName; };
proc_macro2 = rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.8" { inherit profileName; };
quote = rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.2" { inherit profileName; };
syn = rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.14" { inherit profileName; };
@ -2759,7 +2780,7 @@ in
dependencies = {
bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."0.5.4" { inherit profileName; };
fnv = rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.6" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
iovec = rustPackages."registry+https://github.com/rust-lang/crates.io-index".iovec."0.1.4" { inherit profileName; };
lazy_static = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; };
${ if hostPlatform.isUnix then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.66" { inherit profileName; };
@ -2794,8 +2815,8 @@ in
];
dependencies = {
bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."0.5.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.5" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
pin_project_lite = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.1.4" { inherit profileName; };
tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."0.2.11" { inherit profileName; };
@ -2813,8 +2834,8 @@ in
];
dependencies = {
bytes = rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."0.5.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.4" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.4" { inherit profileName; };
futures_core = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.5" { inherit profileName; };
futures_sink = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.5" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
pin_project_lite = rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.1.4" { inherit profileName; };
tokio = rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."0.2.11" { inherit profileName; };
@ -2849,7 +2870,7 @@ in
async_trait = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.24" { profileName = "__noProfile"; };
enum_as_inner = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".enum-as-inner."0.3.0" { profileName = "__noProfile"; };
failure = rustPackages."registry+https://github.com/rust-lang/crates.io-index".failure."0.1.6" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.4" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.5" { inherit profileName; };
idna = rustPackages."registry+https://github.com/rust-lang/crates.io-index".idna."0.2.0" { inherit profileName; };
lazy_static = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
@ -2874,7 +2895,7 @@ in
dependencies = {
cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."0.1.10" { inherit profileName; };
failure = rustPackages."registry+https://github.com/rust-lang/crates.io-index".failure."0.1.6" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.4" { inherit profileName; };
futures = rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.5" { inherit profileName; };
${ if hostPlatform.isWindows then "ipconfig" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".ipconfig."0.2.1" { inherit profileName; };
lazy_static = rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; };
log = rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.8" { inherit profileName; };
@ -3081,8 +3102,8 @@ in
];
dependencies = {
cfg_if = rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."0.1.10" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.105" { inherit profileName; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.50" { inherit profileName; };
serde = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.110" { inherit profileName; };
serde_json = rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.53" { inherit profileName; };
wasm_bindgen_macro = buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro."0.2.58" { profileName = "__noProfile"; };
};
});
@ -3264,8 +3285,8 @@ in
[ "ws2tcpip" ]
];
dependencies = {
${ if hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" then "winapi_i686_pc_windows_gnu" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-i686-pc-windows-gnu."0.4.0" { inherit profileName; };
${ if hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" then "winapi_x86_64_pc_windows_gnu" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-x86_64-pc-windows-gnu."0.4.0" { inherit profileName; };
${ if hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" || hostPlatform.config == "i686-pc-windows-gnu" then "winapi_i686_pc_windows_gnu" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-i686-pc-windows-gnu."0.4.0" { inherit profileName; };
${ if hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" || hostPlatform.config == "x86_64-pc-windows-gnu" then "winapi_x86_64_pc_windows_gnu" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-x86_64-pc-windows-gnu."0.4.0" { inherit profileName; };
};
});

View File

@ -1,28 +1,45 @@
[package]
name = "hoc"
version = "0.11.8"
version = "0.17.1"
authors = ["Valentin Brandl <vbrandl@riseup.net>"]
edition = "2018"
build = "build.rs"
[lib]
path = "src/lib.rs"
[[bin]]
path = "src/main.rs"
name = "hoc"
[dependencies]
actix-web = "2.0.0"
badge = "0.2.0"
bytes = "0.5.4"
futures = "0.3.1"
git2 = "0.13.1"
actix-rt = "1.1.1"
actix-web = "3.3.2"
badge = "0.3.0"
bytes = "1.0.1"
config = { version = "0.11.0", features = ["toml"] }
dotenv = "0.15.0"
futures = "0.3.14"
git2 = "0.13.17"
lazy_static = "1.4.0"
log = "0.4.8"
log4rs = "0.11.0"
number_prefix = "0.3.0"
number_prefix = "0.4.0"
openssl-probe = "0.1.2"
reqwest = "0.10.4"
serde = "1.0.105"
serde_derive = "1.0.103"
serde_json = "1.0.50"
structopt = "0.3.12"
actix-rt = "1.0.0"
reqwest = "0.10.10"
serde = "1.0.125"
serde_derive = "1.0.123"
serde_json = "1.0.64"
tracing = "0.1.25"
tracing-actix-web = "0.2.1"
tracing-bunyan-formatter = "0.2.0"
tracing-futures = "0.2.5"
tracing-log = "0.1.2"
tracing-subscriber = { version = "0.2.17", features = ["registry", "env-filter"] }
[build-dependencies]
ructe = "0.9.2"
vergen = "3.1.0"
ructe = "0.13.2"
vergen = { version = "5.1.1", default-features = false, features = ["git"] }
[dev-dependencies]
ructe = "0.13.2"
tempfile = "3.2.0"
tokio = "0.2.25"

View File

@ -1,9 +1,8 @@
# Hits-of-Code
[![Hits-of-Code](https://hitsofcode.com/github/vbrandl/hoc)](https://hitsofcode.com/view/github/vbrandl/hoc)
[![Hits-of-Code](https://hitsofcode.com/github/vbrandl/hoc)](https://hitsofcode.com/github/vbrandl/hoc/view)
[![Drone build](https://drone.vbrandl.net/api/badges/vbrandl/hoc/status.svg)](https://drone.vbrandl.net/vbrandl/hoc)
[![Gitlab build](https://gitlab.com/vbrandl/hoc/badges/master/pipeline.svg)](https://gitlab.com/vbrandl/hoc/pipelines)
[![Travis build](https://travis-ci.org/vbrandl/hoc.svg?branch=master)](https://travis-ci.org/vbrandl/hoc)
[![dependency status](https://deps.rs/repo/github/vbrandl/hoc/status.svg)](https://deps.rs/repo/github/vbrandl/hoc)
Small webservice, that returns a badge of the Hits-of-Code of a git repository, as described by [Yegor
@ -27,7 +26,11 @@ where `<service>` is one of `gitub`, `gitlab` or `bitbucket`. The HoC data can a
https://<host>/<service>/<user>/<repo>/json
```
There is also an overview page available via `https://<host>/view/<service>/<user>/<repo>`
There is also an overview page available via `https://<host>/<service>/<user>/<repo>/view`
To delete a repository and the cache from the server, send a `POST` request to
`https://<host>/<service>/<user>/<repo>/delete`. On the overview page, there is a button to perform this operation. It
will respond with a redirect to the overview page so the cache is rebuilt directly.
## Building
@ -45,21 +48,29 @@ $ docker build .
inside the repository.
I'm currently working on migrating to [nix](https://nixos.org/nix). To get a
development shell, run `nix-shell`, to build the package run `nix-build --attr
package` and to build the Docker image, run `nix-build --attr dockerImage`.
I'm currently working on migrating to [nix](https://nixos.org/nix). To get a development shell, run `nix-shell`, to
build the package run `nix-build --attr package` and to build the Docker image, run `nix-build --attr dockerImage`.
## Running
Run either the binary produced by cargo, the Docker container you just built (using docker-compose) or pull the image
from [Docker Hub](https://hub.docker.com/r/vbrandl/hits-of-code)
Rename [`hoc.toml.example`](./hoc.toml.example) to `hoc.toml` or [`.env.example`](./.env.example) to `.env` and set the
correct value for `base_url`/`HOC_BASE_URL`. If you don't want to use a configuration or dotenv file, you can pass all
parameters directly via environment variables. For variable names see [`.env.example`](./.env.example).
To start a local instance of the service just run:
```
$ docker run -it --rm vbrandl/hits-of-code --help
$ HOC_BASE_URL='http://0.0.0.0:8080' ./hoc
```
When running the binary directly, you need a git binary in your `PATH`.
You can also use the Docker image:
```
$ docker run -p 8080:8080 --env HOC_BASE_URL='http://0.0.0.0:8080' -it --rm vbrandl/hits-of-code
```
When running the binary directly, you need a `git` binary in your `PATH`.
## License

View File

@ -2,11 +2,12 @@ extern crate ructe;
extern crate vergen;
use ructe::Ructe;
use vergen::{generate_cargo_keys, ConstantsFlags};
use vergen::{vergen, Config, ShaKind};
fn main() {
let flags = ConstantsFlags::SHA_SHORT;
generate_cargo_keys(flags).expect("Unable to generate the cargo keys!");
let mut config = Config::default();
*config.git_mut().sha_kind_mut() = ShaKind::Short;
vergen(config).expect("Unable to generate static repo info");
Ructe::from_env()
.expect("ructe")
.compile_templates("templates")

View File

@ -1,4 +1,4 @@
version: "2"
version: "3"
services:
hoc:
@ -9,3 +9,5 @@ services:
# ports:
# - "127.0.0.1:8080:8080"
restart: always
env_file:
- ./.env

15
hoc.toml Normal file
View File

@ -0,0 +1,15 @@
# every parameter can also be set (or overwritten) by passing an environment
# variable namend `HOC_<PARAMETERNAME>`, e.g.
# `HOC_BASE_URL='https://hitsofcode.com' ./hoc`
# these config parameters have default values and must not explicitly be set
repodir = "./repos"
cachedir = "./cache"
port = 8080
host = "0.0.0.0"
workers = 4
# these parameters don't have default values and must be set
# this should be the public base URL of the service, e.g. `https://hitsofcode.com`
base_url = "http://0.0.0.0:8080"

15
hoc.toml.example Normal file
View File

@ -0,0 +1,15 @@
# every parameter can also be set (or overwritten) by passing an environment
# variable namend `HOC_<PARAMETERNAME>`, e.g.
# `HOC_BASE_URL='https://hitsofcode.com' ./hoc`
# these config parameters have default values and must not explicitly be set
repodir = "./repos"
cachedir = "./cache"
port = 8080
host = "0.0.0.0"
workers = 4
# these parameters don't have default values and must be set
# this should be the public base URL of the service, e.g. `https://hitsofcode.com`
base_url = "http://0.0.0.0:8080"

View File

@ -29,10 +29,10 @@
"homepage": "https://github.com/NixOS/nixpkgs",
"owner": "NixOS",
"repo": "nixpkgs-channels",
"rev": "053ad4e0db7241ae6a02394d62750fdc5d64aa9f",
"sha256": "11l9sr8zg8j1n5p43zjkqwpj59gn8c84z1kf16icnsbnv2smzqdc",
"rev": "f6bfb371cba2b5a02f200c2747c1fe2c72bd782f",
"sha256": "0y3hlbyvznrpr1d2vxj2511hkjg733wdnxfaib3fgy9i9jr8ivzn",
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs-channels/archive/053ad4e0db7241ae6a02394d62750fdc5d64aa9f.tar.gz",
"url": "https://github.com/NixOS/nixpkgs-channels/archive/f6bfb371cba2b5a02f200c2747c1fe2c72bd782f.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"nixpkgs-mozilla": {

View File

@ -1,57 +1,124 @@
use crate::error::{Error, Result};
use std::{
borrow::Cow,
collections::HashMap,
fs::{create_dir_all, File, OpenOptions},
io::BufReader,
path::Path,
};
/// Enum to indicate the state of the cache
#[derive(Debug)]
pub(crate) enum CacheState<'a> {
/// Current head and cached head are the same
Current { count: u64, commits: u64 },
Current {
count: u64,
commits: u64,
cache: Cache<'a>,
},
/// Cached head is older than current head
Old(Cache<'a>),
Old {
head: String,
cache: Cache<'a>,
},
NoneForBranch(Cache<'a>),
/// No cache was found
No,
}
impl<'a> CacheState<'a> {
pub(crate) fn read_from_file(path: impl AsRef<Path>, head: &str) -> Result<CacheState> {
#[instrument]
pub(crate) fn read_from_file(
path: impl AsRef<Path> + std::fmt::Debug,
branch: &str,
head: &str,
) -> Result<CacheState<'a>> {
trace!("Reading cache");
if path.as_ref().exists() {
let cache: Cache = serde_json::from_reader(BufReader::new(File::open(path)?))?;
if cache.head == head {
Ok(CacheState::Current {
count: cache.count,
commits: cache.commits,
Ok(cache
.entries
.get(branch)
.map(|c| {
if c.head == head {
trace!("Cache is up to date");
CacheState::Current {
count: c.count,
commits: c.commits,
// TODO: get rid of clone
cache: cache.clone(),
}
} else {
trace!("Cache is out of date");
CacheState::Old {
head: c.head.to_string(),
// TODO: get rid of clone
cache: cache.clone(),
}
}
})
} else {
Ok(CacheState::Old(cache))
}
// TODO: get rid of clone
.unwrap_or_else(|| CacheState::NoneForBranch(cache.clone())))
} else {
Ok(CacheState::No)
}
}
pub(crate) fn calculate_new_cache(self, count: u64, commits: u64, head: Cow<'a, str>) -> Cache {
#[instrument]
pub(crate) fn calculate_new_cache(
self,
count: u64,
commits: u64,
head: Cow<'a, str>,
branch: &'a str,
) -> Cache<'a> {
trace!("Calculating new cache");
match self {
CacheState::Old(mut cache) => {
cache.head = head;
cache.count += count;
cache.commits += commits;
CacheState::Old { mut cache, .. } => {
if let Some(mut cache) = cache.entries.get_mut(branch) {
cache.head = head;
cache.count += count;
cache.commits += commits;
}
cache
}
CacheState::No | CacheState::Current { .. } => Cache {
head,
count,
commits,
},
CacheState::Current { cache, .. } => cache,
CacheState::NoneForBranch(mut cache) => {
trace!("Creating new cache for branch");
cache.entries.insert(
branch.into(),
CacheEntry {
head,
count,
commits,
},
);
cache
}
CacheState::No => {
trace!("Creating new cache file");
let mut entries = HashMap::with_capacity(1);
entries.insert(
branch.into(),
CacheEntry {
commits,
head,
count,
},
);
Cache { entries }
}
}
}
}
#[derive(Serialize, Deserialize)]
#[derive(Serialize, Deserialize, Clone, Debug)]
pub(crate) struct Cache<'a> {
pub entries: HashMap<Cow<'a, str>, CacheEntry<'a>>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub(crate) struct CacheEntry<'a> {
/// HEAD commit ref
pub head: Cow<'a, str>,
/// HoC value
@ -61,7 +128,9 @@ pub(crate) struct Cache<'a> {
}
impl<'a> Cache<'a> {
pub(crate) fn write_to_file(&self, path: impl AsRef<Path>) -> Result<()> {
#[instrument]
pub(crate) fn write_to_file(&self, path: impl AsRef<Path> + std::fmt::Debug) -> Result<()> {
trace!("Persisting cache to disk");
create_dir_all(path.as_ref().parent().ok_or(Error::Internal)?)?;
serde_json::to_writer(
OpenOptions::new()

View File

@ -1,71 +1,38 @@
use crate::{error::Result, statics::OPT};
use log::LevelFilter;
use log4rs::{
append::{console::ConsoleAppender, file::FileAppender},
config::{Appender, Config, Root},
encode::pattern::PatternEncoder,
};
use config::{Config, ConfigError, Environment, File};
use std::path::PathBuf;
use structopt::StructOpt;
#[derive(StructOpt, Debug)]
pub(crate) struct Opt {
#[structopt(
short = "o",
long = "outdir",
parse(from_os_str),
default_value = "./repos"
)]
#[derive(Debug, Deserialize)]
pub struct Settings {
/// Path to store cloned repositories
pub(crate) outdir: PathBuf,
#[structopt(
short = "c",
long = "cachedir",
parse(from_os_str),
default_value = "./cache"
)]
pub repodir: PathBuf,
/// Path to store cache
pub(crate) cachedir: PathBuf,
#[structopt(short = "p", long = "port", default_value = "8080")]
pub cachedir: PathBuf,
/// Port to listen on
pub(crate) port: u16,
#[structopt(short = "h", long = "host", default_value = "0.0.0.0")]
pub port: u16,
/// Interface to listen on
pub(crate) host: String,
#[structopt(short = "d", long = "domain", default_value = "hitsofcode.com")]
/// Interface to listen on
pub(crate) domain: String,
#[structopt(short = "w", long = "workers", default_value = "4")]
pub host: String,
/// Base URL
pub base_url: String,
/// Number of worker threads
pub(crate) workers: usize,
#[structopt(
short = "l",
long = "logfile",
parse(from_os_str),
default_value = "./hoc.log"
)]
/// The logfile
pub(crate) logfile: PathBuf,
pub workers: usize,
}
pub(crate) async fn init() -> Result<()> {
std::env::set_var("RUST_LOG", "actix_web=info,hoc=info");
// pretty_env_logger::init();
openssl_probe::init_ssl_cert_env_vars();
let stdout = ConsoleAppender::builder().build();
let file = FileAppender::builder()
.encoder(Box::new(PatternEncoder::new("{d} - {m}{n}")))
.build(&OPT.logfile)
.unwrap();
let config = Config::builder()
.appender(Appender::builder().build("stdout", Box::new(stdout)))
.appender(Appender::builder().build("file", Box::new(file)))
.build(
Root::builder()
.appender("stdout")
.appender("file")
.build(LevelFilter::Info),
)?;
log4rs::init_config(config)?;
Ok(())
impl Settings {
#[deprecated]
pub fn new() -> Result<Self, ConfigError> {
Self::load()
}
pub fn load() -> Result<Self, ConfigError> {
let mut config = Config::new();
config
.merge(File::with_name("hoc.toml").required(false))?
.merge(Environment::with_prefix("hoc"))?
.set_default("repodir", "./repos")?
.set_default("cachedir", "./cache")?
.set_default("workers", 4)?
.set_default("port", 8080)?
.set_default("host", "0.0.0.0")?;
config.try_into()
}
}

View File

@ -1,10 +1,13 @@
use crate::error::Result;
use std::{fs::read_dir, path::Path, result::Result as StdResult};
#[instrument]
pub(crate) fn count_repositories<P>(repo_path: P) -> Result<usize>
where
P: AsRef<Path>,
P: AsRef<Path> + std::fmt::Debug,
{
trace!("Counting repositories");
std::fs::create_dir_all(&repo_path)?;
Ok(read_dir(repo_path)?
.filter_map(StdResult::ok)
.filter(|entry| entry.file_type().map(|ft| ft.is_dir()).unwrap_or(false))

View File

@ -1,9 +1,6 @@
use crate::{
statics::{REPO_COUNT, VERSION_INFO},
templates,
};
use actix_web::{HttpResponse, ResponseError};
use std::{fmt, sync::atomic::Ordering};
use crate::{statics::VERSION_INFO, templates};
use actix_web::{http::StatusCode, HttpResponse, ResponseError};
use std::fmt;
pub(crate) type Result<T> = std::result::Result<T, Error>;
@ -14,11 +11,9 @@ pub(crate) enum Error {
Git(git2::Error),
Internal,
Io(std::io::Error),
Log(log::SetLoggerError),
LogBuilder(log4rs::config::Errors),
Parse(std::num::ParseIntError),
Serial(serde_json::Error),
GitNoMaster,
BranchNotFound,
}
impl fmt::Display for Error {
@ -29,31 +24,30 @@ impl fmt::Display for Error {
Error::Git(e) => write!(fmt, "Git({})", e),
Error::Internal => write!(fmt, "Internal Error"),
Error::Io(e) => write!(fmt, "Io({})", e),
Error::Log(e) => write!(fmt, "Log({})", e),
Error::LogBuilder(e) => write!(fmt, "LogBuilder({})", e),
Error::Parse(e) => write!(fmt, "Parse({})", e),
Error::Serial(e) => write!(fmt, "Serial({})", e),
Error::GitNoMaster => write!(fmt, "Repo doesn't have master branch"),
Error::BranchNotFound => write!(fmt, "Repo doesn't have master branch"),
}
}
}
impl ResponseError for Error {
fn status_code(&self) -> StatusCode {
match self {
Error::BranchNotFound => StatusCode::NOT_FOUND,
_ => StatusCode::INTERNAL_SERVER_ERROR,
}
}
fn error_response(&self) -> HttpResponse {
let mut buf = Vec::new();
match self {
Error::GitNoMaster => {
templates::p404_no_master(
&mut buf,
VERSION_INFO,
REPO_COUNT.load(Ordering::Relaxed),
)
.unwrap();
Error::BranchNotFound => {
templates::p404_no_master(&mut buf, VERSION_INFO, 0).unwrap();
HttpResponse::NotFound().content_type("text/html").body(buf)
}
_ => {
templates::p500(&mut buf, VERSION_INFO, REPO_COUNT.load(Ordering::Relaxed))
.unwrap();
templates::p500(&mut buf, VERSION_INFO, 0).unwrap();
HttpResponse::InternalServerError()
.content_type("text/html")
.body(buf)
@ -76,12 +70,6 @@ impl From<git2::Error> for Error {
}
}
impl From<log::SetLoggerError> for Error {
fn from(err: log::SetLoggerError) -> Self {
Error::Log(err)
}
}
impl From<std::io::Error> for Error {
fn from(err: std::io::Error) -> Self {
Error::Io(err)
@ -100,12 +88,6 @@ impl From<reqwest::Error> for Error {
}
}
impl From<log4rs::config::Errors> for Error {
fn from(err: log4rs::config::Errors) -> Self {
Error::LogBuilder(err)
}
}
impl From<std::num::ParseIntError> for Error {
fn from(err: std::num::ParseIntError) -> Self {
Error::Parse(err)

525
src/lib.rs Normal file
View File

@ -0,0 +1,525 @@
#![type_length_limit = "2257138"]
#[macro_use]
extern crate actix_web;
#[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate tracing;
mod cache;
pub mod config;
mod count;
mod error;
mod service;
mod statics;
pub mod telemetry;
mod template;
use crate::{
cache::CacheState,
config::Settings,
error::{Error, Result},
service::{Bitbucket, FormService, GitHub, Gitlab, Service},
statics::{CLIENT, CSS, FAVICON, VERSION_INFO},
template::RepoInfo,
};
use actix_web::{
dev::Server,
http::header::{CacheControl, CacheDirective, Expires, LOCATION},
middleware::{self, normalize::TrailingSlash},
web, App, HttpResponse, HttpServer, Responder,
};
use badge::{Badge, BadgeOptions};
use git2::{BranchType, Repository};
use number_prefix::NumberPrefix;
use std::{
borrow::Cow,
fs::create_dir_all,
io,
net::TcpListener,
path::Path,
process::Command,
sync::atomic::AtomicUsize,
sync::atomic::Ordering,
time::{Duration, SystemTime},
};
use tracing::Instrument;
include!(concat!(env!("OUT_DIR"), "/templates.rs"));
#[derive(Deserialize, Serialize)]
struct GeneratorForm<'a> {
service: FormService,
user: Cow<'a, str>,
repo: Cow<'a, str>,
}
#[derive(Debug)]
pub(crate) struct State {
settings: Settings,
}
impl State {
fn repos(&self) -> String {
self.settings.repodir.display().to_string()
}
fn cache(&self) -> String {
self.settings.cachedir.display().to_string()
}
}
#[derive(Serialize)]
struct JsonResponse<'a> {
head: &'a str,
branch: &'a str,
count: u64,
commits: u64,
}
#[derive(Deserialize, Debug)]
struct BranchQuery {
branch: Option<String>,
}
fn pull(path: impl AsRef<Path>) -> Result<()> {
let repo = Repository::open_bare(path)?;
let mut origin = repo.find_remote("origin")?;
origin.fetch(&["refs/heads/*:refs/heads/*"], None, None)?;
Ok(())
}
fn hoc(repo: &str, repo_dir: &str, cache_dir: &str, branch: &str) -> Result<(u64, String, u64)> {
let repo_dir = format!("{}/{}", repo_dir, repo);
let cache_dir = format!("{}/{}.json", cache_dir, repo);
let cache_dir = Path::new(&cache_dir);
let repo = Repository::open_bare(&repo_dir)?;
// TODO: do better...
let head = repo
.find_branch(branch, BranchType::Local)
.map_err(|_| Error::BranchNotFound)?
.into_reference();
let head = format!("{}", head.target().ok_or(Error::BranchNotFound)?);
let mut arg_commit_count = vec!["rev-list".to_string(), "--count".to_string()];
let mut arg = vec![
"log".to_string(),
"--pretty=tformat:".to_string(),
"--numstat".to_string(),
"--ignore-space-change".to_string(),
"--ignore-all-space".to_string(),
"--ignore-submodules".to_string(),
"--no-color".to_string(),
"--find-copies-harder".to_string(),
"-M".to_string(),
"--diff-filter=ACDM".to_string(),
];
let cache = CacheState::read_from_file(&cache_dir, branch, &head)?;
match &cache {
CacheState::Current { count, commits, .. } => {
info!("Using cache");
return Ok((*count, head, *commits));
}
CacheState::Old { head, .. } => {
info!("Updating cache");
arg.push(format!("{}..{}", head, branch));
arg_commit_count.push(format!("{}..{}", head, branch));
}
CacheState::No | CacheState::NoneForBranch(..) => {
info!("Creating cache");
arg.push(branch.to_string());
arg_commit_count.push(branch.to_string());
}
};
arg.push("--".to_string());
arg.push(".".to_string());
let output = Command::new("git")
.args(&arg)
.current_dir(&repo_dir)
.output()?
.stdout;
let output = String::from_utf8_lossy(&output);
let output_commits = Command::new("git")
.args(&arg_commit_count)
.current_dir(&repo_dir)
.output()?
.stdout;
let output_commits = String::from_utf8_lossy(&output_commits);
let commits: u64 = output_commits.trim().parse()?;
let count: u64 = output
.lines()
.map(|s| {
s.split_whitespace()
.take(2)
.map(str::parse::<u64>)
.filter_map(std::result::Result::ok)
.sum::<u64>()
})
.sum();
let cache = cache.calculate_new_cache(count, commits, (&head).into(), branch);
cache.write_to_file(cache_dir)?;
Ok((count, head, commits))
}
async fn remote_exists(url: &str) -> Result<bool> {
let resp = CLIENT.head(url).send().await?;
Ok(resp.status() == reqwest::StatusCode::OK)
}
enum HocResult {
Hoc {
hoc: u64,
commits: u64,
hoc_pretty: String,
head: String,
url: String,
repo: String,
service_path: String,
},
NotFound,
}
async fn delete_repo_and_cache<T>(
state: web::Data<State>,
repo_count: web::Data<AtomicUsize>,
data: web::Path<(String, String)>,
) -> Result<impl Responder>
where
T: Service,
{
let data = data.into_inner();
let span = info_span!(
"deleting repository and cache",
service = T::domain(),
user = data.0.as_str(),
repo = data.1.as_str()
);
let future = async {
let repo = format!(
"{}/{}/{}",
T::domain(),
data.0.to_lowercase(),
data.1.to_lowercase()
);
info!("Deleting cache and repository");
let cache_dir = format!("{}/{}.json", &state.cache(), repo);
let repo_dir = format!("{}/{}", &state.repos(), repo);
std::fs::remove_file(&cache_dir).or_else(|e| {
if e.kind() == io::ErrorKind::NotFound {
Ok(())
} else {
Err(e)
}
})?;
std::fs::remove_dir_all(&repo_dir).or_else(|e| {
if e.kind() == io::ErrorKind::NotFound {
Ok(())
} else {
Err(e)
}
})?;
repo_count.fetch_sub(1, Ordering::Relaxed);
Ok(HttpResponse::TemporaryRedirect()
.header(
LOCATION,
format!("/{}/{}/{}/view", T::url_path(), data.0, data.1),
)
.finish())
};
future.instrument(span).await
}
async fn handle_hoc_request<T, F>(
state: web::Data<State>,
repo_count: web::Data<AtomicUsize>,
data: web::Path<(String, String)>,
branch: &str,
mapper: F,
) -> Result<HttpResponse>
where
T: Service,
F: FnOnce(HocResult) -> Result<HttpResponse>,
{
let data = data.into_inner();
let span = info_span!(
"handling hoc calculation",
service = T::domain(),
user = data.0.as_str(),
repo = data.1.as_str(),
branch
);
let future = async {
let repo = format!("{}/{}", data.0.to_lowercase(), data.1.to_lowercase());
let service_path = format!("{}/{}", T::url_path(), repo);
let service_url = format!("{}/{}", T::domain(), repo);
let path = format!("{}/{}", state.repos(), service_url);
let url = format!("https://{}", service_url);
let remote_exists = remote_exists(&url).await?;
let file = Path::new(&path);
if !file.exists() {
if !remote_exists {
warn!("Repository does not exist");
return mapper(HocResult::NotFound);
}
info!("Cloning for the first time");
create_dir_all(file)?;
let repo = Repository::init_bare(file)?;
repo.remote_add_fetch("origin", "refs/heads/*:refs/heads/*")?;
repo.remote_set_url("origin", &url)?;
repo_count.fetch_add(1, Ordering::Relaxed);
}
pull(&path)?;
let (hoc, head, commits) = hoc(&service_url, &state.repos(), &state.cache(), branch)?;
let hoc_pretty = match NumberPrefix::decimal(hoc as f64) {
NumberPrefix::Standalone(hoc) => hoc.to_string(),
NumberPrefix::Prefixed(prefix, hoc) => format!("{:.1}{}", hoc, prefix),
};
let res = HocResult::Hoc {
hoc,
commits,
hoc_pretty,
head,
url,
repo,
service_path,
};
mapper(res)
};
future.instrument(span).await
}
pub(crate) async fn json_hoc<T: Service>(
state: web::Data<State>,
repo_count: web::Data<AtomicUsize>,
data: web::Path<(String, String)>,
branch: web::Query<BranchQuery>,
) -> Result<HttpResponse> {
let branch = branch.branch.as_deref().unwrap_or("master");
let rc_clone = repo_count.clone();
let mapper = move |r| match r {
HocResult::NotFound => p404(rc_clone),
HocResult::Hoc {
hoc, head, commits, ..
} => Ok(HttpResponse::Ok().json(JsonResponse {
branch,
head: &head,
count: hoc,
commits,
})),
};
handle_hoc_request::<T, _>(state, repo_count, data, branch, mapper).await
}
fn no_cache_response(body: Vec<u8>) -> HttpResponse {
let expiration = SystemTime::now() + Duration::from_secs(30);
HttpResponse::Ok()
.content_type("image/svg+xml")
.set(Expires(expiration.into()))
.set(CacheControl(vec![
CacheDirective::MaxAge(0u32),
CacheDirective::MustRevalidate,
CacheDirective::NoCache,
CacheDirective::NoStore,
]))
.body(body)
}
pub(crate) async fn calculate_hoc<T: Service>(
state: web::Data<State>,
repo_count: web::Data<AtomicUsize>,
data: web::Path<(String, String)>,
branch: web::Query<BranchQuery>,
) -> HttpResponse {
let rc_clone = repo_count.clone();
let mapper = move |r| match r {
HocResult::NotFound => p404(rc_clone),
HocResult::Hoc { hoc_pretty, .. } => {
let badge_opt = BadgeOptions {
subject: "Hits-of-Code".to_string(),
color: "#007ec6".to_string(),
status: hoc_pretty,
};
let badge = Badge::new(badge_opt)?;
// TODO: remove clone
let body = badge.to_svg().as_bytes().to_vec();
Ok(no_cache_response(body))
}
};
let branch = branch.branch.as_deref().unwrap_or("master");
let error_badge = |_| {
let error_badge = Badge::new(BadgeOptions {
subject: "Hits-of-Code".to_string(),
color: "#ff0000".to_string(),
status: "error".to_string(),
})
.unwrap();
let body = error_badge.to_svg().as_bytes().to_vec();
no_cache_response(body)
};
handle_hoc_request::<T, _>(state, repo_count, data, branch, mapper)
.await
.unwrap_or_else(error_badge)
}
async fn overview<T: Service>(
state: web::Data<State>,
repo_count: web::Data<AtomicUsize>,
data: web::Path<(String, String)>,
branch: web::Query<BranchQuery>,
) -> Result<HttpResponse> {
let branch = branch.branch.as_deref().unwrap_or("master");
let base_url = state.settings.base_url.clone();
let rc_clone = repo_count.clone();
let mapper = move |r| match r {
HocResult::NotFound => p404(rc_clone),
HocResult::Hoc {
hoc,
commits,
hoc_pretty,
url,
head,
repo,
service_path,
} => {
let mut buf = Vec::new();
let repo_info = RepoInfo {
commit_url: &T::commit_url(&repo, &head),
commits,
base_url: &base_url,
head: &head,
hoc,
hoc_pretty: &hoc_pretty,
path: &service_path,
url: &url,
branch,
};
templates::overview(
&mut buf,
VERSION_INFO,
rc_clone.load(Ordering::Relaxed),
repo_info,
)?;
Ok(HttpResponse::Ok().content_type("text/html").body(buf))
}
};
handle_hoc_request::<T, _>(state, repo_count, data, branch, mapper).await
}
#[get("/health_check")]
async fn health_check() -> HttpResponse {
HttpResponse::Ok().finish()
}
#[get("/")]
async fn index(
state: web::Data<State>,
repo_count: web::Data<AtomicUsize>,
) -> Result<HttpResponse> {
let mut buf = Vec::new();
templates::index(
&mut buf,
VERSION_INFO,
repo_count.load(Ordering::Relaxed),
&state.settings.base_url,
)?;
Ok(HttpResponse::Ok().content_type("text/html").body(buf))
}
#[post("/generate")]
async fn generate(
params: web::Form<GeneratorForm<'_>>,
state: web::Data<State>,
repo_count: web::Data<AtomicUsize>,
) -> Result<HttpResponse> {
let repo = format!("{}/{}", params.user, params.repo);
let mut buf = Vec::new();
templates::generate(
&mut buf,
VERSION_INFO,
repo_count.load(Ordering::Relaxed),
&state.settings.base_url,
params.service.url(),
params.service.service(),
&repo,
)?;
Ok(HttpResponse::Ok().content_type("text/html").body(buf))
}
fn p404(repo_count: web::Data<AtomicUsize>) -> Result<HttpResponse> {
let mut buf = Vec::new();
templates::p404(&mut buf, VERSION_INFO, repo_count.load(Ordering::Relaxed))?;
Ok(HttpResponse::NotFound().content_type("text/html").body(buf))
}
async fn async_p404(repo_count: web::Data<AtomicUsize>) -> Result<HttpResponse> {
p404(repo_count)
}
fn css() -> HttpResponse {
HttpResponse::Ok().content_type("text/css").body(CSS)
}
fn favicon32() -> HttpResponse {
HttpResponse::Ok().content_type("image/png").body(FAVICON)
}
async fn start_server(listener: TcpListener, settings: Settings) -> std::io::Result<Server> {
let workers = settings.workers;
let repo_count =
// TODO: errorhandling
web::Data::new(AtomicUsize::new(count::count_repositories(&settings.repodir).unwrap()));
let state = web::Data::new(State { settings });
Ok(HttpServer::new(move || {
App::new()
.app_data(state.clone())
.app_data(repo_count.clone())
.wrap(tracing_actix_web::TracingLogger)
.wrap(middleware::NormalizePath::new(TrailingSlash::Trim))
.service(index)
.service(health_check)
.service(web::resource("/tacit-css.min.css").route(web::get().to(css)))
.service(web::resource("/favicon.ico").route(web::get().to(favicon32)))
.service(generate)
.service(web::resource("/github/{user}/{repo}").to(calculate_hoc::<GitHub>))
.service(web::resource("/gitlab/{user}/{repo}").to(calculate_hoc::<Gitlab>))
.service(web::resource("/bitbucket/{user}/{repo}").to(calculate_hoc::<Bitbucket>))
.service(
web::resource("/github/{user}/{repo}/delete")
.route(web::post().to(delete_repo_and_cache::<GitHub>)),
)
.service(
web::resource("/gitlab/{user}/{repo}/delete")
.route(web::post().to(delete_repo_and_cache::<Gitlab>)),
)
.service(
web::resource("/bitbucket/{user}/{repo}/delete")
.route(web::post().to(delete_repo_and_cache::<Bitbucket>)),
)
.service(web::resource("/github/{user}/{repo}/json").to(json_hoc::<GitHub>))
.service(web::resource("/gitlab/{user}/{repo}/json").to(json_hoc::<Gitlab>))
.service(web::resource("/bitbucket/{user}/{repo}/json").to(json_hoc::<Bitbucket>))
.service(web::resource("/view/github/{user}/{repo}").to(overview::<GitHub>))
.service(web::resource("/view/gitlab/{user}/{repo}").to(overview::<Gitlab>))
.service(web::resource("/view/bitbucket/{user}/{repo}").to(overview::<Bitbucket>))
.service(web::resource("/github/{user}/{repo}/view").to(overview::<GitHub>))
.service(web::resource("/gitlab/{user}/{repo}/view").to(overview::<Gitlab>))
.service(web::resource("/bitbucket/{user}/{repo}/view").to(overview::<Bitbucket>))
.default_service(web::resource("").route(web::get().to(async_p404)))
})
.workers(workers)
.listen(listener)?
.run())
}
pub async fn run(listener: TcpListener, settings: Settings) -> std::io::Result<Server> {
let span = info_span!("hoc", version = env!("CARGO_PKG_VERSION"));
let _ = span.enter();
start_server(listener, settings).instrument(span).await
}

View File

@ -1,384 +1,26 @@
#![type_length_limit = "2257138"]
use hoc::{config::Settings, telemetry};
#[macro_use]
extern crate actix_web;
#[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate log;
#[macro_use]
extern crate serde_derive;
use std::net::TcpListener;
mod cache;
mod config;
mod count;
mod error;
mod service;
mod statics;
mod template;
fn init() {
dotenv::dotenv().ok();
openssl_probe::init_ssl_cert_env_vars();
use crate::{
cache::CacheState,
error::{Error, Result},
service::{Bitbucket, FormService, GitHub, Gitlab, Service},
statics::{CLIENT, CSS, FAVICON, OPT, REPO_COUNT, VERSION_INFO},
template::RepoInfo,
};
use actix_web::{
http::header::{CacheControl, CacheDirective, Expires},
middleware, web, App, HttpResponse, HttpServer,
};
use badge::{Badge, BadgeOptions};
use futures::future::Future;
use git2::Repository;
use number_prefix::{NumberPrefix, Prefixed, Standalone};
use std::{
borrow::Cow,
fs::create_dir_all,
path::Path,
process::Command,
sync::atomic::Ordering,
sync::Arc,
time::{Duration, SystemTime},
};
include!(concat!(env!("OUT_DIR"), "/templates.rs"));
#[derive(Deserialize, Serialize)]
struct GeneratorForm<'a> {
service: FormService,
user: Cow<'a, str>,
repo: Cow<'a, str>,
}
struct State {
repos: String,
cache: String,
}
#[derive(Serialize)]
struct JsonResponse<'a> {
head: &'a str,
count: u64,
commits: u64,
}
fn pull(path: impl AsRef<Path>) -> Result<()> {
let repo = Repository::open_bare(path)?;
let mut origin = repo.find_remote("origin")?;
origin.fetch(&["refs/heads/*:refs/heads/*"], None, None)?;
Ok(())
}
fn hoc(repo: &str, repo_dir: &str, cache_dir: &str) -> Result<(u64, String, u64)> {
let repo_dir = format!("{}/{}", repo_dir, repo);
let cache_dir = format!("{}/{}.json", cache_dir, repo);
let cache_dir = Path::new(&cache_dir);
let repo = Repository::open_bare(&repo_dir)?;
// TODO: do better...
let head = match repo.head() {
Ok(v) => v,
Err(_) => return Err(Error::GitNoMaster),
};
let head = format!("{}", head.target().ok_or(Error::Internal)?);
let mut arg_commit_count = vec!["rev-list".to_string(), "--count".to_string()];
let mut arg = vec![
"log".to_string(),
"--pretty=tformat:".to_string(),
"--numstat".to_string(),
"--ignore-space-change".to_string(),
"--ignore-all-space".to_string(),
"--ignore-submodules".to_string(),
"--no-color".to_string(),
"--find-copies-harder".to_string(),
"-M".to_string(),
"--diff-filter=ACDM".to_string(),
];
let cache = CacheState::read_from_file(&cache_dir, &head)?;
match &cache {
CacheState::Current { count, commits } => {
info!("Using cache for {}", repo_dir);
return Ok((*count, head, *commits));
}
CacheState::Old(cache) => {
info!("Updating cache for {}", repo_dir);
arg.push(format!("{}..HEAD", cache.head));
arg_commit_count.push(format!("{}..HEAD", cache.head));
}
CacheState::No => {
info!("Creating cache for {}", repo_dir);
arg_commit_count.push("HEAD".to_string());
}
};
arg.push("--".to_string());
arg.push(".".to_string());
let output = Command::new("git")
.args(&arg)
.current_dir(&repo_dir)
.output()?
.stdout;
let output = String::from_utf8_lossy(&output);
let output_commits = Command::new("git")
.args(&arg_commit_count)
.current_dir(&repo_dir)
.output()?
.stdout;
let output_commits = String::from_utf8_lossy(&output_commits);
let commits: u64 = output_commits.trim().parse()?;
let count: u64 = output
.lines()
.map(|s| {
s.split_whitespace()
.take(2)
.map(str::parse::<u64>)
.filter_map(std::result::Result::ok)
.sum::<u64>()
})
.sum();
let cache = cache.calculate_new_cache(count, commits, (&head).into());
cache.write_to_file(cache_dir)?;
Ok((cache.count, head, commits))
}
async fn remote_exists(url: &str) -> Result<bool> {
let resp = CLIENT.head(url).send().await?;
Ok(resp.status() == reqwest::StatusCode::OK)
// .map(|resp| resp.status() == reqwest::StatusCode::OK)
// .from_err()
}
enum HocResult {
Hoc {
hoc: u64,
commits: u64,
hoc_pretty: String,
head: String,
url: String,
repo: String,
service_path: String,
},
NotFound,
}
async fn handle_hoc_request<T, F>(
state: web::Data<Arc<State>>,
data: web::Path<(String, String)>,
mapper: F,
) -> Result<HttpResponse>
where
T: Service,
F: Fn(HocResult) -> Result<HttpResponse>,
{
let repo = format!("{}/{}", data.0.to_lowercase(), data.1.to_lowercase());
let service_path = format!("{}/{}", T::domain(), repo);
let path = format!("{}/{}", state.repos, service_path);
let url = format!("https://{}", service_path);
let remote_exists = remote_exists(&url).await?;
let file = Path::new(&path);
if !file.exists() {
if !remote_exists {
warn!("Repository does not exist: {}", url);
return mapper(HocResult::NotFound);
}
info!("Cloning {} for the first time", url);
create_dir_all(file)?;
let repo = Repository::init_bare(file)?;
repo.remote_add_fetch("origin", "refs/heads/*:refs/heads/*")?;
repo.remote_set_url("origin", &url)?;
REPO_COUNT.fetch_add(1, Ordering::Relaxed);
}
pull(&path)?;
let (hoc, head, commits) = hoc(&service_path, &state.repos, &state.cache)?;
let hoc_pretty = match NumberPrefix::decimal(hoc as f64) {
Standalone(hoc) => hoc.to_string(),
Prefixed(prefix, hoc) => format!("{:.1}{}", hoc, prefix),
};
let res = HocResult::Hoc {
hoc,
commits,
hoc_pretty,
head,
url,
repo,
service_path,
};
mapper(res)
}
fn json_hoc<T: Service>(
state: web::Data<Arc<State>>,
data: web::Path<(String, String)>,
) -> impl Future<Output = Result<HttpResponse>> {
let mapper = |r| match r {
HocResult::NotFound => p404(),
HocResult::Hoc {
hoc, head, commits, ..
} => Ok(HttpResponse::Ok().json(JsonResponse {
head: &head,
count: hoc,
commits,
})),
};
handle_hoc_request::<T, _>(state, data, mapper)
}
fn calculate_hoc<T: Service>(
state: web::Data<Arc<State>>,
data: web::Path<(String, String)>,
) -> impl Future<Output = Result<HttpResponse>> {
let mapper = move |r| match r {
HocResult::NotFound => p404(),
HocResult::Hoc { hoc_pretty, .. } => {
let badge_opt = BadgeOptions {
subject: "Hits-of-Code".to_string(),
color: "#007ec6".to_string(),
status: hoc_pretty,
};
let badge = Badge::new(badge_opt)?;
// TODO: remove clone
let body = badge.to_svg().as_bytes().to_vec();
let expiration = SystemTime::now() + Duration::from_secs(30);
Ok(HttpResponse::Ok()
.content_type("image/svg+xml")
.set(Expires(expiration.into()))
.set(CacheControl(vec![
CacheDirective::MaxAge(0u32),
CacheDirective::MustRevalidate,
CacheDirective::NoCache,
CacheDirective::NoStore,
]))
.body(body))
}
};
handle_hoc_request::<T, _>(state, data, mapper)
}
fn overview<T: Service>(
state: web::Data<Arc<State>>,
data: web::Path<(String, String)>,
) -> impl Future<Output = Result<HttpResponse>> {
let mapper = |r| match r {
HocResult::NotFound => p404(),
HocResult::Hoc {
hoc,
commits,
hoc_pretty,
url,
head,
repo,
service_path,
} => {
let mut buf = Vec::new();
let repo_info = RepoInfo {
commit_url: &T::commit_url(&repo, &head),
commits,
domain: &OPT.domain,
head: &head,
hoc,
hoc_pretty: &hoc_pretty,
path: &service_path,
url: &url,
};
templates::overview(
&mut buf,
VERSION_INFO,
REPO_COUNT.load(Ordering::Relaxed),
repo_info,
)?;
Ok(HttpResponse::Ok().content_type("text/html").body(buf))
}
};
handle_hoc_request::<T, _>(state, data, mapper)
}
#[get("/")]
async fn index() -> Result<HttpResponse> {
let mut buf = Vec::new();
templates::index(
&mut buf,
VERSION_INFO,
REPO_COUNT.load(Ordering::Relaxed),
&OPT.domain,
)?;
Ok(HttpResponse::Ok().content_type("text/html").body(buf))
}
#[post("/generate")]
async fn generate(params: web::Form<GeneratorForm<'_>>) -> Result<HttpResponse> {
let repo = format!("{}/{}", params.user, params.repo);
let mut buf = Vec::new();
templates::generate(
&mut buf,
VERSION_INFO,
REPO_COUNT.load(Ordering::Relaxed),
&OPT.domain,
params.service.url(),
params.service.service(),
&repo,
)?;
Ok(HttpResponse::Ok().content_type("text/html").body(buf))
}
fn p404() -> Result<HttpResponse> {
let mut buf = Vec::new();
templates::p404(&mut buf, VERSION_INFO, REPO_COUNT.load(Ordering::Relaxed))?;
Ok(HttpResponse::NotFound().content_type("text/html").body(buf))
}
async fn async_p404() -> Result<HttpResponse> {
p404()
}
#[get("/tacit-css.min.css")]
fn css() -> HttpResponse {
HttpResponse::Ok().content_type("text/css").body(CSS)
}
#[get("/favicon.ico")]
fn favicon32() -> HttpResponse {
HttpResponse::Ok().content_type("image/png").body(FAVICON)
}
async fn start_server() -> std::io::Result<()> {
let interface = format!("{}:{}", OPT.host, OPT.port);
let state = Arc::new(State {
repos: OPT.outdir.display().to_string(),
cache: OPT.cachedir.display().to_string(),
});
HttpServer::new(move || {
App::new()
.data(state.clone())
.wrap(middleware::Logger::default())
.wrap(middleware::NormalizePath)
.service(index)
.service(css)
.service(favicon32)
.service(generate)
.service(web::resource("/github/{user}/{repo}").to(calculate_hoc::<GitHub>))
.service(web::resource("/gitlab/{user}/{repo}").to(calculate_hoc::<Gitlab>))
.service(web::resource("/bitbucket/{user}/{repo}").to(calculate_hoc::<Bitbucket>))
.service(web::resource("/github/{user}/{repo}/json").to(json_hoc::<GitHub>))
.service(web::resource("/gitlab/{user}/{repo}/json").to(json_hoc::<Gitlab>))
.service(web::resource("/bitbucket/{user}/{repo}/json").to(json_hoc::<Bitbucket>))
.service(web::resource("/view/github/{user}/{repo}").to(overview::<GitHub>))
.service(web::resource("/view/gitlab/{user}/{repo}").to(overview::<Gitlab>))
.service(web::resource("/view/bitbucket/{user}/{repo}").to(overview::<Bitbucket>))
.default_service(web::resource("").route(web::get().to(async_p404)))
})
.workers(OPT.workers)
.bind(interface)?
.run()
.await
telemetry::init_subscriber(telemetry::get_subscriber("hoc", "info"))
}
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
config::init().await.unwrap();
start_server().await
init();
// TODO: error handling
let settings = Settings::load().expect("Cannot load config");
let address = format!("{}:{}", settings.host, settings.port);
// TODO: error handling
let listener = TcpListener::bind(address)?;
hoc::run(listener, settings)
.await
.expect("Server error")
.await
}

View File

@ -1,14 +1,10 @@
use crate::{config::Opt, count::count_repositories};
use std::sync::atomic::AtomicUsize;
use structopt::StructOpt;
pub struct VersionInfo<'a> {
pub commit: &'a str,
pub version: &'a str,
}
pub(crate) const VERSION_INFO: VersionInfo = VersionInfo {
commit: env!("VERGEN_SHA_SHORT"),
commit: env!("VERGEN_GIT_SHA_SHORT"),
version: env!("CARGO_PKG_VERSION"),
};
pub(crate) const CSS: &str = include_str!("../static/tacit-css.min.css");
@ -16,7 +12,4 @@ pub(crate) const FAVICON: &[u8] = include_bytes!("../static/favicon32.png");
lazy_static! {
pub(crate) static ref CLIENT: reqwest::Client = reqwest::Client::new();
pub(crate) static ref OPT: Opt = Opt::from_args();
pub(crate) static ref REPO_COUNT: AtomicUsize =
AtomicUsize::new(count_repositories(&OPT.outdir).unwrap());
}

21
src/telemetry.rs Normal file
View File

@ -0,0 +1,21 @@
use tracing::{subscriber::set_global_default, Subscriber};
use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
use tracing_log::LogTracer;
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};
pub fn get_subscriber(name: &str, env_filter: &str) -> impl Subscriber + Send + Sync {
let env_filter =
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(env_filter));
let formatting_layer = BunyanFormattingLayer::new(name.to_string(), std::io::stdout);
Registry::default()
.with(env_filter)
.with(JsonStorageLayer)
.with(formatting_layer)
}
pub fn init_subscriber(subscriber: impl Subscriber + Send + Sync) {
LogTracer::init().expect("Failed to set logger");
set_global_default(subscriber).expect("Failed to set tracing subscriber");
}

View File

@ -1,10 +1,11 @@
pub struct RepoInfo<'a> {
pub commit_url: &'a str,
pub commits: u64,
pub domain: &'a str,
pub base_url: &'a str,
pub head: &'a str,
pub hoc: u64,
pub hoc_pretty: &'a str,
pub path: &'a str,
pub url: &'a str,
pub branch: &'a str,
}

View File

@ -1,7 +1,7 @@
@use super::base;
@use crate::statics::VersionInfo;
@(version_info: VersionInfo, repo_count: usize, domain: &str, url: &str, service: &str, path: &str)
@(version_info: VersionInfo, repo_count: usize, base_url: &str, url: &str, service: &str, path: &str)
@:base("Hits-of-Code Badges", "Badge Generator", {
@ -10,7 +10,7 @@ Here is the markdown for the badge for <a href="https://@url/@path">@url/@path</
</p>
<pre>
[![Hits-of-Code](https://@domain/@service/@path)](https://@domain/view/@service/@path)
[![Hits-of-Code](@base_url/@service/@path)](@base_url/@service/@path/view)
</pre>
<p>
@ -18,6 +18,6 @@ It will be rendered like this
</p>
<pre>
<a href="https://@domain/view/@service/@path"><img src="https://@domain/@service/@path" alt="example badge" /></a>
<a href="@base_url/@service/@path/view"><img src="@base_url/@service/@path" alt="example badge" /></a>
</pre>
}, version_info, repo_count)

View File

@ -1,7 +1,7 @@
@use super::base;
@use crate::statics::VersionInfo;
@(version_info: VersionInfo, repo_count: usize, domain: &str)
@(version_info: VersionInfo, repo_count: usize, base_url: &str)
@:base("Hits-of-Code Badges", "Hits-of-Code Badges", {
@ -24,7 +24,7 @@ used for GitHub, GitLab and Bitbucket repositories. Just put the following code
</p>
<pre>
[![Hits-of-Code](https://@domain/&lt;service&gt;/&lt;user&gt;/&lt;repo&gt;)](https://@domain/view/&lt;service&gt;/&lt;user&gt;/&lt;repo&gt;)
[![Hits-of-Code](@base_url/&lt;service&gt;/&lt;user&gt;/&lt;repo&gt;)](@base_url/&lt;service&gt;/&lt;user&gt;/&lt;repo&gt;/view)
</pre>
<p>
@ -33,7 +33,7 @@ following Markdown
</p>
<pre>
[![Hits-of-Code](https://@domain/github/vbrandl/hoc)](https://@domain/view/github/vbrandl/hoc)
[![Hits-of-Code](@base_url/github/vbrandl/hoc)](@base_url/github/vbrandl/hoc/view)
</pre>
<p>
@ -41,15 +41,21 @@ would render this badge:
</p>
<pre>
<a href="https://@domain/view/github/vbrandl/hoc"><img src="https://@domain/github/vbrandl/hoc"
<a href="@base_url/github/vbrandl/hoc/view"><img src="@base_url/github/vbrandl/hoc"
alt="example badge" /></a>
</pre>
<p>
By default, this service assumes the existence of a branch named <code>master</code>. If no branch with that name exists
in your repository or you want a badge for another branch of your repository, just append
<code>?branch=&lt;branch-name&gt;</code> to the URL.
</p>
<p>
You can also request the HoC as JSON by appending <code>/json</code> to the request path. This will return a JSON object
with three fields: <code>count</code> (the HoC value), <code>commits</code> (the number of commits) and
<code>head</code> (the commit ref of HEAD). Requesting <a
href="https://@domain/github/vbrandl/hoc/json">https://@domain/github/vbrandl/hoc/json</a> might return something along
href="@base_url/github/vbrandl/hoc/json">@base_url/github/vbrandl/hoc/json</a> might return something along
the lines of
</p>

View File

@ -9,7 +9,8 @@
<p>
The project <a href="@repo_info.url">@repo_info.url</a> has
<strong>@repo_info.hoc_pretty</strong> (exactly @repo_info.hoc) hits of code at
<a href="@repo_info.commit_url">@repo_info.head</a>. The repository contains
<a href="@repo_info.commit_url">@repo_info.head</a> on the
<code>@repo_info.branch</code> branch. The repository contains
<strong>@repo_info.commits</strong> commits.
</p>
@ -18,6 +19,11 @@ To include the badge in your readme, use the following markdown:
</p>
<pre>
[![Hits-of-Code](https://@repo_info.domain/@repo_info.path)](https://@repo_info.domain/view/@repo_info.path)
[![Hits-of-Code](@repo_info.base_url/@repo_info.path?branch=@repo_info.branch)](@repo_info.base_url/@repo_info.path/view?branch=@repo_info.branch)
</pre>
<form method="post" action="/@repo_info.path/delete">
<button type="submit">Rebuild Cache</button>
</form>
}, version_info, repo_count)

View File

@ -3,11 +3,11 @@
@(version_info: VersionInfo, repo_count: usize)
@:base("Master Branch not Found - Hits-of-Code Badges", "404 - Master Branch not Found", {
@:base("Branch not Found - Hits-of-Code Badges", "404 - Branch not Found", {
<p>
<big>Sorry</big>. I couldn't find the master branch of your repositroy.
Currently this service depends on the existence of a master branch. Please go
<a href="/">back to the homepage</a>.
<big>Sorry</big>. I couldn't find the requested branch of your repositroy. Currently this service assumes the
extistence of a branch named <code>master</code>. If you'd like to request a badge for another branch, you can do so by
attaching <code>?branch=&lt;branch-name&gt;</code> to the request.
</p>
<p>

18
tests/badge.rs Normal file
View File

@ -0,0 +1,18 @@
mod util;
use actix_web::client;
#[actix_rt::test]
async fn badge_succeeds() {
let test_app = util::spawn_app().await;
let client = client::Client::default();
let response = client
.get(&format!("{}/github/vbrandl/hoc", test_app.address))
.send()
.await
.expect("Failed to execute request");
assert!(response.status().is_success());
}

18
tests/health_check.rs Normal file
View File

@ -0,0 +1,18 @@
mod util;
use actix_web::client;
#[actix_rt::test]
async fn health_check_works() {
let test_app = util::spawn_app().await;
let client = client::Client::default();
let response = client
.get(&format!("{}/health_check", test_app.address))
.send()
.await
.expect("Failed to execute request");
assert!(response.status().is_success());
}

18
tests/index.rs Normal file
View File

@ -0,0 +1,18 @@
mod util;
use actix_web::client;
#[actix_rt::test]
async fn index_returns_success() {
let test_app = util::spawn_app().await;
let client = client::Client::default();
let response = client
.get(&format!("{}/", test_app.address))
.send()
.await
.expect("Failed to execute request");
assert!(response.status().is_success());
}

18
tests/json.rs Normal file
View File

@ -0,0 +1,18 @@
mod util;
use actix_web::client;
#[actix_rt::test]
async fn json_returns_success() {
let test_app = util::spawn_app().await;
let client = client::Client::default();
let response = client
.get(&format!("{}/github/vbrandl/hoc/json", test_app.address))
.send()
.await
.expect("Failed to execute request");
assert!(response.status().is_success());
}

50
tests/util/mod.rs Normal file
View File

@ -0,0 +1,50 @@
use hoc::{config::Settings, telemetry};
use std::net::TcpListener;
use tempfile::{tempdir, TempDir};
lazy_static::lazy_static! {
static ref TRACING: () = {
let filter = if std::env::var("TEST_LOG").is_ok() { "debug" } else { "" };
let subscriber = telemetry::get_subscriber("test", filter);
telemetry::init_subscriber(subscriber);
};
}
pub struct TestApp {
pub address: String,
repo_dir: TempDir,
cache_dir: TempDir,
}
pub async fn spawn_app() -> TestApp {
lazy_static::initialize(&TRACING);
let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind random port");
let port = listener.local_addr().unwrap().port();
let address = format!("http://127.0.0.1:{}", port);
let repo_dir = tempdir().expect("Cannot create repo_dir");
let cache_dir = tempdir().expect("Cannot create cache_dir");
let mut settings = Settings::load().expect("Failed to read configuration.");
settings.repodir = repo_dir.path().to_path_buf();
settings.cachedir = cache_dir.path().to_path_buf();
// configuration.database.database_name = Uuid::new_v4().to_string();
// let connection_pool = configure_database(&configuration.database).await;
let server = hoc::run(listener, settings)
.await
.expect("Failed to bind address");
let _ = tokio::spawn(server);
TestApp {
address,
repo_dir,
cache_dir,
}
}