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.

90 lines
1.6 KiB

  1. package Archive
  2. import (
  3. "archive/tar"
  4. "compress/gzip"
  5. "io"
  6. "os"
  7. "strings"
  8. )
  9. func CreateArchive(files []string, target string) error {
  10. var (
  11. outFile *os.File
  12. gzipWriter *gzip.Writer
  13. tarWriter *tar.Writer
  14. file string
  15. e error
  16. )
  17. // Create output file
  18. outFile, e = os.Create(target)
  19. if e != nil {
  20. return e
  21. }
  22. defer outFile.Close()
  23. gzipWriter = gzip.NewWriter(outFile)
  24. defer gzipWriter.Close()
  25. tarWriter = tar.NewWriter(gzipWriter)
  26. defer tarWriter.Close()
  27. // Iterate over files and add them to the tar archive
  28. for _, file = range files {
  29. e = addToArchive(tarWriter, file)
  30. if e != nil {
  31. return e
  32. }
  33. }
  34. return nil
  35. }
  36. func addToArchive(tarWriter *tar.Writer, filename string) error {
  37. var (
  38. file *os.File
  39. info os.FileInfo
  40. header *tar.Header
  41. e error
  42. )
  43. // Open the file which will be written into the archive
  44. file, e = os.Open(filename)
  45. if e != nil {
  46. return e
  47. }
  48. defer file.Close()
  49. // Get FileInfo about our file providing file size, mode, etc.
  50. info, e = file.Stat()
  51. if e != nil {
  52. return e
  53. }
  54. // Create a tar Header from the FileInfo data
  55. header, e = tar.FileInfoHeader(info, info.Name())
  56. if e != nil {
  57. return e
  58. }
  59. // Use full path as name (FileInfoHeader only takes the basename)
  60. // If we don't do this the directory strucuture would
  61. // not be preserved
  62. // https://golang.org/src/archive/tar/common.go?#L626
  63. header.Name = strings.TrimPrefix(filename, "/")
  64. // Write file header to the tar archive
  65. e = tarWriter.WriteHeader(header)
  66. if e != nil {
  67. return e
  68. }
  69. // Copy file content to tar archive
  70. _, e = io.Copy(tarWriter, file)
  71. if e != nil {
  72. return e
  73. }
  74. return nil
  75. }