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
|
// Write an entry to the archive file
|
||||||
fn C.archive_write_header(&C.archive, &C.archive_entry)
|
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"
|
#include "archive_entry.h"
|
||||||
|
|
||||||
struct C.archive_entry {}
|
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
|
// Sets the file permissions for an entry
|
||||||
fn C.archive_entry_set_perm(&C.archive_entry, int)
|
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>
|
#include <string.h>
|
||||||
|
|
||||||
// Compare two C strings; 0 means they're equal
|
// 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
|
// 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.')
|
return error('Failed to write files file.')
|
||||||
}
|
}
|
||||||
// TODO generate database archive
|
|
||||||
|
r.sync() ?
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -92,3 +93,50 @@ 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() ? {
|
||||||
|
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