// Copyright (C) 2023-2024 Umorpha Systems // SPDX-License-Identifier: AGPL-3.0-or-later package source import ( "archive/tar" "bytes" "embed" "io" "path" "sort" "strings" ) func readFile(fs embed.FS, filename string) []byte { // No need to bother checking for errors--an embed.FS will // never have an error other than "file does not exist", and // it's a programming error (not a runtime error) to call this // function for a file that doesn't exist. fh, _ := fs.Open(filename) ret, _ := io.ReadAll(fh) _ = fh.Close() return ret } func genTar(fn func(w *tar.Writer)) []byte { var buf bytes.Buffer w := tar.NewWriter(&buf) fn(w) _ = w.Close() return buf.Bytes() } func tarDir(w *tar.Writer, fs embed.FS, fsDir, tarPrefix string) { w.WriteHeader(&tar.Header{ Typeflag: tar.TypeDir, Name: tarPrefix, Mode: 0755, }) entries, _ := fs.ReadDir(fsDir) var names []string for _, entry := range entries { name := entry.Name() if entry.IsDir() { name += "/" } names = append(names, name) } sort.Strings(names) for _, name := range names { fpath := path.Join(fsDir, name) if strings.HasSuffix(name, "/") { tarDir(w, fs, fpath, tarPrefix+name) } else { fb := readFile(fs, fpath) w.WriteHeader(&tar.Header{ Typeflag: tar.TypeReg, Name: tarPrefix + name, Size: int64(len(fb)), Mode: 0644, }) _, _ = w.Write(fb) } } } var Tarball = genTar(func(w *tar.Writer) { tarDir(w, fs, ".", "eclipse/") })