tar2go implements are go fs.FS for tar files.
Tars are not indexed so by themselves don't really have support for random access. When a request to open/stat a file is made tar2go will scan through the tar, indexing each entry along the way, until the file is found in the tar. A tar file is only ever scanned 1 time and scanning is done lazily (as needed to index the requested entry).
tar2go does not support modifying a tar file, however there is support for modifying the in-memory representation of the tar which will show up in the fs.FS
.
You can also write a new tar file with requested modifications.
f, _ := os.Open(p)
defer f.Close()
// Entrypoint into this library
idx := NewIndex(f)
// Get the `fs.FS` implementation
goFS := idx.FS()
// Do stuff with your fs
// ...
// Add or replace a file in the index
_ := idx.Replace("foo", strings.NewReader("random stuff")
data, _ := fs.ReadFile(goFS, "foo")
if string(data) != "random stuff") {
panic("unexpected data")
}
// Delete a file in the index
_ := idx.Replace("foo", nil)
if _, err := fs.ReadFile(goFS, "foo"); !errors.Is(err, fs.ErrNotExist) {
panic(err)
}
// Create a new tar with updated content
// First we need to create an `io.Writer`, which is where the updated tar stream will be written to.
f, _ := os.CreateTemp("", "updated")
idx.Update(f, func(name string, rdr ReaderAtSized) (ReaderAtSized, bool, error) {
// Update calls this function for every file in the tar
// The returned `ReaderAtSized` is used instead of the content passed in (rdr).
// To make no changes just return the same rdr back.
// Return true for the bool value if the content is changed.
})