Attempt at moving more logic to Repo (SEGFAULTS)

main
Jef Roosens 2022-01-11 16:08:11 +01:00
parent e0d22b195e
commit 9b1e6383e6
Signed by untrusted user: Jef Roosens
GPG Key ID: 955C0660072F691F
4 changed files with 43 additions and 19 deletions

View File

@ -1,6 +1,6 @@
.PHONY: run .PHONY: run
run: run:
API_KEY=test REPO_DIR=data LOG_LEVEL=DEBUG v run vieter API_KEY=test REPO_DIR=data LOG_LEVEL=DEBUG v -cg run vieter
.PHONY: watch .PHONY: watch
watch: watch:

View File

@ -14,9 +14,10 @@ const db_name = 'pieter.db.tar.gz'
struct App { struct App {
web.Context web.Context
pub:
api_key string [required; web_global] api_key string [required; web_global]
repo_dir string [required; web_global] pub mut:
repo shared repo.Repo [required] repo repo.Repo [required; web_global]
} }
[noreturn] [noreturn]
@ -91,9 +92,9 @@ fn main() {
web.run(&App{ web.run(&App{
logger: logger logger: logger
api_key: key api_key: key
repo_dir: repo_dir
repo: repo.Repo{ repo: repo.Repo{
path: os.join_path_single(repo_dir, db_name) dir: repo_dir
name: db_name
} }
}, port) }, port)
} }

View File

@ -2,12 +2,37 @@ module repo
import os import os
const pkgs_subpath = 'pkgs'
// Handles management of a repository. Package files are stored in '$dir/pkgs'
// & moved there if necessary.
pub struct Repo { pub struct Repo {
path string mutex shared int = 0
pub:
dir string [required]
name string [required]
}
// Returns path to the given package, prepended with the repo's path.
pub fn (r Repo) pkg_path(pkg string) string {
return os.join_path(r.dir, pkgs_subpath, pkg)
}
pub fn (r Repo) exists(pkg string) bool {
return os.exists(r.pkg_path(pkg))
}
// Returns the full path to the database file
pub fn (r Repo) db_path() string {
return os.join_path_single(r.dir, '${r.name}.tar.gz')
} }
pub fn (r Repo) add_package(pkg_path string) ? { pub fn (r Repo) add_package(pkg_path string) ? {
res := os.execute("repo-add '$r.path' '$pkg_path'") mut res := os.Result{}
lock r.mutex {
res = os.execute("repo-add '$r.db_path()' '$pkg_path'")
}
if res.exit_code != 0 { if res.exit_code != 0 {
println(res.output) println(res.output)

View File

@ -6,17 +6,18 @@ import repo
['/pkgs/:pkg'; put] ['/pkgs/:pkg'; put]
fn (mut app App) put_package(pkg string) web.Result { fn (mut app App) put_package(pkg string) web.Result {
full_path := os.join_path_single(app.repo_dir, pkg) if app.repo.exists(pkg) {
if os.exists(full_path) {
app.lwarn("Tried to upload duplicate package '$pkg'") app.lwarn("Tried to upload duplicate package '$pkg'")
return app.text('File already exists.') return app.text('File already exists.')
} }
pkg_path := app.repo.pkg_path(pkg)
if length := app.req.header.get(.content_length) { if length := app.req.header.get(.content_length) {
app.ldebug("Uploading $length bytes to package '$pkg'") app.ldebug("Uploading $length bytes to package '$pkg'")
reader_to_file(mut app.reader, length.int(), full_path) or { println(pkg_path)
reader_to_file(mut app.reader, length.int(), pkg_path) or {
app.lwarn("Failed to upload package '$pkg'") app.lwarn("Failed to upload package '$pkg'")
return app.text('Failed to upload file.') return app.text('Failed to upload file.')
@ -26,18 +27,15 @@ fn (mut app App) put_package(pkg string) web.Result {
return app.text("Content-Type header isn't set.") return app.text("Content-Type header isn't set.")
} }
lock app.repo { app.repo.add_package(pkg_path) or {
app.repo.add_package(full_path) or { app.linfo("Failed to add package '$pkg' to database.")
app.linfo("Failed to add package '$pkg' to database.")
os.rm(full_path) or { println('Failed to remove $full_path') } os.rm(pkg_path) or { println('Failed to remove $pkg_path') }
return app.text('Failed to add package to repo.') return app.text('Failed to add package to repo.')
}
app.linfo("Added '$pkg' to repository.")
} }
app.linfo("Added '$pkg' to repository.")
app.linfo("Uploaded package '$pkg'.") app.linfo("Uploaded package '$pkg'.")
return app.text('Package added successfully.') return app.text('Package added successfully.')