github.com/gagliardetto/golang-go@v0.0.0-20201020153340-53909ea70814/cmd/go/not-internal/modfetch/codehost/shell.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 // +build ignore 6 7 // Interactive debugging shell for codehost.Repo implementations. 8 9 package main 10 11 import ( 12 "archive/zip" 13 "bufio" 14 "bytes" 15 "flag" 16 "fmt" 17 "io/ioutil" 18 "log" 19 "os" 20 "strings" 21 "time" 22 23 "github.com/gagliardetto/golang-go/cmd/go/not-internal/modfetch/codehost" 24 ) 25 26 func usage() { 27 fmt.Fprintf(os.Stderr, "usage: go run shell.go vcs remote\n") 28 os.Exit(2) 29 } 30 31 func main() { 32 codehost.WorkRoot = "/tmp/vcswork" 33 log.SetFlags(0) 34 log.SetPrefix("shell: ") 35 flag.Usage = usage 36 flag.Parse() 37 if flag.NArg() != 2 { 38 usage() 39 } 40 41 repo, err := codehost.NewRepo(flag.Arg(0), flag.Arg(1)) 42 if err != nil { 43 log.Fatal(err) 44 } 45 46 b := bufio.NewReader(os.Stdin) 47 for { 48 fmt.Fprintf(os.Stderr, ">>> ") 49 line, err := b.ReadString('\n') 50 if err != nil { 51 log.Fatal(err) 52 } 53 f := strings.Fields(line) 54 if len(f) == 0 { 55 continue 56 } 57 switch f[0] { 58 default: 59 fmt.Fprintf(os.Stderr, "?unknown command\n") 60 continue 61 case "tags": 62 prefix := "" 63 if len(f) == 2 { 64 prefix = f[1] 65 } 66 if len(f) > 2 { 67 fmt.Fprintf(os.Stderr, "?usage: tags [prefix]\n") 68 continue 69 } 70 tags, err := repo.Tags(prefix) 71 if err != nil { 72 fmt.Fprintf(os.Stderr, "?%s\n", err) 73 continue 74 } 75 for _, tag := range tags { 76 fmt.Printf("%s\n", tag) 77 } 78 79 case "stat": 80 if len(f) != 2 { 81 fmt.Fprintf(os.Stderr, "?usage: stat rev\n") 82 continue 83 } 84 info, err := repo.Stat(f[1]) 85 if err != nil { 86 fmt.Fprintf(os.Stderr, "?%s\n", err) 87 continue 88 } 89 fmt.Printf("name=%s short=%s version=%s time=%s\n", info.Name, info.Short, info.Version, info.Time.UTC().Format(time.RFC3339)) 90 91 case "read": 92 if len(f) != 3 { 93 fmt.Fprintf(os.Stderr, "?usage: read rev file\n") 94 continue 95 } 96 data, err := repo.ReadFile(f[1], f[2], 10<<20) 97 if err != nil { 98 fmt.Fprintf(os.Stderr, "?%s\n", err) 99 continue 100 } 101 os.Stdout.Write(data) 102 103 case "zip": 104 if len(f) != 4 { 105 fmt.Fprintf(os.Stderr, "?usage: zip rev subdir output\n") 106 continue 107 } 108 subdir := f[2] 109 if subdir == "-" { 110 subdir = "" 111 } 112 rc, err := repo.ReadZip(f[1], subdir, 10<<20) 113 if err != nil { 114 fmt.Fprintf(os.Stderr, "?%s\n", err) 115 continue 116 } 117 data, err := ioutil.ReadAll(rc) 118 rc.Close() 119 if err != nil { 120 fmt.Fprintf(os.Stderr, "?%s\n", err) 121 continue 122 } 123 124 if f[3] != "-" { 125 if err := ioutil.WriteFile(f[3], data, 0666); err != nil { 126 fmt.Fprintf(os.Stderr, "?%s\n", err) 127 continue 128 } 129 } 130 z, err := zip.NewReader(bytes.NewReader(data), int64(len(data))) 131 if err != nil { 132 fmt.Fprintf(os.Stderr, "?%s\n", err) 133 continue 134 } 135 for _, f := range z.File { 136 fmt.Printf("%s %d\n", f.Name, f.UncompressedSize64) 137 } 138 } 139 } 140 }