github.com/rogpeppe/go-internal@v1.12.1-0.20240509064211-c8567cf8e95f/cmd/txtar-x/extract.go (about) 1 // Copyright 2018 The Go 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 // The txtar-x command extracts a txtar archive to a filesystem. 6 // 7 // Usage: 8 // 9 // txtar-x [-C root-dir] saved.txt 10 // 11 // See https://godoc.org/golang.org/x/tools/txtar for details of the format 12 // and how to parse a txtar file. 13 package main 14 15 import ( 16 "flag" 17 "fmt" 18 "io" 19 "log" 20 "os" 21 22 "github.com/rogpeppe/go-internal/txtar" 23 ) 24 25 var ( 26 extractDir = flag.String("C", ".", "directory to extract files into") 27 ) 28 29 func usage() { 30 fmt.Fprintf(os.Stderr, "usage: txtar-x [flags] [file]\n") 31 flag.PrintDefaults() 32 } 33 34 func main() { 35 os.Exit(main1()) 36 } 37 38 func main1() int { 39 flag.Usage = usage 40 flag.Parse() 41 if flag.NArg() > 1 { 42 usage() 43 return 2 44 } 45 log.SetPrefix("txtar-x: ") 46 log.SetFlags(0) 47 48 var a *txtar.Archive 49 if flag.NArg() == 0 { 50 data, err := io.ReadAll(os.Stdin) 51 if err != nil { 52 log.Printf("cannot read stdin: %v", err) 53 return 1 54 } 55 a = txtar.Parse(data) 56 } else { 57 a1, err := txtar.ParseFile(flag.Arg(0)) 58 if err != nil { 59 log.Print(err) 60 return 1 61 } 62 a = a1 63 } 64 if err := txtar.Write(a, *extractDir); err != nil { 65 log.Print(err) 66 return 1 67 } 68 return 0 69 }