PackageManager just because
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
1.8 KiB

  1. package Archive
  2. import (
  3. "archive/tar"
  4. "compress/gzip"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. )
  10. func Gzip(source, target string) error {
  11. var (
  12. reader, writer *os.File
  13. archiver *gzip.Writer
  14. filename string
  15. e error
  16. )
  17. reader, e = os.Open(source)
  18. if e != nil {
  19. return e
  20. }
  21. //filename = filepath.Base(source)
  22. //target = filepath.Join(target, fmt.Sprintf("%s.gz", filename))
  23. writer, e = os.Create(target)
  24. if e != nil {
  25. return e
  26. }
  27. defer writer.Close()
  28. archiver = gzip.NewWriter(writer)
  29. archiver.Name = filename
  30. defer archiver.Close()
  31. _, e = io.Copy(archiver, reader)
  32. return e
  33. }
  34. func Tar(source, target string) error {
  35. var (
  36. tarfile, file *os.File
  37. tarball *tar.Writer
  38. header *tar.Header
  39. e error
  40. )
  41. tarfile, e = os.Create(target)
  42. if e != nil {
  43. return e
  44. }
  45. defer tarfile.Close()
  46. tarball = tar.NewWriter(tarfile)
  47. defer tarball.Close()
  48. return filepath.Walk(source,
  49. func(path string, info os.FileInfo, e error) error {
  50. if e != nil {
  51. return e
  52. }
  53. header, e = tar.FileInfoHeader(info, info.Name())
  54. if e != nil {
  55. return e
  56. }
  57. // TODO change "/" to work cross platform
  58. header.Name = strings.TrimPrefix(strings.TrimPrefix(path, source), "/")
  59. if header.Name == "" {
  60. return nil
  61. }
  62. e = tarball.WriteHeader(header)
  63. if e != nil {
  64. return e
  65. }
  66. if info.IsDir() {
  67. return nil
  68. }
  69. file, e = os.Open(path)
  70. if e != nil {
  71. return e
  72. }
  73. defer file.Close()
  74. _, e = io.Copy(tarball, file)
  75. return e
  76. })
  77. }
  78. func TarGzip(source, target string) error {
  79. var (
  80. tarPath string = strings.ReplaceAll(target, ".gz", "")
  81. e error
  82. )
  83. e = Tar(source, tarPath)
  84. if e != nil {
  85. return e
  86. }
  87. e = Gzip(tarPath, target)
  88. if e != nil {
  89. return e
  90. }
  91. return os.Remove(tarPath)
  92. }