Compare commits

..

No commits in common. "main" and "v0.4.6" have entirely different histories.

23 changed files with 1095 additions and 1675 deletions

View file

@ -15,39 +15,15 @@ jobs:
run: | run: |
PKG_CONFIG_SYSROOT_DIR=/usr/x86_64-linux-gnu cargo build --release --target x86_64-unknown-linux-gnu PKG_CONFIG_SYSROOT_DIR=/usr/x86_64-linux-gnu cargo build --release --target x86_64-unknown-linux-gnu
PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu cargo build --release --target aarch64-unknown-linux-gnu PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu cargo build --release --target aarch64-unknown-linux-gnu
- name: 🐋 Build docker image
ln -s ./x86_64-unknown-linux-gnu target/amd64 uses: https://code.thetadev.de/ThetaDev/action-kaniko@v1
ln -s ./aarch64-unknown-linux-gnu target/arm64
- name: Setup Docker Buildx
uses: https://github.com/docker/setup-buildx-action@v3
- name: Login to Container Registry
uses: https://github.com/docker/login-action@v3
with: with:
image: thetadev256/artifactview
username: thetadev256 username: thetadev256
password: ${{ secrets.DOCKER_TOKEN }} password: ${{ secrets.DOCKER_TOKEN }}
tag: ${{ github.ref_name }}
- name: Docker meta tag_with_latest: ${{ startsWith(github.ref, 'refs/tags/v') }}
id: meta platforms: "linux/amd64,linux/arm64"
uses: https://github.com/docker/metadata-action@v5
with:
images: |
thetadev256/artifactview
tags: |
type=semver,pattern=v{{version}}
type=semver,pattern=v{{major}}.{{minor}}
type=semver,pattern=v{{major}}
- name: 🐋 Build docker image
uses: https://github.com/docker/build-push-action@v6
with:
push: true
tags: ${{ steps.meta.outputs.tags }}
annotations: ${{ steps.meta.outputs.annotations }}
platforms: linux/amd64,linux/arm64
context: "."
file: Dockerfile
- name: Prepare release - name: Prepare release
if: ${{ startsWith(github.ref, 'refs/tags/v') }} if: ${{ startsWith(github.ref, 'refs/tags/v') }}
@ -71,6 +47,5 @@ jobs:
files: dist/* files: dist/*
- name: 🚀 Deploy to server - name: 🚀 Deploy to server
continue-on-error: true
run: | run: |
curl -SsL --fail-with-body -H "Authorization: Bearer ${{ secrets.THETADEV_DE_WATCHTOWER_TOKEN }}" https://watchtower.thetadev.de/v1/update curl -SsL --fail-with-body -H "Authorization: Bearer ${{ secrets.THETADEV_DE_WATCHTOWER_TOKEN }}" https://watchtower.thetadev.de/v1/update

View file

@ -8,7 +8,6 @@ on:
- "renovate.json" - "renovate.json"
schedule: schedule:
- cron: "0 0 * * *" - cron: "0 0 * * *"
workflow_dispatch:
env: env:
RENOVATE_REPOSITORIES: ${{ github.repository }} RENOVATE_REPOSITORIES: ${{ github.repository }}
@ -17,7 +16,7 @@ jobs:
renovate: renovate:
runs-on: docker runs-on: docker
container: container:
image: renovate/renovate:39 image: renovate/renovate:latest
steps: steps:
- name: Load renovate repo cache - name: Load renovate repo cache
@ -34,7 +33,7 @@ jobs:
- name: Run renovate - name: Run renovate
run: renovate run: renovate
env: env:
LOG_LEVEL: info LOG_LEVEL: debug
RENOVATE_BASE_DIR: ${{ github.workspace }}/.tmp RENOVATE_BASE_DIR: ${{ github.workspace }}/.tmp
RENOVATE_ENDPOINT: ${{ github.server_url }} RENOVATE_ENDPOINT: ${{ github.server_url }}
RENOVATE_PLATFORM: gitea RENOVATE_PLATFORM: gitea

View file

@ -3,192 +3,6 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [v0.5.0](https://codeberg.org/ThetaDev/artifactview/compare/v0.4.9..v0.5.0) - 2025-12-11
### 🚀 Features
- Add support for Forgejo v13 - ([09b588b](https://codeberg.org/ThetaDev/artifactview/commit/09b588b328eee9ab3d109c3c749d69e92ed0bac3))
### ⚙️ Miscellaneous Tasks
- Update dependencies - ([4012200](https://codeberg.org/ThetaDev/artifactview/commit/401220058218e08f5f511f8ba4b84f920a7c0ea4))
## [v0.4.9](https://codeberg.org/ThetaDev/artifactview/compare/v0.4.8..v0.4.9) - 2025-07-20
### 🐛 Bug Fixes
- TARGETARCH argument Buildkit workflow - ([c911af0](https://codeberg.org/ThetaDev/artifactview/commit/c911af085eb4e434f9976a9573d19e8c05985d3c))
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rust crate axum-test to v17.2.0 (#171) - ([dfa1ab5](https://codeberg.org/ThetaDev/artifactview/commit/dfa1ab54e8fd72113ed25d0a4a7f368db27fb2d0))
- *(deps)* Update rust crate serde_json to v1.0.138 (#173) - ([de2e2fc](https://codeberg.org/ThetaDev/artifactview/commit/de2e2fc7b174b2cbe8440c3a17d8002d6edbba73))
- *(deps)* Pin dependencies (#174) - ([aeebe74](https://codeberg.org/ThetaDev/artifactview/commit/aeebe74ddd07e1d8323f495a5065b8a9f06c2bc9))
- *(deps)* Update rust crate env_logger to v0.11.6 (#175) - ([a970d8c](https://codeberg.org/ThetaDev/artifactview/commit/a970d8cea779690e150ddbcc416d26a2efe4a606))
- *(deps)* Update rust crate zip to v2.2.2 (#181) - ([97852ce](https://codeberg.org/ThetaDev/artifactview/commit/97852ced9557b354642a703117b2a853e8f0c626))
- Update dependencies - ([1367ed9](https://codeberg.org/ThetaDev/artifactview/commit/1367ed9ff1dd3e2ca142fab14c1846a2a6b46423))
- Update release workflow to use Buildkit - ([e13bfa2](https://codeberg.org/ThetaDev/artifactview/commit/e13bfa2765b2bef0370efb01ba828cdf9a0da7b3))
- Fix clippy lints - ([43e15ca](https://codeberg.org/ThetaDev/artifactview/commit/43e15ca849be79905af0c517507bc3bdd0e995bb))
## [v0.4.8](https://codeberg.org/ThetaDev/artifactview/compare/v0.4.7..v0.4.8) - 2025-01-26
### 🐛 Bug Fixes
- Lifetime-related lints - ([e20f6fb](https://codeberg.org/ThetaDev/artifactview/commit/e20f6fb92e86751222d2c5143ee384cdbea1159d))
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rust crate async-compression to v0.4.15 (#85) - ([4f4716c](https://codeberg.org/ThetaDev/artifactview/commit/4f4716cdd86c317ede2b381d375ef8e736aee240))
- *(deps)* Update rust crate async-compression to v0.4.16 (#86) - ([9592da3](https://codeberg.org/ThetaDev/artifactview/commit/9592da3d6e2c2223174fcc459e94f29bf5067ead))
- *(deps)* Update rust crate serde_json to v1.0.129 (#87) - ([2e46d37](https://codeberg.org/ThetaDev/artifactview/commit/2e46d3795089ef7b2739db4d216f4db99f792071))
- *(deps)* Update rust crate serde_json to v1.0.131 (#88) - ([992f995](https://codeberg.org/ThetaDev/artifactview/commit/992f9954414af550fce90c9c7424ab0da2296875))
- *(deps)* Update rust crate governor to v0.6.4 (#89) - ([f1d9897](https://codeberg.org/ThetaDev/artifactview/commit/f1d9897e832b5cdb99fd81edcb38d27bd6b445f8))
- *(deps)* Update rust crate serde_json to v1.0.132 (#90) - ([600d18d](https://codeberg.org/ThetaDev/artifactview/commit/600d18d05b356c641a32b93b2407a1f23e2370c4))
- *(deps)* Update rust crate async-compression to v0.4.17 (#91) - ([0b3c032](https://codeberg.org/ThetaDev/artifactview/commit/0b3c0325a50cd456cb9b62f97e916f0760785a3c))
- *(deps)* Update rust crate governor to 0.7.0 (#92) - ([cbd304c](https://codeberg.org/ThetaDev/artifactview/commit/cbd304c84195983596156a95c26d65a89e93df8a))
- *(deps)* Update rust crate thiserror to v1.0.65 (#94) - ([2df196a](https://codeberg.org/ThetaDev/artifactview/commit/2df196a2e666e8186d9ff66e885123c8a48c743c))
- *(deps)* Update rust crate serde to v1.0.213 (#93) - ([e5b9105](https://codeberg.org/ThetaDev/artifactview/commit/e5b9105da1fb0c63584cc409b5dd98c1fe045f9b))
- *(deps)* Update rust crate tokio to v1.41.0 (#95) - ([1dc4fe2](https://codeberg.org/ThetaDev/artifactview/commit/1dc4fe225c01f237f6a698fced7eff72cfb8ee85))
- *(deps)* Update rust crate pin-project to v1.1.7 (#96) - ([c82bccc](https://codeberg.org/ThetaDev/artifactview/commit/c82bccca9098281fa42ded5d5527eadb3cbcce88))
- *(deps)* Update rust crate regex to v1.11.1 (#97) - ([613815a](https://codeberg.org/ThetaDev/artifactview/commit/613815aa1ebc01643e117ca9fafcb37bfe7d29d7))
- *(deps)* Update rust crate axum-test to v16.3.0 (#98) - ([b2070ec](https://codeberg.org/ThetaDev/artifactview/commit/b2070ec460e45eeb9997885bd7cf54913f9f4183))
- *(deps)* Update rust crate insta to v1.41.0 (#99) - ([5aec8d6](https://codeberg.org/ThetaDev/artifactview/commit/5aec8d677f089ff5092fe78655170d52e544baeb))
- *(deps)* Update rust crate quick-xml to 0.37.0 (#100) - ([72e20d4](https://codeberg.org/ThetaDev/artifactview/commit/72e20d413e80b86d49ea0b275ce6aece99d75314))
- *(deps)* Update rust crate reqwest to v0.12.9 (#101) - ([d45e8e6](https://codeberg.org/ThetaDev/artifactview/commit/d45e8e63c9ce4067a05839643581b9f42e4048ec))
- *(deps)* Update rust crate serde to v1.0.214 (#102) - ([2a1ebd7](https://codeberg.org/ThetaDev/artifactview/commit/2a1ebd7b854ca82cceb768202e4d9ee984007311))
- *(deps)* Update rust crate futures-lite to v2.4.0 (#103) - ([3bda063](https://codeberg.org/ThetaDev/artifactview/commit/3bda06357809e68c0804aa425e625893af1bbde2))
- *(deps)* Update rust crate insta to v1.41.1 (#104) - ([a406bff](https://codeberg.org/ThetaDev/artifactview/commit/a406bffabeeb2627cd5ef74f3520add6eb0a8d6c))
- *(deps)* Update rust crate thiserror to v1.0.66 (#105) - ([8f89fc9](https://codeberg.org/ThetaDev/artifactview/commit/8f89fc9953370c4325c63762e4451d37a1a4a64a))
- *(deps)* Update rust crate scraper to 0.21.0 (#106) - ([1f00bbf](https://codeberg.org/ThetaDev/artifactview/commit/1f00bbfac53521cf0f76cf6fc4bf23e7a5e10562))
- *(deps)* Update rust crate thiserror to v1.0.67 (#107) - ([39a76ea](https://codeberg.org/ThetaDev/artifactview/commit/39a76eaa334d3f57e30e3ba95eb781dfa7aee1ee))
- *(deps)* Update rust crate thiserror to v1.0.68 (#108) - ([a48af07](https://codeberg.org/ThetaDev/artifactview/commit/a48af07d936a77977d602649fe579941b2cd2630))
- *(deps)* Update rust crate url to v2.5.3 (#109) - ([44cc0c1](https://codeberg.org/ThetaDev/artifactview/commit/44cc0c10103eb8fc10ddcc17e559479fadcbe4f1))
- *(deps)* Update rust crate tokio to v1.41.1 (#111) - ([dd809ce](https://codeberg.org/ThetaDev/artifactview/commit/dd809ce3f322fe8dafadeb802be7fcf905aa2f02))
- *(deps)* Update rust crate thiserror to v2 (#110) - ([8cb636c](https://codeberg.org/ThetaDev/artifactview/commit/8cb636ccc9c93800e6e98522de5c38bb05e76fdb))
- *(deps)* Update rust crate futures-lite to v2.5.0 (#112) - ([c05eb56](https://codeberg.org/ThetaDev/artifactview/commit/c05eb562a9d10945ee534ef50208aeb004023c51))
- *(deps)* Update rust crate thiserror to v2.0.3 (#113) - ([a695cef](https://codeberg.org/ThetaDev/artifactview/commit/a695cef57d5c73492d806958290bb37bd9613125))
- *(deps)* Update rust crate serde to v1.0.215 (#114) - ([3497592](https://codeberg.org/ThetaDev/artifactview/commit/34975924b1e1c3d5367346a1e0274a435496091f))
- *(deps)* Update rust crate flate2 to v1.0.35 (#115) - ([0b9498c](https://codeberg.org/ThetaDev/artifactview/commit/0b9498c541c0188fd7c82a99b2f778251b831df3))
- *(deps)* Update rust crate axum to v0.7.8 (#116) - ([79623d9](https://codeberg.org/ThetaDev/artifactview/commit/79623d9bc2d40e43374c4a2934d6bbac1235bae7))
- *(deps)* Update rust crate axum-extra to v0.9.5 (#117) - ([b35cfe3](https://codeberg.org/ThetaDev/artifactview/commit/b35cfe3f4fe402943ee3238b671c18449c5437ba))
- *(deps)* Update rust crate axum-test to v16.4.0 (#118) - ([e370001](https://codeberg.org/ThetaDev/artifactview/commit/e37000143e752b4bc496797de2410be33d3adf2b))
- *(deps)* Update rust crate axum to v0.7.9 (#119) - ([cab58d2](https://codeberg.org/ThetaDev/artifactview/commit/cab58d284e6b9f2e6b730d9b3f6d648d0955832d))
- *(deps)* Update rust crate quick-xml to v0.37.1 (#121) - ([dffcd16](https://codeberg.org/ThetaDev/artifactview/commit/dffcd16a60b456e9ed547b2a01342df3585e607f))
- *(deps)* Update rust crate axum-extra to v0.9.6 (#120) - ([4cf0084](https://codeberg.org/ThetaDev/artifactview/commit/4cf0084e24969d15149468de42cf6ed15e1169f5))
- *(deps)* Update rust crate serde_json to v1.0.133 (#122) - ([5231609](https://codeberg.org/ThetaDev/artifactview/commit/52316093cdad4ceca274e4c65035842e0413892e))
- *(deps)* Update rust crate tower-http to v0.6.2 (#123) - ([8158497](https://codeberg.org/ThetaDev/artifactview/commit/8158497a73367fb2280d48350e3afa868c006d65))
- *(deps)* Update rust crate zip to v2.2.1 (#124) - ([81c8521](https://codeberg.org/ThetaDev/artifactview/commit/81c852126ca45172bd00f75a5007263fefb5967b))
- *(deps)* Update rust crate url to v2.5.4 (#125) - ([c99dfa8](https://codeberg.org/ThetaDev/artifactview/commit/c99dfa809175e84261245b2680a964b95d81b4e3))
- *(deps)* Update rust crate comrak to 0.30.0 (#126) - ([389dd6f](https://codeberg.org/ThetaDev/artifactview/commit/389dd6f536b9044a8b9675c3ad34fa218028d154))
- *(deps)* Update rust crate async-compression to v0.4.18 (#127) - ([05f20f4](https://codeberg.org/ThetaDev/artifactview/commit/05f20f44ac4910e600f318d656d376d52fd6b131))
- *(deps)* Update rust crate comrak to 0.31.0 (#128) - ([5fd14aa](https://codeberg.org/ThetaDev/artifactview/commit/5fd14aada8f310fdeb0b2dc33a15de0b195ebc81))
- *(deps)* Update rust crate tracing to v0.1.41 (#129) - ([ab3479f](https://codeberg.org/ThetaDev/artifactview/commit/ab3479f0d1b3a30413df654cc9f2e7a52081b542))
- *(deps)* Update rust crate tracing-subscriber to v0.3.19 (#130) - ([1f9847b](https://codeberg.org/ThetaDev/artifactview/commit/1f9847b3edd73c1e905feb88087ee4325364ddda))
- *(deps)* Update rust crate thiserror to v2.0.4 (#131) - ([e9d1226](https://codeberg.org/ThetaDev/artifactview/commit/e9d122639022d3b5b68b4626e00442a81acf85f5))
- *(deps)* Update rust crate time to v0.3.37 (#132) - ([6fc7263](https://codeberg.org/ThetaDev/artifactview/commit/6fc7263f5996abefdb71fd5ecae277ec707cbdd9))
- *(deps)* Update rust crate http to v1.2.0 (#133) - ([5f517ae](https://codeberg.org/ThetaDev/artifactview/commit/5f517ae6c784e4fbc99ca69650d85621e90f776c))
- *(deps)* Update rust crate tokio to v1.42.0 (#134) - ([b15c4b0](https://codeberg.org/ThetaDev/artifactview/commit/b15c4b009a268cd4227846f166131aad5628f87d))
- *(deps)* Update rust crate tokio-util to v0.7.13 (#135) - ([f43f06c](https://codeberg.org/ThetaDev/artifactview/commit/f43f06c33462c15a8a752493f14c86d9dbde0e8d))
- *(deps)* Update rust crate thiserror to v2.0.5 (#136) - ([94c589c](https://codeberg.org/ThetaDev/artifactview/commit/94c589c20936c8e56be3147fd01e51d8b25e617f))
- *(deps)* Update rust crate thiserror to v2.0.6 (#137) - ([5e83ab5](https://codeberg.org/ThetaDev/artifactview/commit/5e83ab510614db696a7245ad5027c717b3493cab))
- *(deps)* Update rust crate chrono to v0.4.39 (#138) - ([8e9c5aa](https://codeberg.org/ThetaDev/artifactview/commit/8e9c5aad48378c2fa1a1d3d370b96de2fca5dd86))
- *(deps)* Update rust crate governor to 0.8.0 (#139) - ([b24136e](https://codeberg.org/ThetaDev/artifactview/commit/b24136ec597d2b4c579176a6a7845878549478bb))
- *(deps)* Update rust crate scraper to 0.22.0 (#140) - ([f48c570](https://codeberg.org/ThetaDev/artifactview/commit/f48c57021505091b22c36bd49bd4527e652b8d78))
- *(deps)* Update rust crate serde to v1.0.216 (#141) - ([7d9827f](https://codeberg.org/ThetaDev/artifactview/commit/7d9827f9fc52aa88f19efa371e36877723328248))
- *(deps)* Update rust crate thiserror to v2.0.7 (#142) - ([1e26d04](https://codeberg.org/ThetaDev/artifactview/commit/1e26d04b068f9c2e0a65a3dbcc43f66d118a6043))
- *(deps)* Update rust crate axum-test to v16.4.1 (#143) - ([3244de4](https://codeberg.org/ThetaDev/artifactview/commit/3244de48fc2691898599ab20f2baa888db9f3c82))
- *(deps)* Update rust crate zip to v2.2.2 (#144) - ([98ba21e](https://codeberg.org/ThetaDev/artifactview/commit/98ba21e7979bfbdd06fb46da8e45f97f71dc2c99))
- *(deps)* Update rust crate proptest to v1.6.0 (#145) - ([d28f979](https://codeberg.org/ThetaDev/artifactview/commit/d28f9790b825b2af749e3fcd07718faa91c2a942))
- *(deps)* Update rust crate comrak to 0.32.0 (#146) - ([f6b0e06](https://codeberg.org/ThetaDev/artifactview/commit/f6b0e06dc1a39311c4473e0f4c3c5742a352e00f))
- *(deps)* Update rust crate thiserror to v2.0.8 (#147) - ([e87b71c](https://codeberg.org/ThetaDev/artifactview/commit/e87b71cc0df91f0ee71a88a3bd0127d4f8c74eea))
- *(deps)* Update rust crate env_logger to v0.11.6 (#148) - ([8e295a9](https://codeberg.org/ThetaDev/artifactview/commit/8e295a96decd532fdd854ee8950a68d496c1617d))
- *(deps)* Update rust crate serde_json to v1.0.134 (#149) - ([c90116c](https://codeberg.org/ThetaDev/artifactview/commit/c90116c9bac801e57062a462bd7a08a5fd6389b2))
- *(deps)* Update rust crate thiserror to v2.0.9 (#150) - ([2a2a8e0](https://codeberg.org/ThetaDev/artifactview/commit/2a2a8e0b310b4ddcf15f20b1189bf768499f6b75))
- *(deps)* Update rust crate serde to v1.0.217 (#151) - ([abe8f92](https://codeberg.org/ThetaDev/artifactview/commit/abe8f92ab8cdee926ca1ad4faf280427a9439e0e))
- *(deps)* Update rust crate quick-xml to v0.37.2 (#152) - ([d778789](https://codeberg.org/ThetaDev/artifactview/commit/d7787899593d60243c1efa6dd036fc44e9c51868))
- *(deps)* Update rust crate axum-extra to 0.10.0 (#154) - ([55621fb](https://codeberg.org/ThetaDev/artifactview/commit/55621fbbea51aed2234e43fa4b5ed61524ca1805))
- *(deps)* Update rust crate rstest to 0.24.0 (#155) - ([b3cc2b5](https://codeberg.org/ThetaDev/artifactview/commit/b3cc2b53dc032d2821748895c983dde49c56eb65))
- *(deps)* Update rust crate reqwest to v0.12.12 (#156) - ([cd73f48](https://codeberg.org/ThetaDev/artifactview/commit/cd73f4828f67d31dee356cb98a1ac45354e0e728))
- *(deps)* Update rust crate comrak to 0.33.0 (#158) - ([1ce03ca](https://codeberg.org/ThetaDev/artifactview/commit/1ce03ca19f4032d5e88c8efbe83b98c45d98247d))
- *(deps)* Update rust crate insta to v1.42.0 (#159) - ([5b138fa](https://codeberg.org/ThetaDev/artifactview/commit/5b138fae112d47a08b0940d61bd403047a8567fa))
- *(deps)* Update rust crate pin-project to v1.1.8 (#161) - ([13ee5cc](https://codeberg.org/ThetaDev/artifactview/commit/13ee5cc2456180bfdc47a2d9e3a0dfe9a2dacd7d))
- *(deps)* Update rust crate serde_json to v1.0.135 (#162) - ([8417ea3](https://codeberg.org/ThetaDev/artifactview/commit/8417ea34a0808d2ba25194021bbe38538ce52ddf))
- *(deps)* Update rust crate thiserror to v2.0.10 (#163) - ([c2ee6cd](https://codeberg.org/ThetaDev/artifactview/commit/c2ee6cd84933e7cb2167b4cd34ec47f926105e59))
- *(deps)* Update rust crate tokio to v1.43.0 (#164) - ([db790e0](https://codeberg.org/ThetaDev/artifactview/commit/db790e0811e9a67a63dc4708ca928efbcff1eb49))
- *(deps)* Update rust crate thiserror to v2.0.11 (#165) - ([db0a4fd](https://codeberg.org/ThetaDev/artifactview/commit/db0a4fd5d48842ff48a375d241139ad91796422b))
- *(deps)* Update rust crate futures-lite to v2.6.0 (#166) - ([c9a6d67](https://codeberg.org/ThetaDev/artifactview/commit/c9a6d6786f763825874520776653b311bc7bd5d8))
- *(deps)* Update rust crate serde_json to v1.0.137 (#167) - ([558ce7d](https://codeberg.org/ThetaDev/artifactview/commit/558ce7daa8fbedac507f2d6e01961896eb8daac0))
- *(deps)* Update rust crate comrak to 0.34.0 (#168) - ([a88977a](https://codeberg.org/ThetaDev/artifactview/commit/a88977af942d275422670984ddbefa53f8d61e13))
- *(deps)* Update rust crate comrak to 0.35.0 (#169) - ([4042ded](https://codeberg.org/ThetaDev/artifactview/commit/4042ded5aee3763c293ffd264cb2428eb4266845))
- *(deps)* Update rust crate insta to v1.42.1 (#170) - ([0c49fe7](https://codeberg.org/ThetaDev/artifactview/commit/0c49fe751a833ca684bfc39d19e2f1eb7ea269f5))
- *(deps)* Update rust crate axum to 0.8.0 (#157) - ([2c2893d](https://codeberg.org/ThetaDev/artifactview/commit/2c2893da218737572e3943e2b72f7cec4ca6798f))
## [v0.4.7](https://codeberg.org/ThetaDev/artifactview/compare/v0.4.6..v0.4.7) - 2024-10-12
### 🐛 Bug Fixes
- *(deps)* Update rust crate serde_json to v1.0.121 (#29) - ([df805bf](https://codeberg.org/ThetaDev/artifactview/commit/df805bfe8394dd148ded1d4d3af901eb97593885))
- *(deps)* Update rust crate serde_json to v1.0.122 (#32) - ([db67487](https://codeberg.org/ThetaDev/artifactview/commit/db67487abdfc15fe55854fcb233e0bb876b603b3))
- *(deps)* Update rust crate regex to v1.10.6 (#33) - ([7c2a976](https://codeberg.org/ThetaDev/artifactview/commit/7c2a97666d98d4959affbb8ece93c4ba162a760d))
- *(deps)* Update rust crate serde-env to 0.2.0 (#37) - ([6b7d107](https://codeberg.org/ThetaDev/artifactview/commit/6b7d107387ff3e52e62e4ed19c64e63f8048c478))
- *(deps)* Update rust crate serde to v1.0.205 (#38) - ([f9698b5](https://codeberg.org/ThetaDev/artifactview/commit/f9698b5a7f9c7f3748d4d7aa38f7dc4c0f5f2029))
- *(deps)* Update rust crate serde to v1.0.206 (#39) - ([ed86f30](https://codeberg.org/ThetaDev/artifactview/commit/ed86f30cf4a736eeb4a3d471e81b8e7f7344b53b))
- *(deps)* Update rust crate serde_json to v1.0.124 (#40) - ([cc6a495](https://codeberg.org/ThetaDev/artifactview/commit/cc6a4959983205ae2f40d81c9a40c8514165c0bb))
- *(deps)* Update rust crate serde to v1.0.207 (#41) - ([0c2b39a](https://codeberg.org/ThetaDev/artifactview/commit/0c2b39a68a1adb567a1582f0c1b9e024fda9ed53))
- *(deps)* Update rust crate serde to v1.0.208 (#43) - ([8073e90](https://codeberg.org/ThetaDev/artifactview/commit/8073e90f685d80565db81e23769841c16c2af261))
- *(deps)* Update rust crate serde_json to v1.0.125 (#44) - ([4b3639a](https://codeberg.org/ThetaDev/artifactview/commit/4b3639aea7beed4ebc421fdfe26823be164d5c1c))
- *(deps)* Update rust crate comrak to 0.27.0 (#46) - ([3cef317](https://codeberg.org/ThetaDev/artifactview/commit/3cef3175767170824f604fcccdc912bf09745bf9))
- *(deps)* Update rust crate comrak to 0.28.0 (#47) - ([a88a3c6](https://codeberg.org/ThetaDev/artifactview/commit/a88a3c6103e776a4d10b3f7e6e9a37a2c672cfba))
- *(deps)* Update rust crate quick_cache to v0.6.6 (#50) - ([73959c0](https://codeberg.org/ThetaDev/artifactview/commit/73959c00f2c54b682c3db8640ca12319ce4ee37d))
- *(deps)* Update rust crate reqwest to v0.12.7 (#51) - ([22d5626](https://codeberg.org/ThetaDev/artifactview/commit/22d5626bf025783a127cd99faa0052778e0253b1))
- *(deps)* Update rust crate serde to v1.0.210 (#52) - ([f8c9d6f](https://codeberg.org/ThetaDev/artifactview/commit/f8c9d6f7cb475f4642f5e4f11108c4d053cc8c7e))
- *(deps)* Update rust crate serde_json to v1.0.128 (#57) - ([a48e23b](https://codeberg.org/ThetaDev/artifactview/commit/a48e23beceefc1b4c51910dc7114ab62abfd189c))
- *(deps)* Update rust crate quick_cache to v0.6.9 (#59) - ([4eb2b22](https://codeberg.org/ThetaDev/artifactview/commit/4eb2b22a8f1c2b1b28f72303d364708d04790eca))
- *(deps)* Update rust crate tower-http to 0.6.0 (#61) - ([1d03f5b](https://codeberg.org/ThetaDev/artifactview/commit/1d03f5b4b09596a68893126d8b177226b62fb38a))
- *(deps)* Update rust crate axum to v0.7.6 (#62) - ([61f65e5](https://codeberg.org/ThetaDev/artifactview/commit/61f65e54db431b3e94d21188920ae88233c44d3b))
- *(deps)* Update rust crate quick-xml to v0.36.2 (#64) - ([de4459f](https://codeberg.org/ThetaDev/artifactview/commit/de4459f646444a949c390394524f284a1944a0da))
- *(deps)* Update rust crate axum-extra to v0.9.4 (#63) - ([6619ef6](https://codeberg.org/ThetaDev/artifactview/commit/6619ef60e44832dd8839bcaf82d43707965b772a))
- *(deps)* Update rust crate thiserror to v1.0.64 (#66) - ([923f97f](https://codeberg.org/ThetaDev/artifactview/commit/923f97f8e9d0855ff97685496221a180018ae686))
- *(deps)* Update rust crate tower-http to v0.6.1 (#68) - ([ca0734d](https://codeberg.org/ThetaDev/artifactview/commit/ca0734d47072d555ba07b2f512975b9379305a58))
- *(deps)* Update rust crate secrecy to 0.10.0 (#60) - ([72d0cde](https://codeberg.org/ThetaDev/artifactview/commit/72d0cde37075220cc6a938840ad30781ecdcbaa7))
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rust crate zip to v2.1.6 (#31) - ([7e0aaa8](https://codeberg.org/ThetaDev/artifactview/commit/7e0aaa8362005b56526ed5a6114f473893a5cf46))
- *(deps)* Update rust crate flate2 to v1.0.31 (#34) - ([01e6a9c](https://codeberg.org/ThetaDev/artifactview/commit/01e6a9c8ad1f7c7dd5307a02a4a2b3c381aeacd6))
- *(deps)* Update rust crate rstest to 0.22.0 (#35) - ([b9d0a29](https://codeberg.org/ThetaDev/artifactview/commit/b9d0a29741138a4dd7b758417b003c9bddc35f3e))
- *(deps)* Update rust crate scraper to 0.20.0 (#36) - ([ca174a3](https://codeberg.org/ThetaDev/artifactview/commit/ca174a3aa21d0466930c2aa3291c2ecbed2ac31f))
- *(deps)* Update rust crate axum-test to v15.3.1 (#42) - ([24171c9](https://codeberg.org/ThetaDev/artifactview/commit/24171c9800aa52270c203e5a5fc40f520b6ac74c))
- *(deps)* Update rust crate tokio to v1.39.3 (#45) - ([63978d7](https://codeberg.org/ThetaDev/artifactview/commit/63978d79f9c3e276e59d7f3a558cec5f8f88e17e))
- *(deps)* Update rust crate flate2 to v1.0.33 (#48) - ([980e596](https://codeberg.org/ThetaDev/artifactview/commit/980e5968eaa909c9d7a72d78156d3465c4599abe))
- *(deps)* Update rust crate tokio-util to v0.7.12 (#49) - ([78179fd](https://codeberg.org/ThetaDev/artifactview/commit/78179fd73791c47cd3a60a37e704472109b50c15))
- *(deps)* Update rust crate insta to v1.40.0 (#54) - ([03597d1](https://codeberg.org/ThetaDev/artifactview/commit/03597d10e58eca8a56e4708971cac1750e7707f4))
- *(deps)* Update rust crate tokio to v1.40.0 (#55) - ([97b9610](https://codeberg.org/ThetaDev/artifactview/commit/97b9610f308c8ad0a083f6522c8b661c4b2c1e4f))
- *(deps)* Update rust crate zip to v2.2.0 (#56) - ([3f719ac](https://codeberg.org/ThetaDev/artifactview/commit/3f719ac939612722b82b8bad2744b4570ff40df7))
- *(deps)* Update rust crate once_cell to v1.20.0 (#58) - ([f8a95c8](https://codeberg.org/ThetaDev/artifactview/commit/f8a95c82e4a627d10906330327e94cd829d6f4c8))
- *(deps)* Update rust crate axum-test to v15.7.1 (#53) - ([7a92941](https://codeberg.org/ThetaDev/artifactview/commit/7a92941452b0e2f59e0ceda49a378f0ef43784cb))
- *(deps)* Update rust crate axum-test to v15.7.3 (#65) - ([82ca6dd](https://codeberg.org/ThetaDev/artifactview/commit/82ca6dd6bff9d8cb87a349cc8edb46f42a9721fc))
- *(deps)* Update rust crate axum-test to v16 (#69) - ([dbcee49](https://codeberg.org/ThetaDev/artifactview/commit/dbcee4945c0be57534bdd2d7d98d85767e0cf92c))
- *(deps)* Update rust crate flate2 to v1.0.34 (#70) - ([6f3544e](https://codeberg.org/ThetaDev/artifactview/commit/6f3544e3d8051697053cad5a751df6a1b4bc658b))
- *(deps)* Update rust crate axum to v0.7.7 (#71) - ([01c494c](https://codeberg.org/ThetaDev/artifactview/commit/01c494c2773dc67f922beed7e84aa2ff59fb575f))
- *(deps)* Update rust crate axum-test to v16.0.1 (#72) - ([2367512](https://codeberg.org/ThetaDev/artifactview/commit/23675124bdb15e01f037a6380f97f4d2921a34eb))
- *(deps)* Update rust crate once_cell to v1.20.1 (#73) - ([484f113](https://codeberg.org/ThetaDev/artifactview/commit/484f1136469f5459b1d464944621e9db450d2f6a))
- *(deps)* Update rust crate axum-test to v16.1.0 (#74) - ([2ed0cdc](https://codeberg.org/ThetaDev/artifactview/commit/2ed0cdc4a372c0a40de2ddc70a14b658a3619eec))
- *(deps)* Update rust crate regex to v1.11.0 (#75) - ([e436f77](https://codeberg.org/ThetaDev/artifactview/commit/e436f77c3e4969d83c42d45201c15f0375d90ad0))
- *(deps)* Update rust crate rstest to 0.23.0 (#76) - ([7c684eb](https://codeberg.org/ThetaDev/artifactview/commit/7c684eb5657eda84668bf3a1aadf38f1e4ac51db))
- *(deps)* Update rust crate reqwest to v0.12.8 (#77) - ([a3f028f](https://codeberg.org/ThetaDev/artifactview/commit/a3f028f2ad11d3e599bf20d1f92679bf8b8dafc4))
- *(deps)* Update rust crate async-compression to v0.4.13 (#78) - ([7cefbd4](https://codeberg.org/ThetaDev/artifactview/commit/7cefbd4a67e5636f046177f35fce14fff6300cb4))
- *(deps)* Update rust crate once_cell to v1.20.2 (#79) - ([8309901](https://codeberg.org/ThetaDev/artifactview/commit/8309901a8c658cdf948889df57b731147d77c949))
- *(deps)* Update rust crate pin-project to v1.1.6 (#80) - ([6ca7088](https://codeberg.org/ThetaDev/artifactview/commit/6ca7088b9c7ecd001df52f9cb35e86301c231bbb))
- *(deps)* Update rust crate axum-test to v16.2.0 (#81) - ([e63baec](https://codeberg.org/ThetaDev/artifactview/commit/e63baec2490e069953f63d158f9af212f154055b))
- *(deps)* Update rust crate secrecy to v0.10.3 (#82) - ([a2dc40f](https://codeberg.org/ThetaDev/artifactview/commit/a2dc40f4443cb3c3d1c7cf2b9e7178777c4b73e7))
- *(deps)* Update rust crate async-compression to v0.4.14 (#83) - ([51f098f](https://codeberg.org/ThetaDev/artifactview/commit/51f098f4ada63ddc550774a60a81eb3d55697b44))
- *(deps)* Update rust crate comrak to 0.29.0 (#84) - ([5da4074](https://codeberg.org/ThetaDev/artifactview/commit/5da4074bb9e87c9d17ed70669b6e47a3d57b1e8f))
## [v0.4.6](https://codeberg.org/ThetaDev/artifactview/compare/v0.4.5..v0.4.6) - 2024-07-28 ## [v0.4.6](https://codeberg.org/ThetaDev/artifactview/compare/v0.4.5..v0.4.6) - 2024-07-28
### 🐛 Bug Fixes ### 🐛 Bug Fixes

2334
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
[package] [package]
name = "artifactview" name = "artifactview"
version = "0.5.0" version = "0.4.6"
edition = "2021" edition = "2021"
authors = ["ThetaDev <thetadev@magenta.de>"] authors = ["ThetaDev <thetadev@magenta.de>"]
license = "MIT" license = "MIT"
@ -21,7 +21,7 @@ async_zip = { path = "crates/async_zip", features = [
"tokio-fs", "tokio-fs",
"deflate", "deflate",
] } ] }
axum = { version = "0.8.0", default-features = false, features = [ axum = { version = "0.7.5", default-features = false, features = [
"http1", "http1",
"http2", "http2",
"json", "json",
@ -29,13 +29,13 @@ axum = { version = "0.8.0", default-features = false, features = [
"tokio", "tokio",
"tracing", "tracing",
] } ] }
axum-extra = { version = "0.12.0", features = ["typed-header"] } axum-extra = { version = "0.9.3", features = ["typed-header"] }
comrak = { version = "0.49.0", default-features = false } comrak = { version = "0.26.0", default-features = false }
dotenvy = "0.15.7" dotenvy = "0.15.7"
envy = { path = "crates/envy" } envy = { path = "crates/envy" }
flate2 = "1.0.30" flate2 = "1.0.30"
futures-lite = "2.3.0" futures-lite = "2.3.0"
governor = "0.10.0" governor = "0.6.3"
headers = "0.4.0" headers = "0.4.0"
http = "1.1.0" http = "1.1.0"
humansize = "2.1.3" humansize = "2.1.3"
@ -47,15 +47,15 @@ path_macro = "1.0.0"
percent-encoding = "2.3.1" percent-encoding = "2.3.1"
pin-project = "1.1.5" pin-project = "1.1.5"
quick_cache = "0.6.0" quick_cache = "0.6.0"
rand = "0.9.0" rand = "0.8.5"
regex = "1.10.4" regex = "1.10.4"
reqwest = { version = "0.12.4", default-features = false, features = [ reqwest = { version = "0.12.4", default-features = false, features = [
"json", "json",
"stream", "stream",
] } ] }
secrecy = { version = "0.10.0", features = ["serde"] } secrecy = { version = "0.8.0", features = ["serde"] }
serde = { version = "1.0.203", features = ["derive"] } serde = { version = "1.0.203", features = ["derive"] }
serde-env = "0.2.0" serde-env = "0.1.1"
serde-hex = "0.1.0" serde-hex = "0.1.0"
serde_json = "1.0.117" serde_json = "1.0.117"
serde_urlencoded = "0.7.1" serde_urlencoded = "0.7.1"
@ -66,27 +66,27 @@ syntect = { version = "5.2.0", default-features = false, features = [
"html", "html",
"regex-onig", "regex-onig",
] } ] }
thiserror = "2.0.0" thiserror = "1.0.61"
time = { version = "0.3.36", features = ["serde-human-readable", "macros"] } time = { version = "0.3.36", features = ["serde-human-readable", "macros"] }
tokio = { version = "1.37.0", features = ["macros", "fs", "rt-multi-thread"] } tokio = { version = "1.37.0", features = ["macros", "fs", "rt-multi-thread"] }
tokio-util = { version = "0.7.11", features = ["io"] } tokio-util = { version = "0.7.11", features = ["io"] }
tower-http = { version = "0.6.0", features = ["trace", "set-header"] } tower-http = { version = "0.5.2", features = ["trace", "set-header"] }
tracing = "0.1.40" tracing = "0.1.40"
tracing-subscriber = "0.3.18" tracing-subscriber = "0.3.18"
url = "2.5.0" url = "2.5.0"
yarte = { version = "0.15.7", features = ["json"] } yarte = { version = "0.15.7", features = ["json"] }
scraper = "0.25.0"
[build-dependencies] [build-dependencies]
yarte_helpers = "0.15.8" yarte_helpers = "0.15.8"
[dev-dependencies] [dev-dependencies]
axum-test = "18.4.0" axum-test = "15.0.1"
flate2 = "1.0.30" flate2 = "1.0.30"
httpdate = "1.0.3" httpdate = "1.0.3"
insta = { version = "1.44.0", features = ["json"] } insta = { version = "1.39.0", features = ["json"] }
proptest = "1.9.0" proptest = "1.4.0"
rstest = { version = "0.26.0", default-features = false } rstest = { version = "0.21.0", default-features = false }
scraper = "0.19.0"
temp_testdir = "0.2.3" temp_testdir = "0.2.3"
[workspace] [workspace]

View file

@ -1,10 +1,13 @@
FROM debian:bookworm-slim FROM debian:bookworm-slim
ARG TARGETARCH ARG TARGETARCH_ALT
RUN apt-get update && apt-get install -y libssl3 ca-certificates dumb-init && apt-get clean RUN apt-get update && apt-get install -y libssl3 ca-certificates dumb-init && apt-get clean
COPY target/${TARGETARCH}/release/artifactview /usr/bin/artifactview COPY target/${TARGETARCH_ALT}-unknown-linux-gnu/release/artifactview /usr/bin/artifactview
EXPOSE 3000 EXPOSE 3000
ENTRYPOINT ["dumb-init", "artifactview"] ENTRYPOINT ["dumb-init", "artifactview"]
LABEL repository="https://codeberg.org/ThetaDev/action-kaniko" \
maintainer="ThetaDev <thetadev@magenta.de>"

View file

@ -37,7 +37,7 @@ rustdoc-args = ["--cfg", "docsrs"]
crc32fast = "1" crc32fast = "1"
futures-lite = { version = "2.1.0", default-features = false, features = ["std"] } futures-lite = { version = "2.1.0", default-features = false, features = ["std"] }
pin-project = "1" pin-project = "1"
thiserror = "2" thiserror = "1"
async-compression = { version = "0.4.2", default-features = false, features = ["futures-io"], optional = true } async-compression = { version = "0.4.2", default-features = false, features = ["futures-io"], optional = true }
chrono = { version = "0.4", default-features = false, features = ["clock"], optional = true } chrono = { version = "0.4", default-features = false, features = ["clock"], optional = true }
@ -49,7 +49,7 @@ tokio-util = { version = "0.7", features = ["compat"], optional = true }
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }
tokio-util = { version = "0.7", features = ["compat"] } tokio-util = { version = "0.7", features = ["compat"] }
env_logger = "0.11.2" env_logger = "0.11.2"
zip = "2.2.2" zip = "2.1.5"
# shared across multiple examples # shared across multiple examples
# anyhow = "1" # anyhow = "1"

View file

@ -51,7 +51,7 @@ where
} }
} }
impl<R, E> AsyncRead for ZipEntryReader<'_, R, E> impl<'a, R, E> AsyncRead for ZipEntryReader<'a, R, E>
where where
R: AsyncBufRead + Unpin, R: AsyncBufRead + Unpin,
{ {
@ -60,7 +60,7 @@ where
} }
} }
impl<R, E> ZipEntryReader<'_, R, E> impl<'a, R, E> ZipEntryReader<'a, R, E>
where where
R: AsyncBufRead + Unpin, R: AsyncBufRead + Unpin,
{ {
@ -118,7 +118,7 @@ enum OwnedEntry<'a> {
Borrow(&'a ZipEntry), Borrow(&'a ZipEntry),
} }
impl OwnedEntry<'_> { impl<'a> OwnedEntry<'a> {
pub fn entry(&self) -> &'_ ZipEntry { pub fn entry(&self) -> &'_ ZipEntry {
match self { match self {
OwnedEntry::Owned(entry) => entry, OwnedEntry::Owned(entry) => entry,

View file

@ -17,7 +17,7 @@ pub(crate) enum OwnedReader<'a, R> {
Borrow(#[pin] &'a mut R), Borrow(#[pin] &'a mut R),
} }
impl<R> OwnedReader<'_, R> impl<'a, R> OwnedReader<'a, R>
where where
R: AsyncBufRead + Unpin, R: AsyncBufRead + Unpin,
{ {
@ -30,7 +30,7 @@ where
} }
} }
impl<R> AsyncBufRead for OwnedReader<'_, R> impl<'a, R> AsyncBufRead for OwnedReader<'a, R>
where where
R: AsyncBufRead + Unpin, R: AsyncBufRead + Unpin,
{ {
@ -49,7 +49,7 @@ where
} }
} }
impl<R> AsyncRead for OwnedReader<'_, R> impl<'a, R> AsyncRead for OwnedReader<'a, R>
where where
R: AsyncBufRead + Unpin, R: AsyncBufRead + Unpin,
{ {

View file

@ -116,7 +116,7 @@ impl ZipFileReader {
} }
/// Returns a new entry reader if the provided index is valid. /// Returns a new entry reader if the provided index is valid.
pub async fn reader_without_entry(&self, index: usize) -> Result<ZipEntryReader<'_, Cursor<&[u8]>, WithoutEntry>> { pub async fn reader_without_entry(&self, index: usize) -> Result<ZipEntryReader<Cursor<&[u8]>, WithoutEntry>> {
let stored_entry = self.inner.file.entries.get(index).ok_or(ZipError::EntryIndexOutOfBounds)?; let stored_entry = self.inner.file.entries.get(index).ok_or(ZipError::EntryIndexOutOfBounds)?;
let mut cursor = Cursor::new(&self.inner.data[..]); let mut cursor = Cursor::new(&self.inner.data[..]);
@ -130,7 +130,7 @@ impl ZipFileReader {
} }
/// Returns a new entry reader if the provided index is valid. /// Returns a new entry reader if the provided index is valid.
pub async fn reader_with_entry(&self, index: usize) -> Result<ZipEntryReader<'_, Cursor<&[u8]>, WithEntry<'_>>> { pub async fn reader_with_entry(&self, index: usize) -> Result<ZipEntryReader<Cursor<&[u8]>, WithEntry<'_>>> {
let stored_entry = self.inner.file.entries.get(index).ok_or(ZipError::EntryIndexOutOfBounds)?; let stored_entry = self.inner.file.entries.get(index).ok_or(ZipError::EntryIndexOutOfBounds)?;
let mut cursor = Cursor::new(&self.inner.data[..]); let mut cursor = Cursor::new(&self.inner.data[..]);

View file

@ -64,7 +64,7 @@ impl<'b, W: AsyncWrite + Unpin> CompressedAsyncWriter<'b, W> {
} }
} }
impl<W: AsyncWrite + Unpin> AsyncWrite for CompressedAsyncWriter<'_, W> { impl<'b, W: AsyncWrite + Unpin> AsyncWrite for CompressedAsyncWriter<'b, W> {
fn poll_write(mut self: Pin<&mut Self>, cx: &mut Context, buf: &[u8]) -> Poll<std::result::Result<usize, Error>> { fn poll_write(mut self: Pin<&mut Self>, cx: &mut Context, buf: &[u8]) -> Poll<std::result::Result<usize, Error>> {
match *self { match *self {
CompressedAsyncWriter::Stored(ref mut inner) => Pin::new(inner).poll_write(cx, buf), CompressedAsyncWriter::Stored(ref mut inner) => Pin::new(inner).poll_write(cx, buf),

View file

@ -251,7 +251,7 @@ impl<'b, W: AsyncWrite + Unpin> EntryStreamWriter<'b, W> {
} }
} }
impl<W: AsyncWrite + Unpin> AsyncWrite for EntryStreamWriter<'_, W> { impl<'a, W: AsyncWrite + Unpin> AsyncWrite for EntryStreamWriter<'a, W> {
fn poll_write(mut self: Pin<&mut Self>, cx: &mut Context, buf: &[u8]) -> Poll<std::result::Result<usize, Error>> { fn poll_write(mut self: Pin<&mut Self>, cx: &mut Context, buf: &[u8]) -> Poll<std::result::Result<usize, Error>> {
let poll = Pin::new(&mut self.writer).poll_write(cx, buf); let poll = Pin::new(&mut self.writer).poll_write(cx, buf);

View file

@ -74,7 +74,7 @@ async fn test_write_large_zip64_file() {
assert_eq!(zip64.compressed_size.unwrap(), BATCHED_FILE_SIZE as u64); assert_eq!(zip64.compressed_size.unwrap(), BATCHED_FILE_SIZE as u64);
assert_eq!(zip64.uncompressed_size.unwrap(), BATCHED_FILE_SIZE as u64); assert_eq!(zip64.uncompressed_size.unwrap(), BATCHED_FILE_SIZE as u64);
} }
e => panic!("Expected a Zip64 extended field, got {e:?}"), e => panic!("Expected a Zip64 extended field, got {:?}", e),
} }
assert_eq!(cd_entry.header.uncompressed_size, NON_ZIP64_MAX_SIZE); assert_eq!(cd_entry.header.uncompressed_size, NON_ZIP64_MAX_SIZE);
assert_eq!(cd_entry.header.compressed_size, NON_ZIP64_MAX_SIZE); assert_eq!(cd_entry.header.compressed_size, NON_ZIP64_MAX_SIZE);

View file

@ -15,15 +15,15 @@ impl StdError for Error {}
impl fmt::Display for Error { impl fmt::Display for Error {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match self { match self {
Error::MissingValue(field) => write!(fmt, "missing value for {field}"), Error::MissingValue(field) => write!(fmt, "missing value for {}", &field),
Error::Custom(ref msg) => write!(fmt, "{msg}"), Error::Custom(ref msg) => write!(fmt, "{}", msg),
} }
} }
} }
impl SerdeError for Error { impl SerdeError for Error {
fn custom<T: fmt::Display>(msg: T) -> Self { fn custom<T: fmt::Display>(msg: T) -> Self {
Error::Custom(format!("{msg}")) Error::Custom(format!("{}", msg))
} }
fn missing_field(field: &'static str) -> Error { fn missing_field(field: &'static str) -> Error {

View file

@ -77,7 +77,7 @@ where
struct Val(String, String); struct Val(String, String);
impl IntoDeserializer<'_, Error> for Val { impl<'de> IntoDeserializer<'de, Error> for Val {
type Deserializer = Self; type Deserializer = Self;
fn into_deserializer(self) -> Self::Deserializer { fn into_deserializer(self) -> Self::Deserializer {
@ -87,7 +87,7 @@ impl IntoDeserializer<'_, Error> for Val {
struct VarName(String); struct VarName(String);
impl IntoDeserializer<'_, Error> for VarName { impl<'de> IntoDeserializer<'de, Error> for VarName {
type Deserializer = Self; type Deserializer = Self;
fn into_deserializer(self) -> Self::Deserializer { fn into_deserializer(self) -> Self::Deserializer {
@ -248,7 +248,7 @@ struct Deserializer<'de, Iter: Iterator<Item = (String, String)>> {
inner: MapDeserializer<'de, Vars<Iter>, Error>, inner: MapDeserializer<'de, Vars<Iter>, Error>,
} }
impl<Iter: Iterator<Item = (String, String)>> Deserializer<'_, Iter> { impl<'de, Iter: Iterator<Item = (String, String)>> Deserializer<'de, Iter> {
fn new(vars: Iter) -> Self { fn new(vars: Iter) -> Self {
Deserializer { Deserializer {
inner: MapDeserializer::new(Vars(vars)), inner: MapDeserializer::new(Vars(vars)),
@ -308,7 +308,7 @@ where
/// These types are created with with the [prefixed](fn.prefixed.html) module function /// These types are created with with the [prefixed](fn.prefixed.html) module function
pub struct Prefixed<'a>(Cow<'a, str>); pub struct Prefixed<'a>(Cow<'a, str>);
impl Prefixed<'_> { impl<'a> Prefixed<'a> {
/// Deserializes a type based on prefixed env variables /// Deserializes a type based on prefixed env variables
pub fn from_env<T>(&self) -> Result<T> pub fn from_env<T>(&self) -> Result<T>
where where
@ -390,7 +390,7 @@ impl<'a> SplitEscaped<'a> {
} }
} }
impl Iterator for SplitEscaped<'_> { impl<'a> Iterator for SplitEscaped<'a> {
type Item = String; type Item = String;
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
@ -492,7 +492,7 @@ mod tests {
newtype: CustomNewType(42) newtype: CustomNewType(42)
} }
), ),
Err(e) => panic!("{e:#?}"), Err(e) => panic!("{:#?}", e),
} }
} }
@ -564,7 +564,7 @@ mod tests {
newtype: CustomNewType(42) newtype: CustomNewType(42)
} }
), ),
Err(e) => panic!("{e:#?}"), Err(e) => panic!("{:#?}", e),
} }
} }

View file

@ -7,8 +7,8 @@ license = "BSD-2-Clause"
repository = "https://github.com/borisfaure/junit-parser" repository = "https://github.com/borisfaure/junit-parser"
[dependencies] [dependencies]
quick-xml = { version = "0.37.0", features = ["escape-html"] } quick-xml = { version = "0.36.0", features = ["escape-html"] }
thiserror = "2.0.0" thiserror = "1.0.61"
time = { version = "0.3.36", features = ["parsing", "serde-well-known"] } time = { version = "0.3.36", features = ["parsing", "serde-well-known"] }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }

View file

@ -2,9 +2,9 @@
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [ "extends": [
"config:best-practices", "config:best-practices",
":semanticCommitTypeAll(chore)", ":maintainLockFilesWeekly"
":preserveSemverRanges"
], ],
"semanticCommits": "enabled",
"automerge": true, "automerge": true,
"automergeStrategy": "squash", "automergeStrategy": "squash",
"osvVulnerabilityAlerts": true, "osvVulnerabilityAlerts": true,

View file

@ -11,13 +11,12 @@ use std::{
use async_zip::tokio::read::ZipEntryReader; use async_zip::tokio::read::ZipEntryReader;
use axum::{ use axum::{
body::Body, body::Body,
extract::{Query as XQuery, Request, State}, extract::{Host, Query as XQuery, Request, State},
http::{Response, Uri}, http::{Response, Uri},
response::{IntoResponse, Redirect}, response::{IntoResponse, Redirect},
routing::{any, get, post}, routing::{any, get, post},
Json, RequestExt, Router, Json, RequestExt, Router,
}; };
use axum_extra::extract::Host;
use futures_lite::AsyncReadExt as LiteAsyncReadExt; use futures_lite::AsyncReadExt as LiteAsyncReadExt;
use governor::{Quota, RateLimiter}; use governor::{Quota, RateLimiter};
use headers::{ContentType, HeaderMapExt}; use headers::{ContentType, HeaderMapExt};
@ -167,7 +166,7 @@ impl App {
Response::builder() Response::builder()
.typed_header(headers::ContentType::text_utf8()) .typed_header(headers::ContentType::text_utf8())
.cache() .cache()
.body::<Body>("# PLEASE dont scrape this website.\n# All of the data here is fetched from the public GitHub/Forgejo APIs, this app is open source and it is not running on some Fortune 500 company server. \n\nUser-agent: *\nDisallow: /\n".into()).unwrap() .body::<Body>("# PLEASE dont scrape this website.\n# All of the data here is fetched from the public GitHub/Gitea APIs, this app is open source and it is not running on some Fortune 500 company server. \n\nUser-agent: *\nDisallow: /\n".into()).unwrap()
})) }))
// Put the API in the .well-known folder, since it is disabled for pages // Put the API in the .well-known folder, since it is disabled for pages
.route("/.well-known/api/artifacts", get(Self::get_artifacts)) .route("/.well-known/api/artifacts", get(Self::get_artifacts))
@ -176,7 +175,7 @@ impl App {
.route("/.well-known/api/prComment", post(Self::pr_comment)) .route("/.well-known/api/prComment", post(Self::pr_comment))
// Prevent access to the .well-known folder since it enables abuse // Prevent access to the .well-known folder since it enables abuse
// (e.g. SSL certificate registration by an attacker) // (e.g. SSL certificate registration by an attacker)
.route("/.well-known/{*path}", any(|| async { Error::Inaccessible })) .route("/.well-known/*path", any(|| async { Error::Inaccessible }))
// Serve artifact pages // Serve artifact pages
.route("/", get(Self::get_page)) .route("/", get(Self::get_page))
.fallback(get(Self::get_page)) .fallback(get(Self::get_page))
@ -809,7 +808,7 @@ fn path_components(
let mut path_components = vec![ let mut path_components = vec![
LinkItem { LinkItem {
name: query.shortid(), name: query.shortid(),
url: format!("{main_url}/?url={run_url}"), url: format!("{}/?url={}", main_url, run_url),
}, },
LinkItem { LinkItem {
name: entry_name.to_owned(), name: entry_name.to_owned(),
@ -886,7 +885,7 @@ fn pr_comment_text(p: PrCommentTextParams) -> String {
_ = write!(&mut content, "\n\n Run [#{}]({}) · ", query.run, run_url); _ = write!(&mut content, "\n\n Run [#{}]({}) · ", query.run, run_url);
write_commit(&mut content, &p.run.head_sha); write_commit(&mut content, &p.run.head_sha);
if let Some(date_started) = &date_started { if let Some(date_started) = &date_started {
_ = write!(&mut content, " · {date_started} UTC"); _ = write!(&mut content, " · {} UTC", date_started);
} }
_ = content.write_str("\n\n"); _ = content.write_str("\n\n");
@ -929,7 +928,7 @@ fn pr_comment_text(p: PrCommentTextParams) -> String {
} }
if let Some(date_started) = &date_started { if let Some(date_started) = &date_started {
_ = write!(&mut prevln, " ({date_started} UTC)"); _ = write!(&mut prevln, " ({} UTC)", date_started);
} }
if np_content.is_some() || prev_builds.is_some() { if np_content.is_some() || prev_builds.is_some() {

View file

@ -7,7 +7,6 @@ use once_cell::sync::Lazy;
use quick_cache::sync::Cache as QuickCache; use quick_cache::sync::Cache as QuickCache;
use regex::Regex; use regex::Regex;
use reqwest::{Client, ClientBuilder, IntoUrl, RequestBuilder, Response, Url}; use reqwest::{Client, ClientBuilder, IntoUrl, RequestBuilder, Response, Url};
use scraper::Selector;
use secrecy::ExposeSecret; use secrecy::ExposeSecret;
use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde::{de::DeserializeOwned, Deserialize, Serialize};
use time::OffsetDateTime; use time::OffsetDateTime;
@ -90,11 +89,11 @@ impl GithubArtifact {
} }
impl ForgejoArtifact { impl ForgejoArtifact {
fn into_artifact(self, id: u64, query: QueryRef<'_>, run_id: u64) -> Artifact { fn into_artifact(self, id: u64, query: QueryRef<'_>) -> Artifact {
Artifact { Artifact {
download_url: format!( download_url: format!(
"https://{}/{}/{}/actions/runs/{}/artifacts/{}", "https://{}/{}/{}/actions/runs/{}/artifacts/{}",
query.host, query.user, query.repo, run_id, self.name query.host, query.user, query.repo, query.run, self.name
), ),
id, id,
name: self.name, name: self.name,
@ -366,61 +365,26 @@ impl ArtifactApi {
} }
async fn list_forgejo(&self, query: QueryRef<'_>) -> Result<Vec<Artifact>> { async fn list_forgejo(&self, query: QueryRef<'_>) -> Result<Vec<Artifact>> {
// Forgejo v13+ uses the globally unique Run ID for artifact downloads let url = format!(
// instead of the run index. It can be obtained from the repo-action-view element "https://{}/{}/{}/actions/runs/{}/artifacts",
// of the Forgejo website
let overview_url = format!(
"https://{}/{}/{}/actions/runs/{}",
query.host, query.user, query.repo, query.run query.host, query.user, query.repo, query.run
); );
let overview_html = self
.get_forgejo(overview_url) let resp = self
.get_forgejo(url)
.send() .send()
.await? .await?
.error_for_status()? .error_for_status()?
.text() .json::<ArtifactsWrap<ForgejoArtifact>>()
.await?; .await?;
let (run_id, artifacts_response) = { let artifacts = resp
let doc = scraper::Html::parse_document(&overview_html);
let run_id_elm = doc
.select(&Selector::parse("#repo-action-view").unwrap())
.next();
let run_id = run_id_elm
.and_then(|elm| elm.attr("data-run-id"))
.and_then(|run_id| run_id.parse::<u64>().ok())
.unwrap_or(query.run);
let artifacts_response = run_id_elm
.and_then(|elm| elm.attr("data-initial-artifacts-response"))
.map(serde_json::from_str::<ArtifactsWrap<ForgejoArtifact>>);
(run_id, artifacts_response)
};
let artifacts_response = if let Some(artifacts_response) = artifacts_response {
artifacts_response
.map_err(|e| Error::Other(format!("invalid artifacts_response: {e}").into()))?
} else {
let url = format!(
"https://{}/{}/{}/actions/runs/{}/artifacts",
query.host, query.user, query.repo, query.run
);
self.get_forgejo(url)
.send()
.await?
.error_for_status()?
.json::<ArtifactsWrap<ForgejoArtifact>>()
.await?
};
let artifacts = artifacts_response
.artifacts .artifacts
.into_iter() .into_iter()
.enumerate() .enumerate()
.map(|(i, a)| a.into_artifact(i as u64 + 1, query, run_id)) .map(|(i, a)| a.into_artifact(i as u64 + 1, query))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
Ok(artifacts) Ok(artifacts)
} }

View file

@ -5,7 +5,7 @@ use std::{
sync::Arc, sync::Arc,
}; };
use secrecy::SecretString; use secrecy::Secret;
use serde::Deserialize; use serde::Deserialize;
use crate::{ use crate::{
@ -49,9 +49,9 @@ pub struct ConfigData {
/// GitHub API token for downloading GitHub artifacts /// GitHub API token for downloading GitHub artifacts
/// ///
/// Using a fine-grained token with public read permissions is recommended. /// Using a fine-grained token with public read permissions is recommended.
pub github_token: Option<SecretString>, pub github_token: Option<Secret<String>>,
/// Forgejo/Gitea API tokens by host /// Forgejo/Gitea API tokens by host
pub forgejo_tokens: HashMap<String, SecretString>, pub forgejo_tokens: HashMap<String, Secret<String>>,
/// Number of artifact indexes to keep in memory /// Number of artifact indexes to keep in memory
pub mem_cache_size: usize, pub mem_cache_size: usize,
/// Get the client IP address from a HTTP request header /// Get the client IP address from a HTTP request header

View file

@ -164,8 +164,8 @@ impl RunQuery {
.ok_or(Error::BadRequest("no repository".into()))? .ok_or(Error::BadRequest("no repository".into()))?
.to_ascii_lowercase(); .to_ascii_lowercase();
if path_segs.next().is_none_or(|s| s != "actions") if !path_segs.next().is_some_and(|s| s == "actions")
|| path_segs.next().is_none_or(|s| s != "runs") || !path_segs.next().is_some_and(|s| s == "runs")
{ {
return Err(Error::BadRequest("invalid Actions URL".into())); return Err(Error::BadRequest("invalid Actions URL".into()));
} }
@ -402,7 +402,7 @@ impl<'de> Deserialize<'de> for QueryFilterList {
{ {
struct QueryFilterListVisitor; struct QueryFilterListVisitor;
impl Visitor<'_> for QueryFilterListVisitor { impl<'de> Visitor<'de> for QueryFilterListVisitor {
type Value = QueryFilterList; type Value = QueryFilterList;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
@ -505,7 +505,7 @@ mod tests {
assert!(empty.0.is_empty()); assert!(empty.0.is_empty());
let one = QueryFilterList::from_str("github.com/Theta-Dev/test.project").unwrap(); let one = QueryFilterList::from_str("github.com/Theta-Dev/test.project").unwrap();
assert_eq!(one.0, std::slice::from_ref(&exp1)); assert_eq!(one.0, [exp1.clone()]);
let two = QueryFilterList::from_str("github.com/Theta-Dev/test.project;code.thetadev.de") let two = QueryFilterList::from_str("github.com/Theta-Dev/test.project;code.thetadev.de")
.unwrap(); .unwrap();

View file

@ -217,7 +217,7 @@ impl<T> IgnoreFileNotFound for core::result::Result<T, std::io::Error> {
} }
} }
pub fn parse_url(input: &str) -> Result<(&str, std::str::Split<'_, char>)> { pub fn parse_url(input: &str) -> Result<(&str, std::str::Split<char>)> {
let s = input.trim(); let s = input.trim();
let s = s.strip_prefix("http://").unwrap_or(s); let s = s.strip_prefix("http://").unwrap_or(s);
let s = s.strip_prefix("https://").unwrap_or(s); let s = s.strip_prefix("https://").unwrap_or(s);

View file

@ -1,4 +1,4 @@
use std::{collections::HashMap, sync::Arc}; use std::{collections::HashMap, io::Write, sync::Arc};
use comrak::adapters::SyntaxHighlighterAdapter; use comrak::adapters::SyntaxHighlighterAdapter;
use syntect::{ use syntect::{
@ -45,7 +45,7 @@ impl Viewer for MarkdownViewer {
options.extension.multiline_block_quotes = true; options.extension.multiline_block_quotes = true;
options.extension.superscript = true; options.extension.superscript = true;
let mut plugins = comrak::options::Plugins::default(); let mut plugins = comrak::Plugins::default();
plugins.render.codefence_syntax_highlighter = Some(&self.adapter); plugins.render.codefence_syntax_highlighter = Some(&self.adapter);
let html = comrak::markdown_to_html_with_plugins(data, &options, &plugins); let html = comrak::markdown_to_html_with_plugins(data, &options, &plugins);
@ -61,10 +61,10 @@ struct SyntectAdapter {
impl SyntaxHighlighterAdapter for SyntectAdapter { impl SyntaxHighlighterAdapter for SyntectAdapter {
fn write_highlighted( fn write_highlighted(
&self, &self,
output: &mut dyn std::fmt::Write, output: &mut dyn Write,
lang: Option<&str>, lang: Option<&str>,
code: &str, code: &str,
) -> std::fmt::Result { ) -> std::io::Result<()> {
let fallback_syntax = "Plain Text"; let fallback_syntax = "Plain Text";
let lang: &str = match lang { let lang: &str = match lang {
@ -85,27 +85,27 @@ impl SyntaxHighlighterAdapter for SyntectAdapter {
.try_for_each(|line| html_generator.parse_html_for_line_which_includes_newline(line)) .try_for_each(|line| html_generator.parse_html_for_line_which_includes_newline(line))
{ {
tracing::error!("rendering md code: {e}"); tracing::error!("rendering md code: {e}");
return output.write_str(code); return output.write_all(code.as_bytes());
} }
let html = html_generator.finalize(); let html = html_generator.finalize();
output.write_str(&html) output.write_all(html.as_bytes())
} }
fn write_pre_tag( fn write_pre_tag(
&self, &self,
output: &mut dyn std::fmt::Write, output: &mut dyn Write,
_attributes: HashMap<&'static str, std::borrow::Cow<'_, str>>, _attributes: HashMap<String, String>,
) -> std::fmt::Result { ) -> std::io::Result<()> {
output.write_str("<pre>") output.write_all(b"<pre>")
} }
fn write_code_tag( fn write_code_tag(
&self, &self,
output: &mut dyn std::fmt::Write, output: &mut dyn Write,
_attributes: HashMap<&'static str, std::borrow::Cow<'_, str>>, _attributes: HashMap<String, String>,
) -> std::fmt::Result { ) -> std::io::Result<()> {
output.write_str("<code>") output.write_all(b"<code>")
} }
} }