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