github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/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  //
     9  //	tar [OPTION...] [FILE]...
    10  //
    11  // Description:
    12  //
    13  //	This command line can be used only in the following ways:
    14  //	   tar -cvf x.tar directory/         # create
    15  //	   tar -cvf x.tar file1 file2 ...    # create
    16  //	   tar -tvf x.tar                    # list
    17  //	   tar -xvf x.tar directory/         # extract
    18  //
    19  // Options:
    20  //
    21  //	-c: create a new tar archive from the given directory
    22  //	-x: extract a tar archive to the given directory
    23  //	-v: verbose, print each filename (optional)
    24  //	-f: tar filename (required)
    25  //	-t: list the contents of an archive
    26  //
    27  // TODO: The arguments deviates slightly from gnu tar.
    28  package main
    29  
    30  import (
    31  	"log"
    32  	"os"
    33  
    34  	flag "github.com/spf13/pflag"
    35  	"github.com/mvdan/u-root-coreutils/pkg/tarutil"
    36  )
    37  
    38  var (
    39  	create      = flag.BoolP("create", "c", false, "create a new tar archive from the given directory")
    40  	extract     = flag.BoolP("extract", "x", false, "extract a tar archive from the given directory")
    41  	file        = flag.StringP("file", "f", "", "tar file")
    42  	list        = flag.BoolP("list", "t", false, "list the contents of an archive")
    43  	noRecursion = flag.Bool("no-recursion", false, "do not automatically recurse into directories")
    44  	verbose     = flag.BoolP("verbose", "v", false, "print each filename")
    45  )
    46  
    47  func main() {
    48  	flag.Parse()
    49  
    50  	if *create && *extract {
    51  		log.Fatal("cannot supply both -c and -x")
    52  	} else if *create && *list {
    53  		log.Fatal("cannot supply both -c and -t")
    54  	} else if *extract && *list {
    55  		log.Fatal("cannot supply both -x and -t")
    56  	}
    57  
    58  	if *file == "" {
    59  		log.Fatal("tar filename is required")
    60  	}
    61  
    62  	opts := &tarutil.Opts{
    63  		NoRecursion: *noRecursion,
    64  	}
    65  	if *verbose {
    66  		opts.Filters = []tarutil.Filter{tarutil.VerboseFilter}
    67  	}
    68  
    69  	switch {
    70  	case *create:
    71  		f, err := os.Create(*file)
    72  		if err != nil {
    73  			log.Fatal(err)
    74  		}
    75  		if err := tarutil.CreateTar(f, flag.Args(), opts); err != nil {
    76  			f.Close()
    77  			log.Fatal(err)
    78  		}
    79  		if err := f.Close(); err != nil {
    80  			log.Fatal(err)
    81  		}
    82  	case *extract:
    83  		if flag.NArg() != 1 {
    84  			flag.Usage()
    85  			os.Exit(1)
    86  		}
    87  		f, err := os.Open(*file)
    88  		if err != nil {
    89  			log.Fatal(err)
    90  		}
    91  		defer f.Close()
    92  		if err := tarutil.ExtractDir(f, flag.Arg(0), opts); err != nil {
    93  			log.Fatal(err)
    94  		}
    95  	case *list:
    96  		f, err := os.Open(*file)
    97  		if err != nil {
    98  			log.Fatal(err)
    99  		}
   100  		defer f.Close()
   101  		if err := tarutil.ListArchive(f); err != nil {
   102  			log.Fatal(err)
   103  		}
   104  	default:
   105  		log.Fatal("must supply at least one of: -c, -x, -t")
   106  	}
   107  }