forked from vieter-v/vieter
				
			Failed attempt at fixing memory bug
							parent
							
								
									01d961f68e
								
							
						
					
					
						commit
						f1a17cab22
					
				| 
						 | 
				
			
			@ -126,6 +126,7 @@ pub fn read_pkg(pkg_path string) ?Pkg {
 | 
			
		|||
 | 
			
		||||
	mut buf := voidptr(0)
 | 
			
		||||
	mut files := []string{}
 | 
			
		||||
	mut pkg_info := PkgInfo{}
 | 
			
		||||
 | 
			
		||||
	for C.archive_read_next_header(a, &entry) == C.ARCHIVE_OK {
 | 
			
		||||
		pathname := C.archive_entry_pathname(entry)
 | 
			
		||||
| 
						 | 
				
			
			@ -142,14 +143,21 @@ pub fn read_pkg(pkg_path string) ?Pkg {
 | 
			
		|||
 | 
			
		||||
			// TODO can this unsafe block be avoided?
 | 
			
		||||
			buf = unsafe { malloc(size) }
 | 
			
		||||
			C.archive_read_data(a, voidptr(buf), size)
 | 
			
		||||
			C.archive_read_data(a, buf, size)
 | 
			
		||||
 | 
			
		||||
			unsafe {
 | 
			
		||||
				println(cstring_to_vstring(buf))
 | 
			
		||||
			}
 | 
			
		||||
			pkg_info = parse_pkg_info_string(unsafe { cstring_to_vstring(buf) }) ?
 | 
			
		||||
 | 
			
		||||
			unsafe {
 | 
			
		||||
				free(buf)
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			C.archive_read_data_skip(a)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mut pkg_info := parse_pkg_info_string(unsafe { cstring_to_vstring(&char(buf)) }) ?
 | 
			
		||||
 | 
			
		||||
	pkg_info.csize = i64(os.file_size(pkg_path))
 | 
			
		||||
 | 
			
		||||
	return Pkg{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										75
									
								
								src/repo.v
								
								
								
								
							
							
						
						
									
										75
									
								
								src/repo.v
								
								
								
								
							| 
						 | 
				
			
			@ -45,7 +45,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
 | 
			
		||||
// directory if necessary.
 | 
			
		||||
pub fn (r &Repo) add_from_path(pkg_path string) ?bool {
 | 
			
		||||
	pkg := package.read_pkg(pkg_path) or { return error('Failed to read package file.') }
 | 
			
		||||
	pkg := package.read_pkg(pkg_path) or { return error('Failed to read package file: $err.msg') }
 | 
			
		||||
 | 
			
		||||
	added := r.add(pkg) ?
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -96,47 +96,50 @@ fn (r &Repo) pkg_path(pkg &package.Pkg) string {
 | 
			
		|||
 | 
			
		||||
// Re-generate the repo archive files
 | 
			
		||||
fn (r &Repo) sync() ? {
 | 
			
		||||
	a := C.archive_write_new()
 | 
			
		||||
	entry := C.archive_entry_new()
 | 
			
		||||
	st := C.stat{}
 | 
			
		||||
	buf := [8192]byte{}
 | 
			
		||||
	lock r.mutex {
 | 
			
		||||
		a := C.archive_write_new()
 | 
			
		||||
		entry := C.archive_entry_new()
 | 
			
		||||
		st := C.stat{}
 | 
			
		||||
		buf := [8192]byte{}
 | 
			
		||||
 | 
			
		||||
	// This makes the archive a gzip-compressed tarball
 | 
			
		||||
	C.archive_write_add_filter_gzip(a)
 | 
			
		||||
	C.archive_write_set_format_pax_restricted(a)
 | 
			
		||||
		// This makes the archive a gzip-compressed tarball
 | 
			
		||||
		C.archive_write_add_filter_gzip(a)
 | 
			
		||||
		C.archive_write_set_format_pax_restricted(a)
 | 
			
		||||
 | 
			
		||||
	repo_path := os.join_path_single(r.repo_dir, 'repo.db')
 | 
			
		||||
		repo_path := os.join_path_single(r.repo_dir, 'repo.db')
 | 
			
		||||
 | 
			
		||||
	C.archive_write_open_filename(a, &char(repo_path.str))
 | 
			
		||||
		C.archive_write_open_filename(a, &char(repo_path.str))
 | 
			
		||||
 | 
			
		||||
	// Iterate over each directory
 | 
			
		||||
	for d in os.ls(r.repo_dir) ?.filter(os.is_dir(os.join_path_single(r.repo_dir, it))) {
 | 
			
		||||
		inner_path := os.join_path_single(d, 'desc')
 | 
			
		||||
		actual_path := os.join_path_single(r.repo_dir, inner_path)
 | 
			
		||||
		// Iterate over each directory
 | 
			
		||||
		for d in os.ls(r.repo_dir) ?.filter(os.is_dir(os.join_path_single(r.repo_dir,
 | 
			
		||||
			it))) {
 | 
			
		||||
			inner_path := os.join_path_single(d, 'desc')
 | 
			
		||||
			actual_path := os.join_path_single(r.repo_dir, inner_path)
 | 
			
		||||
 | 
			
		||||
		unsafe {
 | 
			
		||||
			C.stat(&char(actual_path.str), &st)
 | 
			
		||||
			unsafe {
 | 
			
		||||
				C.stat(&char(actual_path.str), &st)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			C.archive_entry_set_pathname(entry, &char(inner_path.str))
 | 
			
		||||
			C.archive_entry_copy_stat(entry, &st)
 | 
			
		||||
			// C.archive_entry_set_size(entry, st.st_size)
 | 
			
		||||
			// C.archive_entry_set_filetype(entry, C.AE_IFREG)
 | 
			
		||||
			// C.archive_entry_set_perm(entry, 0o644)
 | 
			
		||||
			C.archive_write_header(a, entry)
 | 
			
		||||
 | 
			
		||||
			fd := C.open(&char(actual_path.str), C.O_RDONLY)
 | 
			
		||||
			mut len := C.read(fd, &buf, sizeof(buf))
 | 
			
		||||
 | 
			
		||||
			for len > 0 {
 | 
			
		||||
				C.archive_write_data(a, &buf, len)
 | 
			
		||||
				len = C.read(fd, &buf, sizeof(buf))
 | 
			
		||||
			}
 | 
			
		||||
			C.close(fd)
 | 
			
		||||
 | 
			
		||||
			C.archive_entry_clear(entry)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		C.archive_entry_set_pathname(entry, &char(inner_path.str))
 | 
			
		||||
		C.archive_entry_copy_stat(entry, &st)
 | 
			
		||||
		// C.archive_entry_set_size(entry, st.st_size)
 | 
			
		||||
		// C.archive_entry_set_filetype(entry, C.AE_IFREG)
 | 
			
		||||
		// C.archive_entry_set_perm(entry, 0o644)
 | 
			
		||||
		C.archive_write_header(a, entry)
 | 
			
		||||
 | 
			
		||||
		fd := C.open(&char(actual_path.str), C.O_RDONLY)
 | 
			
		||||
		mut len := C.read(fd, &buf, sizeof(buf))
 | 
			
		||||
 | 
			
		||||
		for len > 0 {
 | 
			
		||||
			C.archive_write_data(a, &buf, len)
 | 
			
		||||
			len = C.read(fd, &buf, sizeof(buf))
 | 
			
		||||
		}
 | 
			
		||||
		C.close(fd)
 | 
			
		||||
 | 
			
		||||
		C.archive_entry_clear(entry)
 | 
			
		||||
		C.archive_write_close(a)
 | 
			
		||||
		C.archive_write_free(a)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	C.archive_write_close(a)
 | 
			
		||||
	C.archive_write_free(a)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -74,7 +74,7 @@ fn (mut app App) put_package() web.Result {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	added := app.repo.add_from_path(pkg_path) or {
 | 
			
		||||
		app.lerror('Error while adding package.')
 | 
			
		||||
		app.lerror('Error while adding package: $err.msg')
 | 
			
		||||
 | 
			
		||||
		return app.text('Failed to add package.')
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue