diff --git a/src/repo/repo.v b/src/repo/repo.v index d9ae06e3..bf5ab024 100644 --- a/src/repo/repo.v +++ b/src/repo/repo.v @@ -70,8 +70,12 @@ fn (r &RepoGroupManager) add_pkg_in_repo(repo string, pkg &package.Pkg) ?bool { if pkg.info.arch == "any" { repo_dir := os.join_path_single(r.data_dir, repo) - // We get a listing of all currently present arch-repos in the given repo - mut arch_repos := os.ls(repo_dir) ?.filter(os.is_dir(os.join_path_single(repo_dir, it))) + mut arch_repos := []string{} + + if os.exists(repo_dir) { + // We get a listing of all currently present arch-repos in the given repo + arch_repos = os.ls(repo_dir) ?.filter(os.is_dir(os.join_path_single(repo_dir, it))) + } if arch_repos.len == 0 { arch_repos << r.default_arch diff --git a/src/server/routes.v b/src/server/routes.v index 9d92192a..55964dbf 100644 --- a/src/server/routes.v +++ b/src/server/routes.v @@ -8,8 +8,6 @@ import rand import util import net.http -const default_repo = "vieter" - // healthcheck just returns a string, but can be used to quickly check if the // server is still responsive. ['/health'; get] @@ -17,15 +15,20 @@ pub fn (mut app App) healthcheck() web.Result { return app.text('Healthy') } -// get_root handles a GET request for a file on the root -['/:filename'; get; head] -fn (mut app App) get_root(filename string) web.Result { +['/:repo/:arch/:filename'; get; head] +fn (mut app App) get_repo_file(repo string, arch string, filename string) web.Result { mut full_path := '' - if filename.ends_with('.db') || filename.ends_with('.files') { - full_path = os.join_path_single(app.repo.data_dir, '${filename}.tar.gz') - } else if filename.ends_with('.db.tar.gz') || filename.ends_with('.files.tar.gz') { - full_path = os.join_path_single(app.repo.data_dir, '$filename') + db_exts := ['.db', '.files', '.db.tar.gz', '.files.tar.gz'] + + if db_exts.any(filename.ends_with(it)) { + full_path = os.join_path(app.repo.data_dir, repo, arch, filename) + + // repo-add does this using symlinks, but we just change the requested + // path + if !full_path.ends_with('.tar.gz') { + full_path += '.tar.gz' + } } else { full_path = os.join_path_single(app.repo.pkg_dir, filename) } @@ -42,8 +45,8 @@ fn (mut app App) get_root(filename string) web.Result { return app.file(full_path) } -['/publish'; post] -fn (mut app App) put_package() web.Result { +['/:repo/publish'; post] +fn (mut app App) put_package(repo string) web.Result { if !app.is_authorized() { return app.text('Unauthorized.') } @@ -76,7 +79,7 @@ fn (mut app App) put_package() web.Result { return app.text("Content-Type header isn't set.") } - res := app.repo.add_pkg_from_path(default_repo, pkg_path) or { + res := app.repo.add_pkg_from_path(repo, pkg_path) or { app.lerror('Error while adding package: $err.msg') os.rm(pkg_path) or { app.lerror("Failed to remove download '$pkg_path': $err.msg") } diff --git a/test.py b/test.py index cb817b7e..9b0116ec 100644 --- a/test.py +++ b/test.py @@ -97,7 +97,7 @@ async def upload_random_package(tar_path, sem): async with sem: with open(tar_path, 'rb') as f: async with aiohttp.ClientSession() as s: - async with s.post("http://localhost:8000/publish", data=f.read(), headers={"x-api-key": "test"}) as r: + async with s.post("http://localhost:8000/vieter/publish", data=f.read(), headers={"x-api-key": "test"}) as r: return await check_output(r)