siva stand for seekable indexed verifiable archiver
siva is archive format very similar to tar or zip, focused on allowing: constant-time random file access, seekable access to the contained files and concatenable archive files
The library implements a very similar API to the go tar package, allowing full control over and low level access to the contained files.
The recommended way to install siva
go get -u gopkg.in/src-d/go-siva.v1/...
Creating a siva file:
// Create a buffer to write our archive to.
buf := new(bytes.Buffer)
// Create a new siva archive.
w := siva.NewWriter(buf)
// Add some files to the archive.
var files = []struct {
Name, Body string
}{
{"readme.txt", "This archive contains some text files."},
{"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},
{"todo.txt", "Get animal handling license."},
}
for _, file := range files {
hdr := &siva.Header{
Name: file.Name,
Mode: 0600,
ModTime: time.Now(),
}
if err := w.WriteHeader(hdr); err != nil {
log.Fatalln(err)
}
if _, err := w.Write([]byte(file.Body)); err != nil {
log.Fatalln(err)
}
}
// Make sure to check the error on Close.
if err := w.Close(); err != nil {
log.Fatalln(err)
}
Reading from a siva file:
// Open the siva archive for reading.
file := bytes.NewReader(buf.Bytes())
r := siva.NewReader(file)
// Get all the files in the siva file.
i, err := r.Index()
if err != nil {
log.Fatalln(err)
}
// Iterate through the files in the archive.
for _, e := range i {
content, err := r.Get(e)
if err != nil {
log.Fatalln(err)
}
fmt.Printf("Contents of %s:\n", e.Name)
if _, err := io.Copy(os.Stdout, content); err != nil {
log.Fatalln(err)
}
fmt.Println()
}
siva cli interface, is a convenient command that helps you to creates and manipulates siva files.
Output from: ./siva --help
:
Usage:
siva [OPTIONS] <command>
Help Options:
-h, --help Show this help message
Available commands:
list List the items contained on a file.
pack Create a new archive containing the specified items.
unpack Extract to disk from the archive.
version Show the version information.
- The
Index Signature
is specified as a sequence of 3 bytes. Go uses byte as an alias for uint8. File Mode
in anIndex entry
, see issue.- This implementation left in the client of the library side the task of check the integrity of the file contents. It just checks for the
Index
integrity.
MIT, see LICENSE