packager.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package packager
  2. import (
  3. "archive/zip"
  4. "bytes"
  5. "io/fs"
  6. "os"
  7. "path"
  8. )
  9. type Packager struct {
  10. wp string // working path
  11. manifest string // manifest file path
  12. }
  13. func NewPackager(plugin_path string) *Packager {
  14. return &Packager{
  15. wp: plugin_path,
  16. manifest: "manifest.yaml",
  17. }
  18. }
  19. func (p *Packager) Pack() ([]byte, error) {
  20. // read manifest
  21. _, err := p.fetchManifest()
  22. if err != nil {
  23. return nil, err
  24. }
  25. zip_buffer := new(bytes.Buffer)
  26. zip_writer := zip.NewWriter(zip_buffer)
  27. err = fs.WalkDir(os.DirFS(p.wp), ".", func(root_path string, d fs.DirEntry, err error) error {
  28. if err != nil {
  29. return err
  30. }
  31. if d.IsDir() {
  32. return nil
  33. }
  34. file, err := os.ReadFile(path.Join(p.wp, root_path))
  35. if err != nil {
  36. return err
  37. }
  38. zip_file, err := zip_writer.Create(root_path)
  39. if err != nil {
  40. return err
  41. }
  42. _, err = zip_file.Write(file)
  43. if err != nil {
  44. return err
  45. }
  46. return nil
  47. })
  48. if err != nil {
  49. return nil, err
  50. }
  51. err = zip_writer.Close()
  52. if err != nil {
  53. return nil, err
  54. }
  55. return zip_buffer.Bytes(), nil
  56. }