forked from vieter-v/vieter
				
			Attempt at moving more logic to Repo (SEGFAULTS)
							parent
							
								
									e0d22b195e
								
							
						
					
					
						commit
						9b1e6383e6
					
				
							
								
								
									
										2
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										2
									
								
								Makefile
								
								
								
								
							| 
						 | 
					@ -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:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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.')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue