]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Convert cmd/torrent2 to bargle/v2
authorMatt Joiner <anacrolix@gmail.com>
Thu, 7 Aug 2025 05:47:44 +0000 (15:47 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 7 Aug 2025 05:47:44 +0000 (15:47 +1000)
cmd/torrent2/main.go
go.mod
go.sum

index 223c3fba189efed5c07d667d5e6c099ff36aca4e..b215ee1ce76d1c1fcb3422c544edf723d13e35c4 100644 (file)
@@ -4,20 +4,18 @@
 package main
 
 import (
+       "errors"
        "fmt"
        "io"
        "os"
 
+       "github.com/anacrolix/bargle/v2"
        "github.com/anacrolix/log"
 
        "github.com/anacrolix/torrent/merkle"
        "github.com/anacrolix/torrent/metainfo"
 )
 
-type argError struct {
-       err error
-}
-
 func assertOk(err error) {
        if err != nil {
                panic(err)
@@ -29,12 +27,37 @@ func bail(str string) {
 }
 
 func main() {
-       args := os.Args[1:]
-       map[string]func(){
+       err := mainErr()
+       if err != nil {
+               fmt.Fprintf(os.Stderr, "%v\n", err)
+               os.Exit(1)
+       }
+}
+
+func mainErr() error {
+       p := bargle.NewParser()
+       defer p.DoHelpIfHelping()
+       runMap := func(m map[string]func()) {
+               for key, value := range m {
+                       if p.Parse(bargle.Keyword(key)) {
+                               value()
+                               return
+                       }
+               }
+               p.Fail()
+       }
+       parseFileName := func() (ret string) {
+               if p.Parse(bargle.Positional("file", bargle.BuiltinUnmarshaler(&ret))) {
+                       return
+               }
+               p.SetError(errors.New("file not specified"))
+               panic(p.Fail())
+       }
+       runMap(map[string]func(){
                "metainfo": func() {
-                       map[string]func(){
+                       runMap(map[string]func(){
                                "validate-v2": func() {
-                                       mi, err := metainfo.LoadFromFile(args[2])
+                                       mi, err := metainfo.LoadFromFile(parseFileName())
                                        assertOk(err)
                                        info, err := mi.UnmarshalInfo()
                                        assertOk(err)
@@ -45,7 +68,7 @@ func main() {
                                        assertOk(err)
                                },
                                "pprint": func() {
-                                       mi, err := metainfo.LoadFromFile(args[2])
+                                       mi, err := metainfo.LoadFromFile(parseFileName())
                                        assertOk(err)
                                        info, err := mi.UnmarshalInfo()
                                        assertOk(err)
@@ -54,9 +77,13 @@ func main() {
                                        for _, f := range files {
                                                numPieces := int((f.Length + info.PieceLength - 1) / info.PieceLength)
                                                endIndex := pieceIndex + numPieces
+                                               hash := "no v2 pieces root"
+                                               for a := range f.PiecesRoot.Iter() {
+                                                       hash = a.HexString()
+                                               }
                                                fmt.Printf(
-                                                       "%x: %q: pieces (%v-%v)\n",
-                                                       f.PiecesRoot.Unwrap(),
+                                                       "%s: %q: pieces (%v-%v)\n",
+                                                       hash,
                                                        f.BestPath(),
                                                        pieceIndex,
                                                        endIndex-1,
@@ -64,7 +91,7 @@ func main() {
                                                pieceIndex = endIndex
                                        }
                                },
-                       }[args[1]]()
+                       })
                },
                "merkle": func() {
                        h := merkle.NewHash()
@@ -75,5 +102,7 @@ func main() {
                        }
                        fmt.Printf("%x\n", h.Sum(nil))
                },
-       }[args[0]]()
+       })
+       p.FailIfArgsRemain()
+       return p.Err()
 }
diff --git a/go.mod b/go.mod
index d7182bff120e8b6f20c7d8039b16f1b5f4102303..22fdf1bbd88e72b2ebf2715a52c99d35fe96cf71 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -7,13 +7,14 @@ require (
        github.com/ajwerner/btree v0.0.0-20211221152037-f427b3e689c0
        github.com/alexflint/go-arg v1.4.3
        github.com/anacrolix/bargle v0.0.0-20221014000746-4f2739072e9d
+       github.com/anacrolix/bargle/v2 v2.0.0
        github.com/anacrolix/chansync v0.6.1-0.20250805140455-89f141559964
        github.com/anacrolix/dht/v2 v2.22.2-0.20250623060212-d7b7d8a52b01
        github.com/anacrolix/envpprof v1.3.0
        github.com/anacrolix/fuse v0.3.2-0.20250603105216-aeb550c91d7a
-       github.com/anacrolix/generics v0.0.3-0.20250526144502-593be7092deb
+       github.com/anacrolix/generics v0.0.4-0.20250708073025-68393b391647
        github.com/anacrolix/go-libutp v1.3.2
-       github.com/anacrolix/gostdapp v0.1.0
+       github.com/anacrolix/gostdapp v0.2.0
        github.com/anacrolix/log v0.16.1-0.20250526073428-5cb74e15092b
        github.com/anacrolix/missinggo v1.3.0
        github.com/anacrolix/missinggo/v2 v2.10.0
diff --git a/go.sum b/go.sum
index 8852f7cda9dc9687cb47c7beca9ba40b9f967e9a..d67f8b9acc6aef2d3140d1605537fc6a9c6e9f9b 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -80,12 +80,12 @@ github.com/anacrolix/envpprof v1.3.0/go.mod h1:7QIG4CaX1uexQ3tqd5+BRa/9e2D02Wcer
 github.com/anacrolix/fuse v0.3.2-0.20250603105216-aeb550c91d7a h1:bP+SxvpLAWXgpRvDKmB+d8n4XEWYHH5czGlcZ5Kw66Y=
 github.com/anacrolix/fuse v0.3.2-0.20250603105216-aeb550c91d7a/go.mod h1:vN3X/6E+uHNjg5F8Oy9FD9I+pYxeDWeB8mNjIoxL5ds=
 github.com/anacrolix/generics v0.0.0-20230113004304-d6428d516633/go.mod h1:ff2rHB/joTV03aMSSn/AZNnaIpUw0h3njetGsaXcMy8=
-github.com/anacrolix/generics v0.0.3-0.20250526144502-593be7092deb h1:0GzqbT+KzmrpXsqEp6O3t6qfydTQuqvgo3nTJEC1EGA=
-github.com/anacrolix/generics v0.0.3-0.20250526144502-593be7092deb/go.mod h1:MN3ve08Z3zSV/rTuX/ouI4lNdlfTxgdafQJiLzyNRB8=
+github.com/anacrolix/generics v0.0.4-0.20250708073025-68393b391647 h1:dDTY2j+pjY0EnF0TIuAxees1FeFpnFVE2dr7BxfWe24=
+github.com/anacrolix/generics v0.0.4-0.20250708073025-68393b391647/go.mod h1:MN3ve08Z3zSV/rTuX/ouI4lNdlfTxgdafQJiLzyNRB8=
 github.com/anacrolix/go-libutp v1.3.2 h1:WswiaxTIogchbkzNgGHuHRfbrYLpv4o290mlvcx+++M=
 github.com/anacrolix/go-libutp v1.3.2/go.mod h1:fCUiEnXJSe3jsPG554A200Qv+45ZzIIyGEvE56SHmyA=
-github.com/anacrolix/gostdapp v0.1.0 h1:sZC+gSLhA7Hdalak5rPCkhO0YSEl0tt/lsovxh6qka4=
-github.com/anacrolix/gostdapp v0.1.0/go.mod h1:2pstbgWcpBCY3rFUldM0NbDCrP86vWsh61wj8yY517E=
+github.com/anacrolix/gostdapp v0.2.0 h1:UNuF8oKKFIa2tzcXLTiVStCYSUfRith81EskV05gIfk=
+github.com/anacrolix/gostdapp v0.2.0/go.mod h1:2pstbgWcpBCY3rFUldM0NbDCrP86vWsh61wj8yY517E=
 github.com/anacrolix/log v0.3.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU=
 github.com/anacrolix/log v0.6.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU=
 github.com/anacrolix/log v0.13.1/go.mod h1:D4+CvN8SnruK6zIFS/xPoRJmtvtnxs+CSfDQ+BFxZ68=