36533f7c3f
Fixes for new geth version
101 lines
2.0 KiB
Go
101 lines
2.0 KiB
Go
package files
|
|
|
|
import (
|
|
"archive/tar"
|
|
"fmt"
|
|
"io"
|
|
"path"
|
|
"time"
|
|
)
|
|
|
|
type TarWriter struct {
|
|
TarW *tar.Writer
|
|
}
|
|
|
|
// NewTarWriter wraps given io.Writer into a new tar writer
|
|
func NewTarWriter(w io.Writer) (*TarWriter, error) {
|
|
return &TarWriter{
|
|
TarW: tar.NewWriter(w),
|
|
}, nil
|
|
}
|
|
|
|
func (w *TarWriter) writeDir(f Directory, fpath string) error {
|
|
if err := writeDirHeader(w.TarW, fpath); err != nil {
|
|
return err
|
|
}
|
|
|
|
it := f.Entries()
|
|
for it.Next() {
|
|
if err := w.WriteFile(it.Node(), path.Join(fpath, it.Name())); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return it.Err()
|
|
}
|
|
|
|
func (w *TarWriter) writeFile(f File, fpath string) error {
|
|
size, err := f.Size()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := writeFileHeader(w.TarW, fpath, uint64(size)); err != nil {
|
|
return err
|
|
}
|
|
|
|
if _, err := io.Copy(w.TarW, f); err != nil {
|
|
return err
|
|
}
|
|
w.TarW.Flush()
|
|
return nil
|
|
}
|
|
|
|
// WriteNode adds a node to the archive.
|
|
func (w *TarWriter) WriteFile(nd Node, fpath string) error {
|
|
switch nd := nd.(type) {
|
|
case *Symlink:
|
|
return writeSymlinkHeader(w.TarW, nd.Target, fpath)
|
|
case File:
|
|
return w.writeFile(nd, fpath)
|
|
case Directory:
|
|
return w.writeDir(nd, fpath)
|
|
default:
|
|
return fmt.Errorf("file type %T is not supported", nd)
|
|
}
|
|
}
|
|
|
|
// Close closes the tar writer.
|
|
func (w *TarWriter) Close() error {
|
|
return w.TarW.Close()
|
|
}
|
|
|
|
func writeDirHeader(w *tar.Writer, fpath string) error {
|
|
return w.WriteHeader(&tar.Header{
|
|
Name: fpath,
|
|
Typeflag: tar.TypeDir,
|
|
Mode: 0777,
|
|
ModTime: time.Now(),
|
|
// TODO: set mode, dates, etc. when added to unixFS
|
|
})
|
|
}
|
|
|
|
func writeFileHeader(w *tar.Writer, fpath string, size uint64) error {
|
|
return w.WriteHeader(&tar.Header{
|
|
Name: fpath,
|
|
Size: int64(size),
|
|
Typeflag: tar.TypeReg,
|
|
Mode: 0644,
|
|
ModTime: time.Now(),
|
|
// TODO: set mode, dates, etc. when added to unixFS
|
|
})
|
|
}
|
|
|
|
func writeSymlinkHeader(w *tar.Writer, target, fpath string) error {
|
|
return w.WriteHeader(&tar.Header{
|
|
Name: fpath,
|
|
Linkname: target,
|
|
Mode: 0777,
|
|
Typeflag: tar.TypeSymlink,
|
|
})
|
|
}
|