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  }