github.com/Racer159/jackal@v0.32.7-0.20240401174413-0bd2339e4f2e/src/cmd/tools/archiver.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: 2021-Present The Jackal Authors 3 4 // Package tools contains the CLI commands for Jackal. 5 package tools 6 7 import ( 8 "fmt" 9 "os" 10 "path/filepath" 11 "strings" 12 13 "github.com/Racer159/jackal/src/config/lang" 14 "github.com/Racer159/jackal/src/pkg/layout" 15 "github.com/Racer159/jackal/src/pkg/message" 16 "github.com/mholt/archiver/v3" 17 "github.com/spf13/cobra" 18 ) 19 20 // ldflags github.com/Racer159/jackal/src/cmd/tools.archiverVersion=x.x.x 21 var archiverVersion string 22 23 var archiverCmd = &cobra.Command{ 24 Use: "archiver", 25 Aliases: []string{"a"}, 26 Short: lang.CmdToolsArchiverShort, 27 Version: archiverVersion, 28 } 29 30 var archiverCompressCmd = &cobra.Command{ 31 Use: "compress SOURCES ARCHIVE", 32 Aliases: []string{"c"}, 33 Short: lang.CmdToolsArchiverCompressShort, 34 Args: cobra.MinimumNArgs(2), 35 Run: func(_ *cobra.Command, args []string) { 36 sourceFiles, destinationArchive := args[:len(args)-1], args[len(args)-1] 37 err := archiver.Archive(sourceFiles, destinationArchive) 38 if err != nil { 39 message.Fatalf(err, lang.CmdToolsArchiverCompressErr, err.Error()) 40 } 41 }, 42 } 43 44 var unarchiveAll bool 45 46 var archiverDecompressCmd = &cobra.Command{ 47 Use: "decompress ARCHIVE DESTINATION", 48 Aliases: []string{"d"}, 49 Short: lang.CmdToolsArchiverDecompressShort, 50 Args: cobra.ExactArgs(2), 51 Run: func(_ *cobra.Command, args []string) { 52 sourceArchive, destinationPath := args[0], args[1] 53 err := archiver.Unarchive(sourceArchive, destinationPath) 54 if err != nil { 55 message.Fatalf(err, lang.CmdToolsArchiverDecompressErr, err.Error()) 56 } 57 58 if unarchiveAll { 59 err := filepath.Walk(destinationPath, func(path string, info os.FileInfo, err error) error { 60 if err != nil { 61 return err 62 } 63 if strings.HasSuffix(path, ".tar") { 64 dst := filepath.Join(strings.TrimSuffix(path, ".tar"), "..") 65 // Unpack sboms.tar differently since it has a different folder structure than components 66 if info.Name() == layout.SBOMTar { 67 dst = strings.TrimSuffix(path, ".tar") 68 } 69 err := archiver.Unarchive(path, dst) 70 if err != nil { 71 return fmt.Errorf(lang.ErrUnarchive, path, err.Error()) 72 } 73 err = os.Remove(path) 74 if err != nil { 75 return fmt.Errorf(lang.ErrRemoveFile, path, err.Error()) 76 } 77 } 78 return nil 79 }) 80 if err != nil { 81 message.Fatalf(err, lang.CmdToolsArchiverUnarchiveAllErr, err.Error()) 82 } 83 } 84 }, 85 } 86 87 func init() { 88 toolsCmd.AddCommand(archiverCmd) 89 90 archiverCmd.AddCommand(archiverCompressCmd) 91 archiverCmd.AddCommand(archiverDecompressCmd) 92 archiverCmd.AddCommand(newVersionCmd("mholt/archiver", archiverVersion)) 93 archiverDecompressCmd.Flags().BoolVar(&unarchiveAll, "decompress-all", false, "Decompress all tarballs in the archive") 94 archiverDecompressCmd.Flags().BoolVar(&unarchiveAll, "unarchive-all", false, "Unarchive all tarballs in the archive") 95 archiverDecompressCmd.MarkFlagsMutuallyExclusive("decompress-all", "unarchive-all") 96 archiverDecompressCmd.Flags().MarkHidden("decompress-all") 97 }