vessel.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package vessel
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. )
  7. // Open tries to open the file at src as a vessel.Bundle
  8. func Open(src string) (*Bundle, error) {
  9. r, err := os.Open(src)
  10. if err != nil {
  11. return nil, err
  12. }
  13. b := &Bundle{
  14. file: r,
  15. }
  16. err = b.tryLoadEmbeddedBundle()
  17. if err != nil {
  18. b.Close()
  19. return nil, err
  20. }
  21. return b, nil
  22. }
  23. // Create attaches a src file to a dest to create a vessel bundle
  24. func Create(dst, src string, overWrite bool) (*Bundle, error) {
  25. b, err := Open(dst)
  26. if err == nil {
  27. truncateAt := b.offset
  28. b.Close()
  29. if !overWrite {
  30. return nil, fmt.Errorf("already a bundle")
  31. }
  32. err = os.Truncate(dst, truncateAt)
  33. if err != nil {
  34. return nil, err
  35. }
  36. }
  37. err = concatenate(dst, src)
  38. if err != nil {
  39. return nil, err
  40. }
  41. return Open(dst)
  42. }
  43. // Create attaches a src file to a dest to create a vessel bundle
  44. func Build(dst, src string, overWrite bool, filter func(file string) bool) (*Bundle, error) {
  45. b, err := Open(dst)
  46. if err == nil {
  47. truncateAt := b.offset
  48. b.Close()
  49. if !overWrite {
  50. return nil, fmt.Errorf("already a bundle")
  51. }
  52. err = os.Truncate(dst, truncateAt)
  53. if err != nil {
  54. return nil, err
  55. }
  56. }
  57. file, err := ioutil.TempFile("./", "build.zip")
  58. if err != nil {
  59. return nil, err
  60. }
  61. defer os.Remove(file.Name())
  62. err = packInto(file, src, filter)
  63. if err != nil {
  64. return nil, err
  65. }
  66. err = concatenate(dst, file.Name())
  67. if err != nil {
  68. return nil, err
  69. }
  70. return Open(dst)
  71. }
  72. // Self returns a bundle that is embedded in the binary executable
  73. func Self() (*Bundle, error) {
  74. ename, err := os.Executable()
  75. if err != nil {
  76. panic(err)
  77. }
  78. return Open(ename)
  79. }