forked from vieter-v/vieter
				
			Added creation of files archive
							parent
							
								
									2e344eecc7
								
							
						
					
					
						commit
						e26e2746de
					
				|  | @ -93,55 +93,3 @@ fn (r &Repo) add(pkg &package.Pkg) ?bool { | ||||||
| fn (r &Repo) pkg_path(pkg &package.Pkg) string { | fn (r &Repo) pkg_path(pkg &package.Pkg) string { | ||||||
| 	return os.join_path(r.repo_dir, '$pkg.info.name-$pkg.info.version') | 	return os.join_path(r.repo_dir, '$pkg.info.name-$pkg.info.version') | ||||||
| } | } | ||||||
| 
 |  | ||||||
| // Re-generate the repo archive files |  | ||||||
| fn (r &Repo) sync() ? { |  | ||||||
|     // TODO also write files archive |  | ||||||
| 	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) |  | ||||||
| 
 |  | ||||||
|         // TODO add symlink to .tar.gz version |  | ||||||
| 		repo_path := os.join_path_single(r.repo_dir, 'repo.db') |  | ||||||
| 
 |  | ||||||
| 		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) |  | ||||||
| 
 |  | ||||||
| 			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_write_close(a) |  | ||||||
| 		C.archive_write_free(a) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | @ -0,0 +1,80 @@ | ||||||
|  | module repo | ||||||
|  | 
 | ||||||
|  | import os | ||||||
|  | 
 | ||||||
|  | fn archive_add_entry(archive &C.archive, entry &C.archive_entry, file_path &string, inner_path &string) { | ||||||
|  | 	st := C.stat{} | ||||||
|  | 
 | ||||||
|  | 	unsafe { | ||||||
|  | 		C.stat(&char(file_path.str), &st) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	C.archive_entry_set_pathname(entry, &char(inner_path.str)) | ||||||
|  | 	C.archive_entry_copy_stat(entry, &st) | ||||||
|  | 	C.archive_write_header(archive, entry) | ||||||
|  | 
 | ||||||
|  | 	mut fd := C.open(&char(file_path.str), C.O_RDONLY) | ||||||
|  | 	defer { | ||||||
|  | 		C.close(fd) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Write the file to the archive | ||||||
|  | 	buf := [8192]byte{} | ||||||
|  | 	mut len := C.read(fd, &buf, sizeof(buf)) | ||||||
|  | 
 | ||||||
|  | 	for len > 0 { | ||||||
|  | 		C.archive_write_data(archive, &buf, len) | ||||||
|  | 
 | ||||||
|  | 		len = C.read(fd, &buf, sizeof(buf)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Re-generate the repo archive files | ||||||
|  | fn (r &Repo) sync() ? { | ||||||
|  | 	// TODO also write files archive | ||||||
|  | 	lock r.mutex { | ||||||
|  | 		a_db := C.archive_write_new() | ||||||
|  | 		a_files := C.archive_write_new() | ||||||
|  | 
 | ||||||
|  | 		entry := C.archive_entry_new() | ||||||
|  | 
 | ||||||
|  | 		// This makes the archive a gzip-compressed tarball | ||||||
|  | 		C.archive_write_add_filter_gzip(a_db) | ||||||
|  | 		C.archive_write_set_format_pax_restricted(a_db) | ||||||
|  | 		C.archive_write_add_filter_gzip(a_files) | ||||||
|  | 		C.archive_write_set_format_pax_restricted(a_files) | ||||||
|  | 
 | ||||||
|  | 		// TODO add symlink to .tar.gz version | ||||||
|  | 		db_path := os.join_path_single(r.repo_dir, 'repo.db') | ||||||
|  | 		files_path := os.join_path_single(r.repo_dir, 'repo.files') | ||||||
|  | 
 | ||||||
|  | 		C.archive_write_open_filename(a_db, &char(db_path.str)) | ||||||
|  | 		C.archive_write_open_filename(a_files, &char(files_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))) { | ||||||
|  | 			// desc | ||||||
|  | 			mut inner_path := os.join_path_single(d, 'desc') | ||||||
|  | 			mut actual_path := os.join_path_single(r.repo_dir, inner_path) | ||||||
|  | 
 | ||||||
|  | 			archive_add_entry(a_db, entry, actual_path, inner_path) | ||||||
|  | 			archive_add_entry(a_files, entry, actual_path, inner_path) | ||||||
|  | 
 | ||||||
|  | 			C.archive_entry_clear(entry) | ||||||
|  | 
 | ||||||
|  | 			// files | ||||||
|  | 			inner_path = os.join_path_single(d, 'files') | ||||||
|  | 			actual_path = os.join_path_single(r.repo_dir, inner_path) | ||||||
|  | 
 | ||||||
|  | 			archive_add_entry(a_files, entry, actual_path, inner_path) | ||||||
|  | 
 | ||||||
|  | 			C.archive_entry_clear(entry) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		C.archive_write_close(a_db) | ||||||
|  | 		C.archive_write_free(a_db) | ||||||
|  | 		C.archive_write_close(a_files) | ||||||
|  | 		C.archive_write_free(a_files) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -76,16 +76,12 @@ fn (mut app App) put_package() web.Result { | ||||||
| 	added := app.repo.add_from_path(pkg_path) or { | 	added := 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 { | 		os.rm(pkg_path) or { app.lerror("Failed to remove download '$pkg_path'.") } | ||||||
|             app.lerror("Failed to remove download '$pkg_path'.") |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
| 		return app.text('Failed to add package.') | 		return app.text('Failed to add package.') | ||||||
| 	} | 	} | ||||||
| 	if !added { | 	if !added { | ||||||
|         os.rm(pkg_path) or { | 		os.rm(pkg_path) or { app.lerror("Failed to remove download '$pkg_path'.") } | ||||||
|             app.lerror("Failed to remove download '$pkg_path'.") |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
| 		app.lwarn('Duplicate package.') | 		app.lwarn('Duplicate package.') | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue