AT Protocol IPLD-CAR Repository toolkit (CLI)

progress bars

tree 69ec21c7 5b22b667

Changed files
+95 -21
cli
cmd
engine
+6 -2
cli/context.go
··· 1 package cli 2 3 type Context struct { 4 - Args []string 5 - WorkingDir string 6 }
··· 1 package cli 2 3 + import "github.com/schollz/progressbar/v3" 4 + 5 type Context struct { 6 + Args []string 7 + WorkingDir string 8 + Raw bool 9 + ProgressBar *progressbar.ProgressBar 10 }
+4 -5
cmd/atr-log.go
··· 29 ctx := cli.Context{ 30 WorkingDir: workingDir, 31 Args: args, 32 } 33 walk := func(ss repo.RepoSnapshot, err error) { 34 if ss.Root.String() == "b" { ··· 44 } else { 45 yellow := color.New(color.FgYellow).SprintFunc() 46 cyan := color.New(color.FgCyan).SprintFunc() 47 - green := color.New(color.FgGreen).SprintFunc() 48 49 fmt.Printf("[%v]\n", yellow(ss.File)) 50 for i, cid := range cp { 51 - stats, _ := ss.GetCollectionStats(cid.String()) 52 53 sum := 0 54 for _, v := range stats { 55 sum += v 56 - } 57 - fmt.Printf("%v [#%v] %v objects\n", cyan(cid.String()), len(cp)-i, green(sum)) 58 } 59 } 60 - //fmt.Printf("\n") 61 } 62 63 stat, _ := os.Stdin.Stat()
··· 29 ctx := cli.Context{ 30 WorkingDir: workingDir, 31 Args: args, 32 + Raw: Raw, 33 } 34 walk := func(ss repo.RepoSnapshot, err error) { 35 if ss.Root.String() == "b" { ··· 45 } else { 46 yellow := color.New(color.FgYellow).SprintFunc() 47 cyan := color.New(color.FgCyan).SprintFunc() 48 49 fmt.Printf("[%v]\n", yellow(ss.File)) 50 for i, cid := range cp { 51 + /*stats, _ := ss.GetCollectionStats(cid.String()) 52 53 sum := 0 54 for _, v := range stats { 55 sum += v 56 + }*/ 57 + fmt.Printf("%v [#%v]\n", cyan(cid.String()), len(cp)-i) 58 } 59 } 60 } 61 62 stat, _ := os.Stdin.Stat()
+2
cmd/atr-show.go
··· 45 ctx := cli.Context{ 46 WorkingDir: workingDir, 47 Args: args, 48 } 49 50 //q := ctx.Args().First() ··· 87 if GoBack > 0 { 88 gb, _ := ss.Repo.GetCommitsPath(GoBack) 89 rr = gb[len(gb)-1].String() 90 } 91 ss.LoadItems(rr) 92
··· 45 ctx := cli.Context{ 46 WorkingDir: workingDir, 47 Args: args, 48 + Raw: Raw, 49 } 50 51 //q := ctx.Args().First() ··· 88 if GoBack > 0 { 89 gb, _ := ss.Repo.GetCommitsPath(GoBack) 90 rr = gb[len(gb)-1].String() 91 + 92 } 93 ss.LoadItems(rr) 94
+61 -11
engine/io.go
··· 8 "log" 9 "os" 10 "strings" 11 12 "github.com/atscan/atr/repo" 13 "github.com/klauspost/compress/zstd" 14 ) 15 16 - func Load(fn string) (repo.RepoSnapshot, error) { 17 var ss repo.RepoSnapshot 18 var err error 19 if strings.HasSuffix(fn, ".car.zst") { 20 - ss, err = LoadCompressed(fn) 21 } else if strings.HasSuffix(fn, ".car") { 22 - ss, err = LoadRaw(fn) 23 } 24 if err != nil { 25 log.Fatal("Cannot load: ", fn) ··· 29 return ss, nil 30 } 31 32 - func LoadRaw(fn string) (repo.RepoSnapshot, error) { 33 dat, err := os.Open(fn) 34 defer dat.Close() 35 36 if err != nil { 37 return repo.RepoSnapshot{}, err 38 } 39 - return LoadFromStream(dat) 40 } 41 42 - func LoadCompressed(fn string) (repo.RepoSnapshot, error) { 43 dat, err := os.Open(fn) 44 defer dat.Close() 45 46 if err != nil { 47 return repo.RepoSnapshot{}, err 48 } 49 decoder, _ := zstd.NewReader(dat) 50 - return LoadFromStream(decoder) 51 } 52 53 - func LoadFromStream(input io.Reader) (repo.RepoSnapshot, error) { 54 - ss, err := LoadRepoFromStream(input) 55 if err != nil { 56 return ss, err 57 } ··· 61 return ss, nil 62 } 63 64 - func LoadRepoFromStream(input io.Reader) (repo.RepoSnapshot, error) { 65 rctx := context.TODO() 66 ss := repo.RepoSnapshot{} 67 68 buf := new(bytes.Buffer) 69 - size, err := io.Copy(buf, input) 70 if err != nil { 71 log.Fatal(err) 72 } 73 ss.Size = int(size) 74 75 r, err := repo.ReadRepoFromCar(rctx, buf) 76 if err != nil {
··· 8 "log" 9 "os" 10 "strings" 11 + "time" 12 13 + "github.com/atscan/atr/cli" 14 "github.com/atscan/atr/repo" 15 "github.com/klauspost/compress/zstd" 16 + "github.com/schollz/progressbar/v3" 17 ) 18 19 + func Load(ctx *cli.Context, fn string) (repo.RepoSnapshot, error) { 20 var ss repo.RepoSnapshot 21 var err error 22 if strings.HasSuffix(fn, ".car.zst") { 23 + ss, err = LoadCompressed(ctx, fn) 24 } else if strings.HasSuffix(fn, ".car") { 25 + ss, err = LoadRaw(ctx, fn) 26 } 27 if err != nil { 28 log.Fatal("Cannot load: ", fn) ··· 32 return ss, nil 33 } 34 35 + func LoadRaw(ctx *cli.Context, fn string) (repo.RepoSnapshot, error) { 36 + stat, err := os.Stat(fn) 37 + if err != nil { 38 + return repo.RepoSnapshot{}, err 39 + } 40 dat, err := os.Open(fn) 41 + if err != nil { 42 + return repo.RepoSnapshot{}, err 43 + } 44 defer dat.Close() 45 46 if err != nil { 47 return repo.RepoSnapshot{}, err 48 } 49 + return LoadFromStream(ctx, dat, stat.Size()) 50 } 51 52 + func LoadCompressed(ctx *cli.Context, fn string) (repo.RepoSnapshot, error) { 53 dat, err := os.Open(fn) 54 + if err != nil { 55 + return repo.RepoSnapshot{}, err 56 + } 57 defer dat.Close() 58 59 if err != nil { 60 return repo.RepoSnapshot{}, err 61 } 62 decoder, _ := zstd.NewReader(dat) 63 + return LoadFromStream(ctx, decoder, -1) 64 } 65 66 + func LoadFromStream(ctx *cli.Context, input io.Reader, sz int64) (repo.RepoSnapshot, error) { 67 + ss, err := LoadRepoFromStream(ctx, input, sz) 68 if err != nil { 69 return ss, err 70 } ··· 74 return ss, nil 75 } 76 77 + func LoadRepoFromStream(ctx *cli.Context, input io.Reader, sz int64) (repo.RepoSnapshot, error) { 78 rctx := context.TODO() 79 ss := repo.RepoSnapshot{} 80 81 + var bar *progressbar.ProgressBar 82 + if sz > 150_000_000 && !ctx.Raw { 83 + bar = progressbar.NewOptions(int(sz), 84 + progressbar.OptionSetDescription("loading"), 85 + progressbar.OptionSetWriter(os.Stderr), 86 + progressbar.OptionShowBytes(true), 87 + //progressbar.OptionSetWidth(10), 88 + progressbar.OptionThrottle(35*time.Millisecond), 89 + progressbar.OptionShowCount(), 90 + //progressbar.OptionOnCompletion(func() { 91 + //}), 92 + //progressbar.OptionSpinnerType(14), 93 + //progressbar.OptionFullWidth(), 94 + //progressbar.OptionUseANSICodes(true), 95 + progressbar.OptionSetRenderBlankState(false), 96 + /*progressbar.OptionSetTheme(progressbar.Theme{ 97 + Saucer: "=", 98 + SaucerHead: ">", 99 + SaucerPadding: " ", 100 + BarStart: "[", 101 + BarEnd: "]", 102 + }),*/ 103 + ) 104 + ctx.ProgressBar = bar 105 + } 106 + 107 buf := new(bytes.Buffer) 108 + var err error 109 + var size int64 110 + if bar != nil { 111 + size, err = io.Copy(io.MultiWriter(buf, bar), input) 112 + } else { 113 + size, err = io.Copy(buf, input) 114 + } 115 if err != nil { 116 log.Fatal(err) 117 } 118 ss.Size = int(size) 119 + 120 + if bar != nil { 121 + defer bar.Finish() 122 + defer bar.Clear() 123 + } 124 125 r, err := repo.ReadRepoFromCar(rctx, buf) 126 if err != nil {
+3 -3
engine/walk.go
··· 31 return err 32 } 33 if !info.IsDir() { 34 - cb(Load(dir)) 35 return nil 36 } 37 err = filepath.Walk(dir, ··· 39 if err != nil { 40 return err 41 } 42 - cb(Load(fn)) 43 return nil 44 }) 45 if err != nil { ··· 49 } 50 51 func WalkStream(ctx *cli.Context, input io.Reader, cb func(repo.RepoSnapshot, error)) error { 52 - ss, err := LoadFromStream(input) 53 if err != nil { 54 log.Println("Cannot load from stream:", err) 55 return nil
··· 31 return err 32 } 33 if !info.IsDir() { 34 + cb(Load(ctx, dir)) 35 return nil 36 } 37 err = filepath.Walk(dir, ··· 39 if err != nil { 40 return err 41 } 42 + cb(Load(ctx, fn)) 43 return nil 44 }) 45 if err != nil { ··· 49 } 50 51 func WalkStream(ctx *cli.Context, input io.Reader, cb func(repo.RepoSnapshot, error)) error { 52 + ss, err := LoadFromStream(ctx, input, -1) 53 if err != nil { 54 log.Println("Cannot load from stream:", err) 55 return nil
+5
go.mod
··· 17 github.com/jmespath/go-jmespath v0.4.0 18 github.com/json-iterator/go v1.1.12 19 github.com/klauspost/compress v1.16.7 20 github.com/spf13/cobra v1.7.0 21 github.com/whyrusleeping/cbor-gen v0.0.0-20230331140348-1f892b517e70 22 golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 ··· 46 github.com/klauspost/cpuid/v2 v2.2.4 // indirect 47 github.com/mattn/go-colorable v0.1.13 // indirect 48 github.com/mattn/go-isatty v0.0.19 // indirect 49 github.com/minio/sha256-simd v1.0.0 // indirect 50 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect 51 github.com/modern-go/reflect2 v1.0.2 // indirect 52 github.com/mr-tron/base58 v1.2.0 // indirect ··· 59 github.com/opentracing/opentracing-go v1.2.0 // indirect 60 github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect 61 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect 62 github.com/spaolacci/murmur3 v1.1.0 // indirect 63 github.com/spf13/pflag v1.0.5 // indirect 64 github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect ··· 69 golang.org/x/crypto v0.9.0 // indirect 70 golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect 71 golang.org/x/sys v0.10.0 // indirect 72 lukechampine.com/blake3 v1.1.7 // indirect 73 )
··· 17 github.com/jmespath/go-jmespath v0.4.0 18 github.com/json-iterator/go v1.1.12 19 github.com/klauspost/compress v1.16.7 20 + github.com/schollz/progressbar/v3 v3.13.1 21 github.com/spf13/cobra v1.7.0 22 github.com/whyrusleeping/cbor-gen v0.0.0-20230331140348-1f892b517e70 23 golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 ··· 47 github.com/klauspost/cpuid/v2 v2.2.4 // indirect 48 github.com/mattn/go-colorable v0.1.13 // indirect 49 github.com/mattn/go-isatty v0.0.19 // indirect 50 + github.com/mattn/go-runewidth v0.0.14 // indirect 51 github.com/minio/sha256-simd v1.0.0 // indirect 52 + github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect 53 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect 54 github.com/modern-go/reflect2 v1.0.2 // indirect 55 github.com/mr-tron/base58 v1.2.0 // indirect ··· 62 github.com/opentracing/opentracing-go v1.2.0 // indirect 63 github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect 64 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect 65 + github.com/rivo/uniseg v0.4.4 // indirect 66 github.com/spaolacci/murmur3 v1.1.0 // indirect 67 github.com/spf13/pflag v1.0.5 // indirect 68 github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect ··· 73 golang.org/x/crypto v0.9.0 // indirect 74 golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect 75 golang.org/x/sys v0.10.0 // indirect 76 + golang.org/x/term v0.10.0 // indirect 77 lukechampine.com/blake3 v1.1.7 // indirect 78 )
+14
go.sum
··· 100 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 101 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= 102 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 103 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 104 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 105 github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= ··· 122 github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= 123 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 124 github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 125 github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= 126 github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 127 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= 128 github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= 129 github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= 130 github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= 131 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 132 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 133 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= ··· 165 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 166 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f h1:VXTQfuJj9vKR4TCkEuWIckKvdHFeJH/huIFJ9/cXOB0= 167 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= 168 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 169 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= 170 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 171 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 172 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 173 github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= 174 github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= ··· 254 golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= 255 golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 256 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 257 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 258 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 259 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
··· 100 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 101 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= 102 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 103 + github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= 104 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 105 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 106 github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= ··· 123 github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= 124 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 125 github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 126 + github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 127 github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= 128 github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 129 + github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= 130 + github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 131 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= 132 github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= 133 github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= 134 github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= 135 + github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= 136 + github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= 137 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 138 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 139 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= ··· 171 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 172 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f h1:VXTQfuJj9vKR4TCkEuWIckKvdHFeJH/huIFJ9/cXOB0= 173 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= 174 + github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 175 + github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= 176 + github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 177 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 178 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= 179 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 180 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 181 + github.com/schollz/progressbar/v3 v3.13.1 h1:o8rySDYiQ59Mwzy2FELeHY5ZARXZTVJC7iHD6PEFUiE= 182 + github.com/schollz/progressbar/v3 v3.13.1/go.mod h1:xvrbki8kfT1fzWzBT/UZd9L6GA+jdL7HAgq2RFnO6fQ= 183 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 184 github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= 185 github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= ··· 265 golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= 266 golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 267 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 268 + golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= 269 + golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= 270 + golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= 271 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 272 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 273 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=