gitlab.com/apertussolutions/u-root@v7.0.0+incompatible/cmds/core/tar/tar.go (about)

     1  // Copyright 2019 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Create and extract tar archives.
     6  //
     7  // Synopsis:
     8  //     tar [OPTION...] [FILE]...
     9  //
    10  // Description:
    11  //     This command line can be used only in the following ways:
    12  //        tar -cvf x.tar directory/         # create
    13  //        tar -cvf x.tar file1 file2 ...    # create
    14  //        tar -tvf x.tar                    # list
    15  //        tar -xvf x.tar directory/         # extract
    16  //
    17  // Options:
    18  //     -c: create a new tar archive from the given directory
    19  //     -x: extract a tar archive to the given directory
    20  //     -v: verbose, print each filename (optional)
    21  //     -f: tar filename (required)
    22  //     -t: list the contents of an archive
    23  //
    24  // TODO: The arguments deviates slightly from gnu tar.
    25  package main
    26  
    27  import (
    28  	"log"
    29  	"os"
    30  
    31  	flag "github.com/spf13/pflag"
    32  	"github.com/u-root/u-root/pkg/tarutil"
    33  )
    34  
    35  var (
    36  	create  = flag.BoolP("create", "c", false, "create a new tar archive from the given directory")
    37  	extract = flag.BoolP("extract", "x", false, "extract a tar archive from the given directory")
    38  	verbose = flag.BoolP("verbose", "v", false, "print each filename")
    39  	file    = flag.StringP("file", "f", "", "tar file")
    40  	list    = flag.BoolP("list", "t", false, "list the contents of an archive")
    41  )
    42  
    43  func main() {
    44  	flag.Parse()
    45  
    46  	if *create && *extract {
    47  		log.Fatal("cannot supply both -c and -x")
    48  	} else if *create && *list {
    49  		log.Fatal("cannot supply both -c and -t")
    50  	} else if *extract && *list {
    51  		log.Fatal("cannot supply both -x and -t")
    52  	}
    53  
    54  	if *file == "" {
    55  		log.Fatal("tar filename is required")
    56  	}
    57  
    58  	var filters []tarutil.Filter
    59  	if *verbose {
    60  		filters = []tarutil.Filter{tarutil.VerboseFilter}
    61  	}
    62  
    63  	switch {
    64  	case *create:
    65  		f, err := os.Create(*file)
    66  		if err != nil {
    67  			log.Fatal(err)
    68  		}
    69  		if err := tarutil.CreateTarFilter(f, flag.Args(), filters); err != nil {
    70  			f.Close()
    71  			log.Fatal(err)
    72  		}
    73  		if err := f.Close(); err != nil {
    74  			log.Fatal(err)
    75  		}
    76  	case *extract:
    77  		if flag.NArg() != 1 {
    78  			flag.Usage()
    79  			os.Exit(1)
    80  		}
    81  		f, err := os.Open(*file)
    82  		if err != nil {
    83  			log.Fatal(err)
    84  		}
    85  		defer f.Close()
    86  		if err := tarutil.ExtractDirFilter(f, flag.Arg(0), filters); err != nil {
    87  			log.Fatal(err)
    88  		}
    89  	case *list:
    90  		f, err := os.Open(*file)
    91  		if err != nil {
    92  			log.Fatal(err)
    93  		}
    94  		defer f.Close()
    95  		if err := tarutil.ListArchive(f); err != nil {
    96  			log.Fatal(err)
    97  		}
    98  	default:
    99  		log.Fatal("must supply at least one of: -c, -x, -t")
   100  	}
   101  }