Merge pull request 'Release 0.1.0' (#65) from dev into main

Reviewed-on: Chewing_Bever/vieter#65
main 0.1.0
Jef Roosens 2022-02-02 13:59:52 +01:00
commit dec2e9d759
8 changed files with 62 additions and 32 deletions

View File

@ -0,0 +1,15 @@
# Deploys the newest development image to my server
branches: [dev]
platform: linux/amd64
depends_on:
- docker
skip_clone: true
pipeline:
webhook:
image: chewingbever/vlang:latest
secrets:
- webhook
commands:
- curl -XPOST -s "$WEBHOOK"

View File

@ -25,10 +25,9 @@ pipeline:
settings: settings:
base_url: https://git.rustybever.be base_url: https://git.rustybever.be
files: ${CI_COMMIT_SHA}/* files: ${CI_COMMIT_SHA}/*
checksums: checksum:
- md5 - md5
- sha256 - sha256
prerelease: true
title: ${CI_COMMIT_TAG} title: ${CI_COMMIT_TAG}
when: when:
event: tag event: tag

View File

@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased](https://git.rustybever.be/Chewing_Bever/vieter) ## [Unreleased](https://git.rustybever.be/Chewing_Bever/vieter)
## [0.1.0](https://git.rustybever.be/Chewing_Bever/vieter/src/tag/0.1.0)
### Changed
* Improved logging
## [0.1.0-rc.1](https://git.rustybever.be/Chewing_Bever/vieter/src/tag/0.1.0-rc.1)
### Added ### Added
* Ability to publish packages * Ability to publish packages

View File

@ -88,7 +88,8 @@ fn main() {
// This also creates the directories if needed // This also creates the directories if needed
repo := repo.new(repo_dir, pkg_dir) or { repo := repo.new(repo_dir, pkg_dir) or {
exit_with_message(1, 'Failed to create required directories.') logger.error(err.msg)
exit(1)
} }
os.mkdir_all(dl_dir) or { exit_with_message(1, 'Failed to create download directory.') } os.mkdir_all(dl_dir) or { exit_with_message(1, 'Failed to create download directory.') }

View File

@ -178,10 +178,15 @@ fn format_entry(key string, value string) string {
return '\n%$key%\n$value\n' return '\n%$key%\n$value\n'
} }
// full_name returns the properly formatted name for the package, including
// version & architecture
pub fn (pkg &Pkg) full_name() string {
p := pkg.info
return '$p.name-$p.version-$p.arch'
}
// filename returns the correct filename of the package file // filename returns the correct filename of the package file
pub fn (pkg &Pkg) filename() string { pub fn (pkg &Pkg) filename() string {
p := pkg.info
ext := match pkg.compression { ext := match pkg.compression {
0 { '.tar' } 0 { '.tar' }
1 { '.tar.gz' } 1 { '.tar.gz' }
@ -189,7 +194,7 @@ pub fn (pkg &Pkg) filename() string {
else { panic("Another compression code shouldn't be possible. Faulty code: $pkg.compression") } else { panic("Another compression code shouldn't be possible. Faulty code: $pkg.compression") }
} }
return '$p.name-$p.version-${p.arch}.pkg$ext' return '${pkg.full_name()}.pkg$ext'
} }
// to_desc returns a desc file valid string representation // to_desc returns a desc file valid string representation

View File

@ -3,12 +3,6 @@ module repo
import os import os
import package import package
// subpath where the uncompressed version of the files archive is stored
const files_subpath = 'files'
// subpath where the uncompressed version of the repo archive is stored
const repo_subpath = 'repo'
// Dummy struct to work around the fact that you can only share structs, maps & // Dummy struct to work around the fact that you can only share structs, maps &
// arrays // arrays
pub struct Dummy { pub struct Dummy {
@ -20,20 +14,26 @@ pub struct Repo {
mut: mut:
mutex shared Dummy mutex shared Dummy
pub: pub:
// Where to store repository files; should exist // Where to store repository files
repo_dir string [required] repo_dir string [required]
// Where to find packages; packages are expected to all be in the same directory // Where to find packages; packages are expected to all be in the same directory
pkg_dir string [required] pkg_dir string [required]
} }
pub struct RepoAddResult {
pub:
added bool [required]
pkg &package.Pkg [required]
}
// new creates a new Repo & creates the directories as needed // new creates a new Repo & creates the directories as needed
pub fn new(repo_dir string, pkg_dir string) ?Repo { pub fn new(repo_dir string, pkg_dir string) ?Repo {
if !os.is_dir(repo_dir) { if !os.is_dir(repo_dir) {
os.mkdir_all(repo_dir) or { return error('Failed to create repo directory.') } os.mkdir_all(repo_dir) or { return error('Failed to create repo directory: $err.msg') }
} }
if !os.is_dir(pkg_dir) { if !os.is_dir(pkg_dir) {
os.mkdir_all(pkg_dir) or { return error('Failed to create package directory.') } os.mkdir_all(pkg_dir) or { return error('Failed to create package directory: $err.msg') }
} }
return Repo{ return Repo{
@ -44,7 +44,7 @@ pub fn new(repo_dir string, pkg_dir string) ?Repo {
// add_from_path adds a package from an arbitrary path & moves it into the pkgs // add_from_path adds a package from an arbitrary path & moves it into the pkgs
// directory if necessary. // directory if necessary.
pub fn (r &Repo) add_from_path(pkg_path string) ?bool { pub fn (r &Repo) add_from_path(pkg_path string) ?RepoAddResult {
pkg := package.read_pkg(pkg_path) or { return error('Failed to read package file: $err.msg') } pkg := package.read_pkg(pkg_path) or { return error('Failed to read package file: $err.msg') }
added := r.add(pkg) ? added := r.add(pkg) ?
@ -59,7 +59,10 @@ pub fn (r &Repo) add_from_path(pkg_path string) ?bool {
} }
} }
return added return RepoAddResult{
added: added
pkg: &pkg
}
} }
// add adds a given Pkg to the repository // add adds a given Pkg to the repository

View File

@ -25,6 +25,8 @@ fn is_pkg_name(s string) bool {
return s.contains('.pkg') return s.contains('.pkg')
} }
// healthcheck just returns a string, but can be used to quickly check if the
// server is still responsive.
['/health'; get] ['/health'; get]
pub fn (mut app App) healthcheck() web.Result { pub fn (mut app App) healthcheck() web.Result {
return app.text('Healthy') return app.text('Healthy')
@ -62,7 +64,7 @@ fn (mut app App) put_package() web.Result {
pkg_path = os.join_path_single(app.dl_dir, rand.uuid_v4()) pkg_path = os.join_path_single(app.dl_dir, rand.uuid_v4())
} }
app.ldebug("Uploading $length (${pretty_bytes(length.int())}) bytes to '$pkg_path'.") app.ldebug("Uploading $length bytes (${pretty_bytes(length.int())}) to '$pkg_path'.")
// This is used to time how long it takes to upload a file // This is used to time how long it takes to upload a file
mut sw := time.new_stopwatch(time.StopWatchOptions{ auto_start: true }) mut sw := time.new_stopwatch(time.StopWatchOptions{ auto_start: true })
@ -80,28 +82,22 @@ fn (mut app App) put_package() web.Result {
return app.text("Content-Type header isn't set.") return app.text("Content-Type header isn't set.")
} }
added := app.repo.add_from_path(pkg_path) or { res := app.repo.add_from_path(pkg_path) or {
app.lerror('Error while adding package: $err.msg') app.lerror('Error while adding package: $err.msg')
os.rm(pkg_path) or { app.lerror("Failed to remove download '$pkg_path'.") } os.rm(pkg_path) or { app.lerror("Failed to remove download '$pkg_path': $err.msg") }
return app.text('Failed to add package.') return app.text('Failed to add package.')
} }
if !added { if !res.added {
os.rm(pkg_path) or { app.lerror("Failed to remove download '$pkg_path'.") } os.rm(pkg_path) or { app.lerror("Failed to remove download '$pkg_path': $err.msg") }
app.lwarn('Duplicate package.') app.lwarn("Duplicate package '$res.pkg.full_name()'.")
return app.text('File already exists.') return app.text('File already exists.')
} }
app.linfo("Added '$pkg_path' to repository.") app.linfo("Added '$res.pkg.full_name()' to repository.")
return app.text('Package added successfully.') return app.text('Package added successfully.')
} }
// add_package PUT a new package to the server
['/add'; put]
pub fn (mut app App) add_package() web.Result {
return app.text('')
}

View File

@ -511,8 +511,11 @@ fn handle_conn<T>(mut conn net.TcpConn, mut app T, routes map[string]Route) {
return return
} }
lock app.logger { // The healthcheck spams the logs, which isn't very useful
app.logger.debug('$head.method $head.url $head.version') if head.url != '/health' {
lock app.logger {
app.logger.debug('$head.method $head.url $head.version')
}
} }
// req := http.parse_request(mut reader) or { // req := http.parse_request(mut reader) or {