forked from vieter-v/vieter
First working version of creating archive
parent
a37d40d278
commit
b6e9fa5b02
|
@ -51,6 +51,15 @@ fn C.archive_write_open_filename(&C.archive, &char)
|
|||
// Write an entry to the archive file
|
||||
fn C.archive_write_header(&C.archive, &C.archive_entry)
|
||||
|
||||
// Write the data in the buffer to the archive
|
||||
fn C.archive_write_data(&C.archive, voidptr, int)
|
||||
|
||||
// Close an archive for writing
|
||||
fn C.archive_write_close(&C.archive)
|
||||
|
||||
// Free the write archive
|
||||
fn C.archive_write_free(&C.archive)
|
||||
|
||||
#include "archive_entry.h"
|
||||
|
||||
struct C.archive_entry {}
|
||||
|
@ -79,6 +88,12 @@ fn C.archive_entry_set_filetype(&C.archive_entry, u32)
|
|||
// Sets the file permissions for an entry
|
||||
fn C.archive_entry_set_perm(&C.archive_entry, int)
|
||||
|
||||
// Clears out an entry struct
|
||||
fn C.archive_entry_clear(&C.archive_entry)
|
||||
|
||||
// Copy over a stat struct to the archive entry
|
||||
fn C.archive_entry_copy_stat(&C.archive_entry, &C.stat)
|
||||
|
||||
#include <string.h>
|
||||
|
||||
// Compare two C strings; 0 means they're equal
|
||||
|
|
52
src/repo.v
52
src/repo.v
|
@ -59,7 +59,7 @@ pub fn (r &Repo) add_from_path(pkg_path string) ?bool {
|
|||
}
|
||||
}
|
||||
|
||||
return true
|
||||
return added
|
||||
}
|
||||
|
||||
// add adds a given Pkg to the repository
|
||||
|
@ -83,7 +83,8 @@ fn (r &Repo) add(pkg &package.Pkg) ?bool {
|
|||
|
||||
return error('Failed to write files file.')
|
||||
}
|
||||
// TODO generate database archive
|
||||
|
||||
r.sync() ?
|
||||
|
||||
return true
|
||||
}
|
||||
|
@ -92,3 +93,50 @@ fn (r &Repo) add(pkg &package.Pkg) ?bool {
|
|||
fn (r &Repo) pkg_path(pkg &package.Pkg) string {
|
||||
return os.join_path(r.repo_dir, '$pkg.info.name-$pkg.info.version')
|
||||
}
|
||||
|
||||
// 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{}
|
||||
|
||||
// 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')
|
||||
|
||||
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)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue