// NewArchive returns a new archive file containing the files. func NewArchive(meta *backups.Metadata, files, dump []File) (*bytes.Buffer, error) { dirs := set.NewStrings() var sysFiles []File for _, file := range files { var parent string for _, p := range strings.Split(path.Dir(file.Name), "/") { if parent == "" { parent = p } else { parent = path.Join(parent, p) } if !dirs.Contains(parent) { sysFiles = append(sysFiles, File{ Name: parent, IsDir: true, }) dirs.Add(parent) } } if file.IsDir { if !dirs.Contains(file.Name) { sysFiles = append(sysFiles, file) dirs.Add(file.Name) } } else { sysFiles = append(sysFiles, file) } } var rootFile bytes.Buffer if err := writeToTar(&rootFile, sysFiles); err != nil { return nil, errors.Trace(err) } topfiles := []File{{ Name: "juju-backup", IsDir: true, }} topfiles = append(topfiles, File{ Name: "juju-backup/dump", IsDir: true, }) for _, dumpFile := range dump { topfiles = append(topfiles, File{ Name: "juju-backup/dump/" + dumpFile.Name, Content: dumpFile.Content, IsDir: dumpFile.IsDir, }) } topfiles = append(topfiles, File{ Name: "juju-backup/root.tar", Content: rootFile.String(), }, ) if meta != nil { metaFile, err := meta.AsJSONBuffer() if err != nil { return nil, errors.Trace(err) } topfiles = append(topfiles, File{ Name: "juju-backup/metadata.json", Content: metaFile.(*bytes.Buffer).String(), }, ) } var arFile bytes.Buffer compressed := gzip.NewWriter(&arFile) defer compressed.Close() if err := writeToTar(compressed, topfiles); err != nil { return nil, errors.Trace(err) } return &arFile, nil }