From daadb188883bf0930543d18140a04fe49a056616 Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Thu, 13 Feb 2025 13:24:25 +0100 Subject: [PATCH 1/9] ci: use ubuntu-latest Signed-off-by: Sebastien Binet --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b52052fc4..6b558857c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: go-version: [1.23.x, 1.22.x] - platform: [ubuntu-20.04, macos-latest, windows-latest] + platform: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.platform }} steps: - name: Install Go @@ -50,7 +50,7 @@ jobs: fetch-depth: 1 - name: Install Linux packages - if: matrix.platform == 'ubuntu-20.04' + if: matrix.platform == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -qq gcc pkg-config libwayland-dev libx11-dev libx11-xcb-dev libxkbcommon-x11-dev libgles2-mesa-dev libegl1-mesa-dev libffi-dev libxcursor-dev libvulkan-dev xvfb xdotool @@ -59,11 +59,11 @@ jobs: root.exe --version - name: Build-Linux-32b - if: matrix.platform == 'ubuntu-20.04' + if: matrix.platform == 'ubuntu-latest' run: | GOARCH=386 go install -v $TAGS,cross_compile ./... - name: Build-Linux-64b - if: matrix.platform == 'ubuntu-20.04' + if: matrix.platform == 'ubuntu-latest' run: | GOARCH=amd64 go install -v $TAGS ./... - name: Build-Windows @@ -75,7 +75,7 @@ jobs: run: | go install -v $TAGS ./... - name: Test Linux - if: matrix.platform == 'ubuntu-20.04' + if: matrix.platform == 'ubuntu-latest' run: | go run ./ci/run-tests.go $TAGS -race $COVERAGE go vet $TAGS ./... @@ -96,5 +96,5 @@ jobs: cache-key: ${{ matrix.platform }} version: "2024.1.1" - name: Upload-Coverage - if: matrix.platform == 'ubuntu-20.04' + if: matrix.platform == 'ubuntu-latest' uses: codecov/codecov-action@v3 From 9b7d6b6864716f660cd5e5a6c5408f6957e07cb7 Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Thu, 13 Feb 2025 13:24:43 +0100 Subject: [PATCH 2/9] ci: bump staticcheck@2025.1 Signed-off-by: Sebastien Binet --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6b558857c..eb85af892 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -94,7 +94,7 @@ jobs: with: install-go: false cache-key: ${{ matrix.platform }} - version: "2024.1.1" + version: "2025.1" - name: Upload-Coverage if: matrix.platform == 'ubuntu-latest' uses: codecov/codecov-action@v3 From 1bd95a81b9d1dc8c5fffa355ab60e6b4e3a160bf Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Thu, 13 Feb 2025 13:25:04 +0100 Subject: [PATCH 3/9] ci: remove cgo deps needed for vg/vggio Signed-off-by: Sebastien Binet --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eb85af892..1396852bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,7 +53,6 @@ jobs: if: matrix.platform == 'ubuntu-latest' run: | sudo apt-get update - sudo apt-get install -qq gcc pkg-config libwayland-dev libx11-dev libx11-xcb-dev libxkbcommon-x11-dev libgles2-mesa-dev libegl1-mesa-dev libffi-dev libxcursor-dev libvulkan-dev xvfb xdotool go run ./ci/install-cxx-root.go -root-version=${ROOT_VERSION} -o=${HOME} source $HOME/root-${ROOT_VERSION}/bin/thisroot.sh root.exe --version From a9722bcf259cfafc40531293e0331dda88fff0ed Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Mon, 17 Feb 2025 10:24:02 +0100 Subject: [PATCH 4/9] ci: remove iplot and pawgo special handling Signed-off-by: Sebastien Binet --- ci/mk-release.go | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/ci/mk-release.go b/ci/mk-release.go index 93c78d6f5..88ea5441d 100644 --- a/ci/mk-release.go +++ b/ci/mk-release.go @@ -321,32 +321,12 @@ func setLatest(version string) { } var excludeList = map[OSArch]map[string]struct{}{ - {"linux", "386"}: { - "go-hep.org/x/hep/hplot/cmd/iplot": struct{}{}, - }, - {"linux", "arm64"}: { - "go-hep.org/x/hep/hplot/cmd/iplot": struct{}{}, - }, - {"darwin", "amd64"}: { - "go-hep.org/x/hep/hplot/cmd/iplot": {}, - }, - {"freebsd", "amd64"}: { - "go-hep.org/x/hep/hplot/cmd/iplot": struct{}{}, - "go-hep.org/x/hep/groot/cmd/root-fuse": struct{}{}, - "go-hep.org/x/hep/xrootd/cmd/xrd-fuse": struct{}{}, - }, - {"windows", "amd64"}: { - "go-hep.org/x/hep/groot/cmd/root-fuse": struct{}{}, - "go-hep.org/x/hep/xrootd/cmd/xrd-fuse": struct{}{}, - }, - {"windows", "386"}: { - "go-hep.org/x/hep/groot/cmd/root-fuse": struct{}{}, - "go-hep.org/x/hep/xrootd/cmd/xrd-fuse": struct{}{}, - }, + {"linux", "386"}: {}, + {"linux", "arm64"}: {}, + {"darwin", "amd64"}: {}, + {"freebsd", "amd64"}: {}, + {"windows", "amd64"}: {}, + {"windows", "386"}: {}, } -var needCgo = map[string]struct{}{ - "pawgo": {}, - "iplot": {}, - "hplot": {}, -} +var needCgo = map[string]struct{}{} From bb0e3b7577ab4dce2913899c42bddadea6ff0f6b Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Mon, 17 Feb 2025 10:24:29 +0100 Subject: [PATCH 5/9] hplot/cmd/iplot: remove Signed-off-by: Sebastien Binet --- hplot/cmd/iplot/main.go | 129 ---------------------------------------- 1 file changed, 129 deletions(-) delete mode 100644 hplot/cmd/iplot/main.go diff --git a/hplot/cmd/iplot/main.go b/hplot/cmd/iplot/main.go deleted file mode 100644 index 396aec44b..000000000 --- a/hplot/cmd/iplot/main.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright ©2017 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !cross_compile - -package main - -import ( - "image/color" - "math/rand" - "os" - "strings" - - "gioui.org/app" - "gioui.org/io/key" - "gioui.org/io/system" - "gioui.org/layout" - "gioui.org/op" - "gioui.org/op/clip" - "gioui.org/unit" - "go-hep.org/x/hep/hbook" - "go-hep.org/x/hep/hplot" - "gonum.org/v1/plot/plotter" - "gonum.org/v1/plot/vg/draw" - "gonum.org/v1/plot/vg/vggio" -) - -const ( - NPOINTS = 100000 - dpi = 96 -) - -func main() { - go run() - app.Main() -} - -func run() { - w, h := hplot.Dims(-1, -1) - win := app.NewWindow( - app.Title("iplot"), - app.Size( - unit.Dp(float32(w.Dots(dpi))), - unit.Dp(float32(h.Dots(dpi))), - ), - ) - defer os.Exit(0) - - keys := key.Set(strings.Join( - []string{key.NameEscape, "Q", " ", key.NameReturn, key.NameEnter}, - "|", - )) - - for e := range win.Events() { - switch e := e.(type) { - case system.FrameEvent: - var ( - ops op.Ops - gtx = layout.NewContext(&ops, e) - ) - // register a global key listener for the escape key wrapping our entire UI. - area := clip.Rect{Max: gtx.Constraints.Max}.Push(gtx.Ops) - key.InputOp{ - Tag: win, - Keys: keys, - }.Add(gtx.Ops) - - for _, e := range gtx.Events(win) { - switch e := e.(type) { - case key.Event: - switch e.Name { - case "Q", key.NameEscape: - return - case " ", key.NameReturn, key.NameEnter: - if e.State == key.Press { - win.Invalidate() - } - } - } - } - area.Pop() - - c := vggio.New(gtx, w, h) - p := newPlot() - p.Draw(draw.New(c)) - e.Frame(c.Paint()) - - case system.DestroyEvent: - return - } - } -} - -func newPlot() *hplot.Plot { - // Draw some random values from the standard - // normal distribution. - hist1 := hbook.NewH1D(100, -5, +5) - hist2 := hbook.NewH1D(100, -5, +5) - for i := 0; i < NPOINTS; i++ { - v1 := rand.NormFloat64() - 1 - v2 := rand.NormFloat64() + 1 - hist1.Fill(v1, 1) - hist2.Fill(v2, 1) - } - - // Make a plot and set its title. - p := hplot.New() - p.Title.Text = "Histogram" - p.X.Label.Text = "X" - p.Y.Label.Text = "Y" - - // Create a histogram of our values drawn - // from the standard normal. - h1 := hplot.NewH1D(hist1) - h1.Infos.Style = hplot.HInfoSummary - h1.Color = color.Black - h1.FillColor = nil - - h2 := hplot.NewH1D(hist2) - h2.Infos.Style = hplot.HInfoNone - h2.Color = color.RGBA{255, 0, 0, 255} - h2.FillColor = nil - - p.Add(h1, h2) - - p.Add(plotter.NewGrid()) - return p -} From 3c86fe7ae9649c55c7778857c389b1f9879aafc9 Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Mon, 17 Feb 2025 10:25:14 +0100 Subject: [PATCH 6/9] pawgo: remove Signed-off-by: Sebastien Binet --- pawgo/README.md | 47 ------ pawgo/app.go | 15 -- pawgo/app_xcomp.go | 11 -- pawgo/cmd.go | 185 ---------------------- pawgo/cmd_file.go | 150 ------------------ pawgo/cmd_help.go | 72 --------- pawgo/cmd_hist.go | 121 -------------- pawgo/cmd_quit.go | 32 ---- pawgo/cmd_shell.go | 66 -------- pawgo/fmgr.go | 242 ---------------------------- pawgo/gen.hsimple.rio.go | 143 ----------------- pawgo/hmgr.go | 161 ------------------- pawgo/main.go | 116 -------------- pawgo/main_test.go | 295 ----------------------------------- pawgo/testdata/hsimple.rio | Bin 129980 -> 0 bytes pawgo/testdata/issue-120.paw | 3 - pawgo/testdata/issue-120.rio | Bin 972 -> 0 bytes pawgo/testdata/script.paw | 21 --- pawgo/wmgr.go | 156 ------------------ pawgo/wmgr_test.go | 53 ------- pawgo/wmgr_xcomp.go | 34 ---- 21 files changed, 1923 deletions(-) delete mode 100644 pawgo/README.md delete mode 100644 pawgo/app.go delete mode 100644 pawgo/app_xcomp.go delete mode 100644 pawgo/cmd.go delete mode 100644 pawgo/cmd_file.go delete mode 100644 pawgo/cmd_help.go delete mode 100644 pawgo/cmd_hist.go delete mode 100644 pawgo/cmd_quit.go delete mode 100644 pawgo/cmd_shell.go delete mode 100644 pawgo/fmgr.go delete mode 100644 pawgo/gen.hsimple.rio.go delete mode 100644 pawgo/hmgr.go delete mode 100644 pawgo/main.go delete mode 100644 pawgo/main_test.go delete mode 100644 pawgo/testdata/hsimple.rio delete mode 100644 pawgo/testdata/issue-120.paw delete mode 100644 pawgo/testdata/issue-120.rio delete mode 100644 pawgo/testdata/script.paw delete mode 100644 pawgo/wmgr.go delete mode 100644 pawgo/wmgr_test.go delete mode 100644 pawgo/wmgr_xcomp.go diff --git a/pawgo/README.md b/pawgo/README.md deleted file mode 100644 index 256f5877c..000000000 --- a/pawgo/README.md +++ /dev/null @@ -1,47 +0,0 @@ -pawgo -===== - -`pawgo` is a nod to the old `PAW` physics analysis workstation. - -## Installation - -```sh -$ go get -u go-hep.org/x/hep/pawgo -``` - -## Example - -``` -$ pawgo - -::::::::::::::::::::::::::::: -::: Welcome to PAW-Go ::: -::::::::::::::::::::::::::::: - -Type /? for help. -^D or /quit to quit. - -paw> /? -/! -- run a shell command -/? -- print help -/file/close -- close a file -/file/create -- create file for write access -/file/list -- list a file's content -/file/open -- open file for read access -/hist/open -- open a histogram -/hist/plot -- plot a histogram -/quit -- quit PAW-Go - -paw> /file/open f testdata/hsimple.rio -paw> /file/ls f -/file/id/f name=testdata/hsimple.rio - - h1 (type="*go-hep.org/x/hep/hbook.H1D") - - h2 (type="*go-hep.org/x/hep/hbook.H1D") - -paw> /hist/open h /file/id/f/h1 -paw> /hist/plot h -== h1d: name="h1" -entries=1000 -mean= -0.059 -RMS= +1.009 -``` diff --git a/pawgo/app.go b/pawgo/app.go deleted file mode 100644 index 21178d1b2..000000000 --- a/pawgo/app.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright ©2020 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !cross_compile - -package main - -import ( - "gioui.org/app" -) - -func appMain() { - app.Main() -} diff --git a/pawgo/app_xcomp.go b/pawgo/app_xcomp.go deleted file mode 100644 index 0e7e9a341..000000000 --- a/pawgo/app_xcomp.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright ©2020 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build cross_compile - -package main - -func appMain() { - select {} -} diff --git a/pawgo/cmd.go b/pawgo/cmd.go deleted file mode 100644 index a6f9b9224..000000000 --- a/pawgo/cmd.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright ©2015 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "bufio" - "fmt" - "io" - "log" - "os" - "strings" - - "github.com/google/shlex" - "github.com/peterh/liner" -) - -type Cmdr interface { - Name() string - Run(args []string) error - Help(w io.Writer) - Complete(line string) []string -} - -type Cmd struct { - msg *log.Logger - rl *liner.State - cmds map[string]Cmdr - wmgr *winMgr - fmgr *fileMgr - hmgr *histMgr -} - -func newCmd(stdout io.Writer) *Cmd { - msg := log.New(stdout, "paw: ", 0) - c := Cmd{ - msg: msg, - rl: liner.NewLiner(), - wmgr: newWinMgr(msg), - fmgr: newFileMgr(msg), - hmgr: newHistMgr(msg), - } - c.cmds = map[string]Cmdr{ - "/?": &cmdHelp{&c}, - "/!": &cmdShell{&c}, - - "/file/open": &cmdFileOpen{&c}, - "/file/close": &cmdFileClose{&c}, - "/file/create": &cmdFileCreate{&c}, - "/file/ls": &cmdFileList{&c}, - - "/hist/open": &cmdHistOpen{&c}, - "/hist/plot": &cmdHistPlot{&c}, - - "/quit": &cmdQuit{&c}, - } - - c.rl.SetTabCompletionStyle(liner.TabPrints) - c.rl.SetCompleter(func(line string) []string { - var o []string - for k := range c.cmds { - if strings.HasPrefix(k, line) { - o = append(o, k+" ") - } - } - if len(o) > 0 { - return o - } - - for k, cmd := range c.cmds { - if strings.HasPrefix(line, k) { - o = append(o, cmd.Complete(line)...) - } - } - return o - }) - - f, err := os.Open(".pawgo.history") - if err == nil { - defer f.Close() - _, _ = c.rl.ReadHistory(f) - } - - return &c -} - -func (c *Cmd) Close() error { - var err error - - err = c.fmgr.Close() - if err != nil { - return fmt.Errorf("could not close file manager: %w", err) - } - - err = c.wmgr.Close() - if err != nil { - return fmt.Errorf("could not close window manager: %w", err) - } - - f, err := os.Create(".pawgo.history") - if err == nil { - defer f.Close() - _, _ = c.rl.WriteHistory(f) - } - - e := c.rl.Close() - if e != nil { - if err != nil { - err = e - } - } - if err != nil { - return fmt.Errorf("could not close REPL: %w", err) - } - - return nil -} - -func (c *Cmd) Run() error { - for { - o, err := c.rl.Prompt("paw> ") - if err != nil { - if err == io.EOF { - _, _ = c.msg.Writer().Write([]byte("\n")) - err = nil - } - return err - } - //fmt.Printf("<@ %q\n", o) - if o == "" { - continue - } - err = c.exec(o) - if err != nil { - if err == io.EOF { - return err - } - c.msg.Printf("error: %v\n", err) - } - c.rl.AppendHistory(o) - } -} - -func (c *Cmd) RunScript(r io.Reader) error { - scan := bufio.NewScanner(r) - for scan.Scan() { - err := scan.Err() - if err != nil { - break - } - line := scan.Text() - if line == "" || line[0] == '#' { - continue - } - fmt.Fprintf(c.msg.Writer(), "# %s\n", line) - err = c.exec(line) - if err == io.EOF { - return err - } - if err != nil { - c.msg.Printf("error executing %q: %v\n", line, err) - return err - } - } - - err := scan.Err() - if err == io.EOF { - err = nil - } - return err -} - -func (c *Cmd) exec(line string) error { - args, err := shlex.Split(line) - if err != nil { - return fmt.Errorf("paw: splitting line failed: %w", err) - } - cmd, ok := c.cmds[args[0]] - if !ok { - return fmt.Errorf("unknown command %q", args[0]) - } - err = cmd.Run(args[1:]) - return err -} diff --git a/pawgo/cmd_file.go b/pawgo/cmd_file.go deleted file mode 100644 index 72ae7ee95..000000000 --- a/pawgo/cmd_file.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright ©2015 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "io" - "path/filepath" - "strings" - - "github.com/google/shlex" -) - -// cmdFileOpen opens a file for read access -type cmdFileOpen struct { - ctx *Cmd -} - -func (cmd *cmdFileOpen) Name() string { - return "/file/open" -} - -func (cmd *cmdFileOpen) Run(args []string) error { - var err error - id := args[0] - fname := args[1] - err = cmd.ctx.fmgr.open(id, fname) - return err -} - -func (cmd *cmdFileOpen) Help(w io.Writer) { - fmt.Fprintf(w, "%s \t-- open file for read access\n", cmd.Name()) -} - -func (cmd *cmdFileOpen) Complete(line string) []string { - var o []string - args, err := shlex.Split(line) - if err != nil { - cmd.ctx.msg.Printf("error splitting line: %v\n", err) - return o - } - switch len(args) { - case 0: - return o - case 1: - // fmt.Printf(">>> %q\n", args[0]) - case 2: - // fmt.Printf("### %q %q\n", args[0], args[1]) - case 3: - // fmt.Printf("+++ %q %q %q\n", args[0], args[1], args[2]) - if args[2] != "" { - matches, err := filepath.Glob(args[2] + "*") - //fmt.Printf(">>> matches: %v\nerr=%v\n", matches, err) - if err != nil { - return o - } - for _, m := range matches { - mm := strings.Trim(m, "\t\n\r ") - if mm != "" { - args[2] = mm - o = append(o, strings.Join(args, " ")) - } - } - } - } - - return o -} - -// cmdFileCreate creates a file for write access -type cmdFileCreate struct { - ctx *Cmd -} - -func (cmd *cmdFileCreate) Name() string { - return "/file/create" -} - -func (cmd *cmdFileCreate) Run(args []string) error { - var err error - id := args[0] - fname := args[1] - err = cmd.ctx.fmgr.create(id, fname) - return err -} - -func (cmd *cmdFileCreate) Help(w io.Writer) { - fmt.Fprintf(w, "%s \t-- create file for write access\n", cmd.Name()) -} - -func (cmd *cmdFileCreate) Complete(line string) []string { - var o []string - return o -} - -// cmdFileClose closes a file -type cmdFileClose struct { - ctx *Cmd -} - -func (cmd *cmdFileClose) Name() string { - return "/file/close" -} - -func (cmd *cmdFileClose) Run(args []string) error { - var err error - id := args[0] - err = cmd.ctx.fmgr.close(id) - return err -} - -func (cmd *cmdFileClose) Help(w io.Writer) { - fmt.Fprintf(w, "%s \t-- close a file\n", cmd.Name()) -} - -func (cmd *cmdFileClose) Complete(line string) []string { - var o []string - return o -} - -// cmdFileList closes a file -type cmdFileList struct { - ctx *Cmd -} - -func (cmd *cmdFileList) Name() string { - return "/file/ls" -} - -func (cmd *cmdFileList) Run(args []string) error { - switch len(args) { - case 0: - return cmd.ctx.fmgr.ls("") - case 1: - return cmd.ctx.fmgr.ls(args[0]) - default: - return fmt.Errorf("%s: need at most 1 file id", cmd.Name()) - } -} - -func (cmd *cmdFileList) Help(w io.Writer) { - fmt.Fprintf(w, "%s \t-- list a file's content\n", cmd.Name()) -} - -func (cmd *cmdFileList) Complete(line string) []string { - var o []string - return o -} diff --git a/pawgo/cmd_help.go b/pawgo/cmd_help.go deleted file mode 100644 index da07b9632..000000000 --- a/pawgo/cmd_help.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright ©2015 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "io" - "sort" - "strings" - "text/tabwriter" -) - -// cmdHelp prints the help -type cmdHelp struct { - ctx *Cmd -} - -func (cmd *cmdHelp) Name() string { - return "/?" -} - -func (cmd *cmdHelp) Run(args []string) error { - var err error - switch len(args) { - case 0: - var cmds []string - for k := range cmd.ctx.cmds { - cmds = append(cmds, k) - } - sort.Strings(cmds) - w := tabwriter.NewWriter(cmd.ctx.msg.Writer(), 0, 8, 0, '\t', 0) - for _, k := range cmds { - c := cmd.ctx.cmds[k] - c.Help(w) - } - w.Flush() - case 1: - c, ok := cmd.ctx.cmds[args[0]] - if !ok { - return fmt.Errorf("unknown command %q", args[0]) - } - w := tabwriter.NewWriter(cmd.ctx.msg.Writer(), 0, 8, 0, '\t', 0) - c.Help(w) - w.Flush() - } - return err -} - -func (cmd *cmdHelp) Help(w io.Writer) { - fmt.Fprintf(w, "%s \t-- print help\n", cmd.Name()) -} - -func (cmd *cmdHelp) Complete(line string) []string { - var o []string - args := strings.Split(line, " ") - switch len(args) { - case 0, 1: - return o - case 2: - if args[1] == "" { - args[1] = "/" - } - for k := range cmd.ctx.cmds { - if strings.HasPrefix(k, args[1]) { - o = append(o, strings.Join(args[:1], " ")+" "+k) - } - } - } - return o -} diff --git a/pawgo/cmd_hist.go b/pawgo/cmd_hist.go deleted file mode 100644 index 8a3c041c1..000000000 --- a/pawgo/cmd_hist.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright ©2015 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "io" - "strings" -) - -// cmdHistOpen opens a histogram -type cmdHistOpen struct { - ctx *Cmd -} - -func (cmd *cmdHistOpen) Name() string { - return "/hist/open" -} - -func (cmd *cmdHistOpen) Run(args []string) error { - if len(args) < 2 { - return fmt.Errorf("%s: need histo-id and histo-name (got=%v)", cmd.Name(), args) - } - - hid := args[0] - - // e.g: /file/id/1/my-histo - hname := args[1] - - return cmd.ctx.hmgr.open(cmd.ctx.fmgr, hid, hname) -} - -func (cmd *cmdHistOpen) Help(w io.Writer) { - fmt.Fprintf(w, "%s \t-- open a histogram\n", cmd.Name()) -} - -func (cmd *cmdHistOpen) Complete(line string) []string { - var o []string - args := strings.Split(line, " ") - switch len(args) { - case 0, 1: - return o - case 2: - return o - case 3: - if args[2] == "" { - args[2] = "/file/id/" - } - for id := range cmd.ctx.fmgr.rfds { - switch { - case strings.HasPrefix("/file/id/"+id+"/", args[2]): - r := cmd.ctx.fmgr.rfds[id] - v := "/file/id/" + id + "/" - for _, k := range r.rio.Keys() { - if strings.HasPrefix(v+k.Name, args[2]) { - o = append(o, strings.Join(args[:2], " ")+" "+v+k.Name) - } - } - case strings.HasPrefix("/file/id/"+id, args[2]): - o = append(o, strings.Join(args[:2], " ")+" /file/id/"+id) - } - } - } - return o -} - -// cmdHistPlot plots a histogram -type cmdHistPlot struct { - ctx *Cmd -} - -func (cmd *cmdHistPlot) Name() string { - return "/hist/plot" -} - -func (cmd *cmdHistPlot) Run(args []string) error { - if len(args) < 1 { - return fmt.Errorf("%s: need a histo-id to plot", cmd.Name()) - } - - hid := args[0] - _, err := cmd.ctx.hmgr.plot(cmd.ctx.fmgr, cmd.ctx.wmgr, hid) - if err != nil { - return fmt.Errorf("could not plot histo %s: %w", hid, err) - } - return nil -} - -func (cmd *cmdHistPlot) Help(w io.Writer) { - fmt.Fprintf(w, "%s \t-- plot a histogram\n", cmd.Name()) -} - -func (cmd *cmdHistPlot) Complete(line string) []string { - var o []string - args := strings.Split(line, " ") - switch len(args) { - case 0, 1: - return o - case 2: - if strings.HasPrefix(args[1], "/") { - for id, r := range cmd.ctx.fmgr.rfds { - for _, k := range r.rio.Keys() { - name := "/file/id/" + id + "/" + k.Name - if strings.HasPrefix(name, args[1]) { - o = append(o, args[0]+" "+name) - } - } - } - return o - } - for k := range cmd.ctx.hmgr.hmap { - if strings.HasPrefix(k, args[1]) { - o = append(o, args[0]+" "+k) - } - } - return o - } - return o -} diff --git a/pawgo/cmd_quit.go b/pawgo/cmd_quit.go deleted file mode 100644 index 5e8f90e93..000000000 --- a/pawgo/cmd_quit.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright ©2016 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "io" -) - -// cmdQuit exits the application. -type cmdQuit struct { - ctx *Cmd -} - -func (cmd *cmdQuit) Name() string { - return "/quit" -} - -func (cmd *cmdQuit) Run(args []string) error { - return io.EOF -} - -func (cmd *cmdQuit) Help(w io.Writer) { - fmt.Fprintf(w, "%s \t-- quit PAW-Go\n", cmd.Name()) -} - -func (cmd *cmdQuit) Complete(line string) []string { - var o []string - return o -} diff --git a/pawgo/cmd_shell.go b/pawgo/cmd_shell.go deleted file mode 100644 index 64f187df6..000000000 --- a/pawgo/cmd_shell.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright ©2016 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "io" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/google/shlex" -) - -// cmdShell runs a shell command. -type cmdShell struct { - ctx *Cmd -} - -func (cmd *cmdShell) Name() string { - return "/!" -} - -func (cmd *cmdShell) Run(args []string) error { - sh := exec.Command(args[0], args[1:]...) - sh.Stdin = os.Stdin - sh.Stdout = cmd.ctx.msg.Writer() - sh.Stderr = cmd.ctx.msg.Writer() - return sh.Run() -} - -func (cmd *cmdShell) Help(w io.Writer) { - fmt.Fprintf(w, "%s \t-- run a shell command\n", cmd.Name()) -} - -func (cmd *cmdShell) Complete(line string) []string { - var o []string - args, err := shlex.Split(line) - if err != nil { - cmd.ctx.msg.Printf("error splitting line: %v\n", err) - return o - } - if len(args) < 2 { - return o - } - i := len(args) - 1 - if args[i] != "" { - matches, err := filepath.Glob(args[i] + "*") - //fmt.Printf(">>> matches: %v\nerr=%v\n", matches, err) - if err != nil { - return o - } - for _, m := range matches { - mm := strings.Trim(m, "\t\n\r ") - if mm != "" { - args[i] = mm - o = append(o, strings.Join(args, " ")) - } - } - } - - return o -} diff --git a/pawgo/fmgr.go b/pawgo/fmgr.go deleted file mode 100644 index a48e6ee9d..000000000 --- a/pawgo/fmgr.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright ©2017 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "io" - "log" - "os" - "text/tabwriter" - - "go-hep.org/x/hep/rio" -) - -type fileType interface { - io.Reader - io.Seeker - io.Closer -} - -type rfile struct { - id string - n string - r fileType - rio *rio.File -} - -func (r *rfile) open(fname string) error { - var err error - - r.n = fname - r.r, err = os.Open(fname) - if err != nil { - return err - } - - r.rio, err = rio.Open(r.r) - if err != nil { - return err - } - - return err -} - -func (r *rfile) ls(o io.Writer) error { - var err error - - fmt.Fprintf(o, "/file/id/%s name=%s\n", r.id, r.n) - w := tabwriter.NewWriter(o, 0, 8, 0, '\t', 0) - for _, k := range r.rio.Keys() { - fmt.Fprintf(w, " \t- %s\t(type=%q)\n", k.Name, k.Blocks[0].Type) - } - w.Flush() - fmt.Fprintf(o, "\n") - - return err -} - -func (r *rfile) typ(name string) string { - for _, k := range r.rio.Keys() { - if k.Name == name { - return k.Blocks[0].Type - } - } - - return "" -} - -func (r *rfile) read(name string, ptr interface{}) error { - var err error - - // FIXME(sbinet): when/if "rio" gets the concept of directories, - // handle this there. - if !r.rio.Has(name) { - return fmt.Errorf("no record [%s] in file [id=%s name=%s]", name, r.id, r.n) - } - - err = r.rio.Get(name, ptr) - if err != nil { - return err - } - - return err -} - -func (r *rfile) close() error { - defer r.r.Close() - err := r.rio.Close() - if err != nil { - return err - } - return r.r.Close() -} - -type wfile struct { - id string - n string - w io.WriteCloser - rio *rio.Writer -} - -func (w *wfile) create(fname string) error { - var err error - - w.n = fname - w.w, err = os.Create(fname) - if err != nil { - return err - } - - w.rio, err = rio.NewWriter(w.w) - if err != nil { - return err - } - - return err -} - -func (w *wfile) close() error { - defer w.w.Close() - err := w.rio.Close() - if err != nil { - return err - } - return w.w.Close() -} - -type fileMgr struct { - msg *log.Logger - rfds map[string]rfile - wfds map[string]wfile -} - -func newFileMgr(msg *log.Logger) *fileMgr { - return &fileMgr{ - msg: msg, - rfds: make(map[string]rfile), - wfds: make(map[string]wfile), - } -} - -func (mgr *fileMgr) open(id string, fname string) error { - var err error - r, dup := mgr.rfds[id] - if dup { - return fmt.Errorf("paw: file [id=%s name=%s] already open", id, r.n) - } - - r.id = id - err = r.open(fname) - if err != nil { - return err - } - - mgr.rfds[id] = r - return nil -} - -func (mgr *fileMgr) close(id string) error { - r, ok := mgr.rfds[id] - if ok { - delete(mgr.rfds, id) - return r.close() - } - - w, ok := mgr.wfds[id] - if ok { - delete(mgr.wfds, id) - return w.close() - } - - return fmt.Errorf("paw: unknown file [id=%s]", id) -} - -func (mgr *fileMgr) ls(id string) error { - if id == "" { - // list all - for id := range mgr.rfds { - err := mgr.ls(id) - if err != nil { - return err - } - } - return nil - } - - r, ok := mgr.rfds[id] - if !ok { - return fmt.Errorf("paw: unknown file [id=%s]", id) - } - - err := r.ls(mgr.msg.Writer()) - if err != nil { - return err - } - - return err -} - -func (mgr *fileMgr) create(id string, fname string) error { - var err error - w, dup := mgr.wfds[id] - if dup { - return fmt.Errorf("paw: file [id=%s name=%s] already open", id, w.n) - } - - w.id = id - err = w.create(fname) - if err != nil { - return err - } - - mgr.wfds[id] = w - return nil -} - -func (mgr *fileMgr) Close() error { - var err error - for k, r := range mgr.rfds { - e := r.close() - if e != nil { - mgr.msg.Printf("error closing file [%s]: %v\n", k, e) - if err != nil { - err = e - } - } - } - - for k, w := range mgr.wfds { - e := w.close() - if e != nil { - mgr.msg.Printf("error closing file [%s]: %v\n", k, e) - if err != nil { - err = e - } - } - } - - return err -} diff --git a/pawgo/gen.hsimple.rio.go b/pawgo/gen.hsimple.rio.go deleted file mode 100644 index 6d09be13c..000000000 --- a/pawgo/gen.hsimple.rio.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright ©2020 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build ignore - -package main - -import ( - "log" - "os" - - "go-hep.org/x/hep/hbook" - "go-hep.org/x/hep/rio" - "golang.org/x/exp/rand" - "gonum.org/v1/gonum/mat" - "gonum.org/v1/gonum/stat/distmv" - "gonum.org/v1/gonum/stat/distuv" -) - -func main() { - h1 := genH1() - h2 := genH2() - s2 := genS2() - p1 := genP1() - - f, err := os.Create("testdata/hsimple.rio") - if err != nil { - log.Fatalf("could not create file: %+v", err) - } - defer f.Close() - - w, err := rio.NewWriter(f) - if err != nil { - log.Fatalf("could not create rio writer: %+v", err) - } - - for _, v := range []struct { - name string - value interface{} - }{ - {"h1", h1}, - {"h2", h2}, - {"s2", s2}, - {"p1", p1}, - } { - err = w.WriteValue(v.name, v.value) - if err != nil { - log.Fatalf("could not write %q: %+v", v.name, err) - } - } - - err = w.Close() - if err != nil { - log.Fatalf("could not close rio writer: %+v", err) - } - - err = f.Close() - if err != nil { - log.Fatalf("could not close file: %+v", err) - } -} - -func genH1() *hbook.H1D { - const npoints = 10000 - - // Create a normal distribution. - dist := distuv.Normal{ - Mu: 0, - Sigma: 1, - Src: rand.New(rand.NewSource(0)), - } - - // Draw some random values from the standard - // normal distribution. - h := hbook.NewH1D(20, -4, +4) - for i := 0; i < npoints; i++ { - v := dist.Rand() - h.Fill(v, 1) - } - - return h -} - -func genH2() *hbook.H2D { - h := hbook.NewH2D(100, -10, 10, 100, -10, 10) - - const npoints = 10000 - - dist, ok := distmv.NewNormal( - []float64{0, 1}, - mat.NewSymDense(2, []float64{4, 0, 0, 2}), - rand.New(rand.NewSource(1234)), - ) - if !ok { - log.Fatalf("error creating distmv.Normal") - } - - v := make([]float64, 2) - // Draw some random values from the standard - // normal distribution. - for i := 0; i < npoints; i++ { - v = dist.Rand(v) - h.Fill(v[0], v[1], 1) - } - - return h -} - -func genS2() *hbook.S2D { - s := hbook.NewS2D(hbook.Point2D{X: 1, Y: 1}, hbook.Point2D{X: 2, Y: 1.5}, hbook.Point2D{X: -1, Y: +2}) - if s == nil { - log.Fatal("nil pointer to S2D") - } - - s.Fill(hbook.Point2D{X: 10, Y: -10, ErrX: hbook.Range{Min: 5, Max: 5}, ErrY: hbook.Range{Min: 6, Max: 6}}) - - return s -} - -func genP1() *hbook.P1D { - const npoints = 1000 - - p := hbook.NewP1D(100, -10, 10) - dist, ok := distmv.NewNormal( - []float64{0, 1}, - mat.NewSymDense(2, []float64{4, 0, 0, 2}), - rand.New(rand.NewSource(1234)), - ) - if !ok { - log.Fatalf("error creating distmv.Normal") - } - - v := make([]float64, 2) - // Draw some random values from the standard - // normal distribution. - for i := 0; i < npoints; i++ { - v = dist.Rand(v) - p.Fill(v[0], v[1], 1) - } - - return p -} diff --git a/pawgo/hmgr.go b/pawgo/hmgr.go deleted file mode 100644 index 36d7dca15..000000000 --- a/pawgo/hmgr.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright ©2017 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "log" - "strings" - - "go-hep.org/x/hep/hbook" - "go-hep.org/x/hep/hplot" -) - -type histMgr struct { - msg *log.Logger - hmap map[string]hbook.Histogram -} - -func newHistMgr(msg *log.Logger) *histMgr { - return &histMgr{ - msg: msg, - hmap: make(map[string]hbook.Histogram), - } -} - -func (mgr *histMgr) find(fmgr *fileMgr, path string) (hbook.Histogram, error) { - var err error - const prefix = "/file/id/" - if !strings.HasPrefix(path, prefix) { - return nil, fmt.Errorf("invalid path [%s] (missing prefix [%s])", path, prefix) - } - - var toks []string - for _, tok := range strings.Split(path[len(prefix):], "/") { - tok = strings.TrimSpace(tok) - if tok == "" { - continue - } - toks = append(toks, tok) - } - - if len(toks) < 2 { - return nil, fmt.Errorf("invalid path [%s] (missing file-id and histo-name)", path) - } - - fid := toks[0] - - r, ok := fmgr.rfds[fid] - if !ok { - return nil, fmt.Errorf("unknown file-id [%s]", fid) - } - - hname := strings.Join(toks[1:], "/") - - switch r.typ(hname) { - case "*go-hep.org/x/hep/hbook.H1D": - var h1 hbook.H1D - err = r.read(hname, &h1) - if err != nil { - return nil, err - } - return &h1, nil - - case "*go-hep.org/x/hep/hbook.H2D": - var h2 hbook.H2D - err = r.read(hname, &h2) - if err != nil { - return nil, err - } - return &h2, nil - - default: - return nil, fmt.Errorf("%q not an histogram (%s)", path, r.typ(hname)) - } -} - -func (mgr *histMgr) open(fmgr *fileMgr, hid, path string) error { - h, err := mgr.find(fmgr, path) - if err != nil { - return err - } - mgr.hmap[hid] = h - return nil -} - -func (mgr *histMgr) plot(fmgr *fileMgr, wmgr *winMgr, hid string) (*window, error) { - var ( - h hbook.Histogram - err error - ) - if strings.HasPrefix(hid, "/file/id/") { - // directly plot from file - h, err = mgr.find(fmgr, hid) - if err != nil { - return nil, err - } - } else { - var ok bool - h, ok = mgr.hmap[hid] - if !ok { - return nil, fmt.Errorf("unknown histogram [id=%s]", hid) - } - } - - switch h := h.(type) { - case *hbook.H1D: - return mgr.plotH1D(wmgr, h) - case *hbook.H2D: - return mgr.plotH2D(wmgr, h) - } - - return nil, fmt.Errorf("unknown histogram type %T [id=%s]", h, hid) -} - -func (mgr *histMgr) plotH1D(wmgr *winMgr, h *hbook.H1D) (*window, error) { - fmt.Fprintf( - mgr.msg.Writer(), - "== h1d: name=%q\nentries=%d\nmean=%+8.3f\nRMS= %+8.3f\n", - h.Name(), h.Entries(), h.XMean(), h.XRMS(), - ) - - p := hplot.New() - p.Title.Text = h.Name() - p.X.Label.Text = "x" - p.Y.Label.Text = "y" - - hh := hplot.NewH1D(h) - hh.Infos.Style = hplot.HInfoSummary - - p.Add(hh) - p.Add(hplot.NewGrid()) - - win := wmgr.newPlot(p) - return win, nil -} - -func (mgr *histMgr) plotH2D(wmgr *winMgr, h *hbook.H2D) (*window, error) { - fmt.Fprintf( - mgr.msg.Writer(), - "== h2d: name=%q\nentries=%d\nxmean=%+8.3f\nxRMS= %+8.3f\nymean=%+8.3f\nyRMS= %+8.3f\n", - h.Name(), h.Entries(), - h.XMean(), h.XRMS(), - h.YMean(), h.YRMS(), - ) - - p := hplot.New() - p.Title.Text = h.Name() - p.X.Label.Text = "x" - p.Y.Label.Text = "y" - - hh := hplot.NewH2D(h, nil) - hh.Infos.Style = hplot.HInfoNone - - p.Add(hh) - p.Add(hplot.NewGrid()) - - win := wmgr.newPlot(p) - return win, nil -} diff --git a/pawgo/main.go b/pawgo/main.go deleted file mode 100644 index df001d949..000000000 --- a/pawgo/main.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright ©2015 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// pawgo is a simple interactive shell to quickly plot hbook histograms from -// rio files. -// -// Example: -// -// $> pawgo -// paw> /file/open f testdata/issue-120.rio -// paw> /file/ls f -// /file/id/f name=testdata/issue-120.rio -// - MonoH_Truth/jets (type="*go-hep.org/x/hep/hbook.H1D") -// -// paw> /hist/open h /file/id/f/MonoH_Truth/jets -// paw> /hist/plot h -// == h1d: name="MonoH_Truth/jets" -// entries=20000 -// mean= +2.554 -// RMS= +2.891 -// paw> /? -// /! -- run a shell command -// /? -- print help -// /file/close -- close a file -// /file/create -- create file for write access -// /file/list -- list a file's content -// /file/open -- open file for read access -// /hist/open -- open a histogram -// /hist/plot -- plot a histogram -// /quit -- quit PAW-Go -package main // import "go-hep.org/x/hep/pawgo" - -//go:generate go run ./gen.hsimple.go - -import ( - "flag" - "fmt" - "io" - "os" -) - -func main() { - interactive := flag.Bool( - "i", false, - "enable interactive mode: drop into PAW-Go prompt after processing script files", - ) - - flag.Parse() - - go func() { - rc := xmain(os.Stdout, *interactive, flag.Args()) - os.Exit(rc) - }() - - appMain() -} - -func xmain(stdout io.Writer, interactive bool, args []string) int { - - fmt.Fprintf(stdout, ` -::::::::::::::::::::::::::::: -::: Welcome to PAW-Go ::: -::::::::::::::::::::::::::::: - -Type /? for help. -^D or /quit to quit. - -`) - - icmd := newCmd(stdout) - defer icmd.Close() - defer fmt.Fprintf(stdout, "bye.\n") - - if len(args) > 0 { - for _, fname := range args { - rc := func(fname string) int { - f, err := os.Open(fname) - if err != nil { - icmd.msg.Printf("error: %+v\n", err) - return 1 - } - defer f.Close() - - err = icmd.RunScript(f) - if err == io.EOF { - return 0 - } - if err != nil { - icmd.msg.Printf("error running script [%s]: %+v\n", f.Name(), err) - return 1 - } - - return 0 - }(fname) - - if rc != 0 { - return rc - } - } - if !interactive { - return 0 - } - } - - err := icmd.Run() - if err == io.EOF { - err = nil - } - if err != nil { - icmd.msg.Printf("error running interpreter: %v\n", err) - return 1 - } - - return 0 -} diff --git a/pawgo/main_test.go b/pawgo/main_test.go deleted file mode 100644 index 92263ecc8..000000000 --- a/pawgo/main_test.go +++ /dev/null @@ -1,295 +0,0 @@ -// Copyright ©2020 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "bytes" - "os" - "path" - "runtime" - "testing" - - "github.com/google/go-cmp/cmp" -) - -func TestPawgo(t *testing.T) { - var ( - stdout = new(bytes.Buffer) - interactive bool - args []string - ) - - rc := xmain(stdout, interactive, args) - if rc != 0 { - t.Fatalf("invalid exit-code: %d", rc) - } -} - -func TestPawgoScript(t *testing.T) { - tmp, err := os.MkdirTemp("", "pawgo-") - if err != nil { - t.Fatalf("could not create tmpdir: %+v", err) - } - defer os.RemoveAll(tmp) - - for _, tc := range []struct { - name string - script string - want string - interactive bool - }{ - { - name: "basic", - script: `## comment - -## open the rio file hsimple.rio, assign it the variable name 'f' -/file/open f ./testdata/hsimple.rio - -## list the content of the rio file 'f' -/file/ls f - -## open the hbook.H1D histogram 'h1' from file 'f', assign it the variable name 'h' -/hist/open h /file/id/f/h1 - -/file/close f -`, - want: ` -::::::::::::::::::::::::::::: -::: Welcome to PAW-Go ::: -::::::::::::::::::::::::::::: - -Type /? for help. -^D or /quit to quit. - -# /file/open f ./testdata/hsimple.rio -# /file/ls f -/file/id/f name=./testdata/hsimple.rio - - h1 (type="*go-hep.org/x/hep/hbook.H1D") - - h2 (type="*go-hep.org/x/hep/hbook.H2D") - - p1 (type="*go-hep.org/x/hep/hbook.P1D") - - s2 (type="*go-hep.org/x/hep/hbook.S2D") - -# /hist/open h /file/id/f/h1 -# /file/close f -bye. -`, - interactive: false, - }, - { - name: "help", - script: "/?\n/? /file/open", - want: ` -::::::::::::::::::::::::::::: -::: Welcome to PAW-Go ::: -::::::::::::::::::::::::::::: - -Type /? for help. -^D or /quit to quit. - -# /? -/! -- run a shell command -/? -- print help -/file/close -- close a file -/file/create -- create file for write access -/file/ls -- list a file's content -/file/open -- open file for read access -/hist/open -- open a histogram -/hist/plot -- plot a histogram -/quit -- quit PAW-Go -# /? /file/open -/file/open -- open file for read access -bye. -`, - interactive: false, - }, - { - name: "quit", - script: "/quit\n", - want: ` -::::::::::::::::::::::::::::: -::: Welcome to PAW-Go ::: -::::::::::::::::::::::::::::: - -Type /? for help. -^D or /quit to quit. - -# /quit -bye. -`, - interactive: false, - }, - { - name: "hplot-cmd", - script: `## comment - -/file/open f ./testdata/hsimple.rio -/hist/open h1 /file/id/f/h1 -/hist/plot h1 -/hist/open h2 /file/id/f/h2 -/hist/plot h2 -/quit -`, - want: ` -::::::::::::::::::::::::::::: -::: Welcome to PAW-Go ::: -::::::::::::::::::::::::::::: - -Type /? for help. -^D or /quit to quit. - -# /file/open f ./testdata/hsimple.rio -# /hist/open h1 /file/id/f/h1 -# /hist/plot h1 -== h1d: name="" -entries=10000 -mean= +0.004 -RMS= +1.005 -# /hist/open h2 /file/id/f/h2 -# /hist/plot h2 -== h2d: name="" -entries=10000 -xmean= +0.027 -xRMS= +2.003 -ymean= +0.992 -yRMS= +1.723 -# /quit -bye. -`, - interactive: false, - }, - } { - t.Run(tc.name, func(t *testing.T) { - var ( - stdout = new(bytes.Buffer) - fname = path.Join(tmp, tc.name+".paw") - args = []string{fname} - ) - - err = os.WriteFile(fname, []byte(tc.script), 0644) - - rc := xmain(stdout, tc.interactive, args) - if rc != 0 { - t.Fatalf("invalid exit-code: %d", rc) - } - - if got, want := stdout.String(), tc.want; got != want { - t.Fatalf("stdout differ:\n%s\n", - cmp.Diff( - string(want), - string(got), - ), - ) - } - }) - } -} - -func TestPawgoShellCommand(t *testing.T) { - tmp, err := os.MkdirTemp("", "pawgo-") - if err != nil { - t.Fatalf("could not create tmpdir: %+v", err) - } - defer os.RemoveAll(tmp) - - var ( - stdout = new(bytes.Buffer) - interactive bool - fname = path.Join(tmp, "script.paw") - args = []string{fname} - ) - - script := "/! ls testdata\n" - if runtime.GOOS == "windows" { - script = "/! dir testdata\n" - } - - err = os.WriteFile(fname, []byte(script), 0644) - if err != nil { - t.Fatal(err) - } - - rc := xmain(stdout, interactive, args) - if rc != 0 { - t.Fatalf("invalid exit-code: %d", rc) - } - - want := "" - switch runtime.GOOS { - case "windows": - want = ` -::::::::::::::::::::::::::::: -::: Welcome to PAW-Go ::: -::::::::::::::::::::::::::::: - -Type /? for help. -^D or /quit to quit. - -# /! dir testdata -hsimple.rio issue-120.paw issue-120.rio script.paw -bye. -` - - default: - want = ` -::::::::::::::::::::::::::::: -::: Welcome to PAW-Go ::: -::::::::::::::::::::::::::::: - -Type /? for help. -^D or /quit to quit. - -# /! ls testdata -hsimple.rio -issue-120.paw -issue-120.rio -script.paw -bye. -` - } - - if got, want := stdout.String(), want; got != want { - t.Fatalf("stdout differ:\n%s\n", - cmp.Diff( - string(want), - string(got), - ), - ) - } -} - -func TestIssue120(t *testing.T) { - var ( - stdout = new(bytes.Buffer) - interactive bool - args = []string{"./testdata/issue-120.paw"} - ) - - rc := xmain(stdout, interactive, args) - if rc != 0 { - t.Fatalf("invalid exit-code: %d", rc) - } - - want := ` -::::::::::::::::::::::::::::: -::: Welcome to PAW-Go ::: -::::::::::::::::::::::::::::: - -Type /? for help. -^D or /quit to quit. - -# /file/open f ./testdata/issue-120.rio -# /hist/open h /file/id/f/MonoH_Truth/jets -bye. -` - - if got, want := stdout.String(), want; got != want { - t.Fatalf("stdout differ:\n%s\n", - cmp.Diff( - string(want), - string(got), - ), - ) - } -} diff --git a/pawgo/testdata/hsimple.rio b/pawgo/testdata/hsimple.rio deleted file mode 100644 index 29690b5144a2e7856555e1cc9bebc1c764ab5f17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129980 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⑬fMX>FS9!Qq%bdsA{#Gjydb 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 U&i7}5#(Q=yZfFc7`rzxo0PDJ;KmY&$ diff --git a/pawgo/testdata/issue-120.paw b/pawgo/testdata/issue-120.paw deleted file mode 100644 index 78dc1be9d..000000000 --- a/pawgo/testdata/issue-120.paw +++ /dev/null @@ -1,3 +0,0 @@ -/file/open f ./testdata/issue-120.rio -/hist/open h /file/id/f/MonoH_Truth/jets - diff --git a/pawgo/testdata/issue-120.rio b/pawgo/testdata/issue-120.rio deleted file mode 100644 index 9ef05f97a9cb6ee42b552dff335636b90b362b5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmV;-12g<`X>R}t0{{T4t;+rY@B;t|0{{Tf2mk;O0000@Z*Ff$UsQ5+bZ9SXWps0R zoLbAlz;JKvzV{3a3=9Gc3=F>cdHEjkAw{Jn8TwhNCB;iQ7$5*ji$b{pP+EWi89dkz zrR@!%A`(#g5R?wQPDDXuLSb|5cQgF8gYci&-<+bo=XC2A z9Okk(KxiHebE}{Mn4Q1u$GY$5?0ud%=x(0;&FFcS}?A^+E z6)rqHVE1IgVX?vw2kf`56lGkQ@e+r*Qc!c{FwA`n3y;>1%+56FGk=?9o z4`SS1m)a}v-!Par=MoNc<)G#&VwmdzrIV&8I|}Yjw14=kqV0}tm!0vN`eeb~6YZY` zEqf%e`ydW;6`|%TW0?5ZdxqlIw(AOJ<8ZGg)Ld;U zyH^`(t}d0$)rFd?Pi1rUA?7w1P}kfB1E{%%R5sTTYOWEL%{79WYfNQxjiKh6kZmqT z{`W(c{a}CgF88^wkHqYizs@_Ana|=-5I5&X)^-J|*+(qETCX>lI823#@cnOOVPyK> z#K6eID8Rt*zvX`u11n2jVs0v1aY<2TUOJBug8+JCf+ILNF();}sS>6}l0n>3&)m$+ z%+l1-%+lP<)YQz>(lAxqz=$;@vm^&@783&lTZB(yQfdyeNF=%l0|Ns90096000019 z00021t;+rY@B;u|0001h000090000ka%pcaZDn*}0001ZoJwY3V7Rw--+KlI1_n+B z1_r&N%zVAv)RII71_nj}-~7CMkNA+H(vl4QtkjZXOc80V^nBfn)B?TyqICTV{fyKC u{fwmi{A@iBLl-RiSr{O|gc-^J00030{{R3G0002W{<^+60{{R30002VOx&XY diff --git a/pawgo/testdata/script.paw b/pawgo/testdata/script.paw deleted file mode 100644 index f3291cfd4..000000000 --- a/pawgo/testdata/script.paw +++ /dev/null @@ -1,21 +0,0 @@ -## a simple PAW-Go test script - -## /! runs a shell command -/! ls ./testdata - -## open the rio file hsimple.rio, assign it the variable name 'f' -/file/open f ./testdata/hsimple.rio - -## list the content of the rio file 'f' -/file/ls f - -## open the hbook.H1D histogram 'h1' from file 'f', assign it the variable name 'h' -/hist/open h /file/id/f/h1 - -## plot the hbook.H1D histogram 'h' -/hist/plot h - -## leaving /quit uncommented will make PAW-Go exit -# /quit - -## EOF diff --git a/pawgo/wmgr.go b/pawgo/wmgr.go deleted file mode 100644 index 647feaa5f..000000000 --- a/pawgo/wmgr.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright ©2017 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !cross_compile - -package main - -import ( - "log" - "math" - "sync" - - "gioui.org/app" - "gioui.org/io/event" - "gioui.org/io/key" - "gioui.org/io/system" - "gioui.org/layout" - "gioui.org/op" - "gioui.org/op/clip" - "gioui.org/unit" - "go-hep.org/x/hep/hplot" - "gonum.org/v1/plot/vg" - "gonum.org/v1/plot/vg/draw" - "gonum.org/v1/plot/vg/vggio" -) - -const ( - xmax = vg.Length(400) - ymax = vg.Length(400 / math.Phi) - dpi = vggio.DefaultDPI // FIXME(sbinet): remove? -) - -type winMgr struct { - msg *log.Logger - quit chan int - once sync.Once - wg sync.WaitGroup -} - -func newWinMgr(msg *log.Logger) *winMgr { - return &winMgr{ - msg: msg, - quit: make(chan int), - } -} - -func (wmgr *winMgr) Close() error { - wmgr.once.Do(wmgr.doClose) - return nil -} - -func (wmgr *winMgr) doClose() { - close(wmgr.quit) -} - -func (wmgr *winMgr) newPlot(p *hplot.Plot) *window { - wmgr.wg.Add(1) - win := newWindow(p) - go win.run(wmgr) - return win -} - -type window struct { - w *app.Window - keys key.Set - ready chan int - - mu sync.Mutex - plt *hplot.Plot -} - -func newWindow(p *hplot.Plot) *window { - title := p.Plot.Title.Text - switch title { - case "": - title = "PAW-Go" - default: - title = "PAW-Go [" + title + "]" - } - - x := unit.Dp(float32(xmax.Dots(dpi))) - y := unit.Dp(float32(ymax.Dots(dpi))) - - win := &window{ - w: app.NewWindow(app.Title(title), app.Size(x, y)), - keys: key.NameEscape + "|Q", - plt: p, - ready: make(chan int), - } - return win -} - -func (w *window) run(wmgr *winMgr) { - defer wmgr.wg.Done() - close(w.ready) - - for { - select { - case e := <-w.w.Events(): - o := w.handle(e) - if o == winStop { - return - } - case <-wmgr.quit: - return - } - } -} - -type winState byte - -const ( - winContinue winState = iota - winStop -) - -func (w *window) handle(e event.Event) winState { - switch e := e.(type) { - case system.DestroyEvent: - return winStop - case system.FrameEvent: - var ( - ops op.Ops - gtx = layout.NewContext(&ops, e) - ) - // register a global key listener for the escape key wrapping our entire UI. - area := clip.Rect{Max: gtx.Constraints.Max}.Push(gtx.Ops) - key.InputOp{ - Tag: w.w, - Keys: w.keys, - }.Add(gtx.Ops) - - for _, e := range gtx.Events(w.w) { - switch e := e.(type) { - case key.Event: - switch e.Name { - case "Q", key.NameEscape: - return winStop - } - } - } - area.Pop() - - cnv := vggio.New( - gtx, - xmax, ymax, - vggio.UseDPI(dpi), - ) - w.mu.Lock() - w.plt.Draw(draw.New(cnv)) - w.mu.Unlock() - e.Frame(cnv.Paint()) - } - return winContinue -} diff --git a/pawgo/wmgr_test.go b/pawgo/wmgr_test.go deleted file mode 100644 index 81d5172b3..000000000 --- a/pawgo/wmgr_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright ©2020 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "testing" - - "gioui.org/io/key" - "gioui.org/io/router" - "gioui.org/io/system" - "gioui.org/op" - "go-hep.org/x/hep/hplot" -) - -func TestPlot(t *testing.T) { - wmgr := newWinMgr(nil) - defer wmgr.Close() - - p := hplot.New() - p.Title.Text = "my plot" - p.X.Label.Text = "x" - p.Y.Label.Text = "y" - - win := wmgr.newPlot(p) - <-win.ready - - rc := win.handle(system.FrameEvent{ - Frame: func(frame *op.Ops) {}, - Queue: new(router.Router), - }) - if got, want := rc, winContinue; got != want { - t.Fatalf("invalid window state: got=%v, want=%v", got, want) - } - - rc = win.handle(key.Event{Name: "Q"}) - if got, want := rc, winContinue; got != want { - t.Fatalf("invalid window state: got=%v, want=%v", got, want) - } - - rc = win.handle(system.DestroyEvent{Err: nil}) - if got, want := rc, winStop; got != want { - t.Fatalf("invalid window state: got=%v, want=%v", got, want) - } - - err := wmgr.Close() - if err != nil { - t.Fatalf("could not close wmgr: %+v", err) - } - - wmgr.wg.Wait() -} diff --git a/pawgo/wmgr_xcomp.go b/pawgo/wmgr_xcomp.go deleted file mode 100644 index 6d7b2a50a..000000000 --- a/pawgo/wmgr_xcomp.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright ©2020 The go-hep Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build cross_compile - -package main - -import ( - "log" - - "go-hep.org/x/hep/hplot" -) - -type winMgr struct { - msg *log.Logger -} - -func newWinMgr(msg *log.Logger) *winMgr { - return &winMgr{ - msg: msg, - } -} - -func (wmgr *winMgr) newPlot(p *hplot.Plot) *window { - return nil -} - -func (wmgr *winMgr) Close() error { - return nil -} - -type window struct { -} From 8caf0ce343810ce80e97df9883fa91b62f813ee0 Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Mon, 17 Feb 2025 10:26:13 +0100 Subject: [PATCH 7/9] all: remove gioui dependency Signed-off-by: Sebastien Binet --- go.mod | 18 ++++-------------- go.sum | 45 ++++++++------------------------------------- 2 files changed, 12 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index 235346e9f..8ec071e8e 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module go-hep.org/x/hep go 1.22.0 require ( - gioui.org v0.3.0 git.sr.ht/~sbinet/epok v0.5.0 git.sr.ht/~sbinet/go-arrow v0.2.0 github.com/astrogo/fitsio v0.3.0 @@ -12,11 +11,9 @@ require ( github.com/gonuts/binary v0.2.0 github.com/gonuts/commander v0.4.1 github.com/google/go-cmp v0.6.0 - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/hashicorp/go-uuid v1.0.3 github.com/jcmturner/gokrb5/v8 v8.4.4 github.com/klauspost/compress v1.17.11 - github.com/peterh/liner v1.2.2 github.com/pierrec/lz4/v4 v4.1.22 github.com/pierrec/xxHash v0.1.5 github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e @@ -36,17 +33,12 @@ require ( ) require ( - gioui.org/cpu v0.0.0-20220412190645-f1e9e8c3b1f7 // indirect - gioui.org/shader v1.0.6 // indirect - gioui.org/x v0.3.0 // indirect git.sr.ht/~sbinet/gg v0.6.0 // indirect github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b // indirect - github.com/andybalholm/stroke v0.0.0-20230904101225-24ef450bc62c // indirect github.com/edsrzf/mmap-go v1.2.0 // indirect github.com/go-fonts/liberation v0.3.3 // indirect github.com/go-latex/latex v0.0.0-20240709081214-31cef3c7570e // indirect github.com/go-pdf/fpdf v0.9.0 // indirect - github.com/go-text/typesetting v0.0.0-20230905121921-abdbcca6e0eb // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/google/flatbuffers v23.5.26+incompatible // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -55,13 +47,11 @@ require ( github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/posener/complete v1.2.3 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/rivo/uniseg v0.4.7 // indirect + github.com/stretchr/testify v1.9.0 // indirect github.com/teambition/rrule-go v1.8.2 // indirect - golang.org/x/exp/shiny v0.0.0-20241009180824-f66d83c29e7c // indirect golang.org/x/mod v0.22.0 // indirect golang.org/x/net v0.33.0 // indirect golang.org/x/sys v0.28.0 // indirect @@ -72,9 +62,9 @@ require ( modernc.org/golex v1.1.0 // indirect modernc.org/internal v1.1.0 // indirect modernc.org/lldb v1.0.8 // indirect - modernc.org/mathutil v1.6.0 // indirect - modernc.org/sortutil v1.2.0 // indirect - modernc.org/strutil v1.2.0 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/sortutil v1.2.1 // indirect + modernc.org/strutil v1.2.1 // indirect modernc.org/zappy v1.1.0 // indirect rsc.io/pdf v0.1.1 // indirect ) diff --git a/go.sum b/go.sum index f32874218..20a57eb29 100644 --- a/go.sum +++ b/go.sum @@ -1,14 +1,3 @@ -eliasnaur.com/font v0.0.0-20230308162249-dd43949cb42d h1:ARo7NCVvN2NdhLlJE9xAbKweuI9L6UgfTbYb0YwPacY= -eliasnaur.com/font v0.0.0-20230308162249-dd43949cb42d/go.mod h1:OYVuxibdk9OSLX8vAqydtRPP87PyTFcT9uH3MlEGBQA= -gioui.org v0.3.0 h1:xZty/uLl1+/HNKpumX60JPQd46n8Zy6lc5T3IRMKoR4= -gioui.org v0.3.0/go.mod h1:1H72sKEk/fNFV+l0JNeM2Dt3co3Y4uaQcD+I+/GQ0e4= -gioui.org/cpu v0.0.0-20210808092351-bfe733dd3334/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ= -gioui.org/cpu v0.0.0-20220412190645-f1e9e8c3b1f7 h1:tNJdnP5CgM39PRc+KWmBRRYX/zJ+rd5XaYxY5d5veqA= -gioui.org/cpu v0.0.0-20220412190645-f1e9e8c3b1f7/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ= -gioui.org/shader v1.0.6 h1:cvZmU+eODFR2545X+/8XucgZdTtEjR3QWW6W65b0q5Y= -gioui.org/shader v1.0.6/go.mod h1:mWdiME581d/kV7/iEhLmUgUK5iZ09XR5XpduXzbePVM= -gioui.org/x v0.3.0 h1:XupHLCT2D1G8qvXxN/EoX+IMpDiG5CHokg6j33rSH9I= -gioui.org/x v0.3.0/go.mod h1:Y/VG4cEJuj938VSzbN21oDg/ZgpKa/P9ipwtTSL1vbU= git.sr.ht/~sbinet/cmpimg v0.1.0 h1:E0zPRk2muWuCqSKSVZIWsgtU9pjsw3eKHi8VmQeScxo= git.sr.ht/~sbinet/cmpimg v0.1.0/go.mod h1:FU12psLbF4TfNXkKH2ZZQ29crIqoiqTZmeQ7dkp/pxE= git.sr.ht/~sbinet/epok v0.5.0 h1:eQcocQpGQVYWLiA93dkIgngH0jjjDiTdj7rS3vQLp6w= @@ -22,8 +11,6 @@ github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/andybalholm/stroke v0.0.0-20230904101225-24ef450bc62c h1:hHefapU8Zg8roqjYi9V8CNFPD0z6tbDDSqNgBgY1O4U= -github.com/andybalholm/stroke v0.0.0-20230904101225-24ef450bc62c/go.mod h1:ccdDYaY5+gO+cbnQdFxEXqfy0RkoV25H3jLXUDNM3wg= github.com/astrogo/fitsio v0.3.0 h1:iQ/lGCREuct04H1dTzPLndbzGo/4SNgpO0JuAhM+YtE= github.com/astrogo/fitsio v0.3.0/go.mod h1:QRvq9GRh56Pa+TkX3iBHo6Upwd7KKIKgL2KO291Gdu0= github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= @@ -46,10 +33,6 @@ github.com/go-mmap/mmap v0.7.0 h1:+h1n06sZw0IWBwL9YDzTomNNXxM4LH/l+HVpGaTC+qk= github.com/go-mmap/mmap v0.7.0/go.mod h1:moN8m00bW6Mpk+Y1xQFeL3xZqycnT4qUAf852ICV/Gc= github.com/go-pdf/fpdf v0.9.0 h1:PPvSaUuo1iMi9KkaAn90NuKi+P4gwMedWPHhj8YlJQw= github.com/go-pdf/fpdf v0.9.0/go.mod h1:oO8N111TkmKb9D7VvWGLvLJlaZUQVPM+6V42pp3iV4Y= -github.com/go-text/typesetting v0.0.0-20230905121921-abdbcca6e0eb h1:4GpJirtA8yY24aqbU3uppiXGYiVpWfLIrqc2NNKKk9s= -github.com/go-text/typesetting v0.0.0-20230905121921-abdbcca6e0eb/go.mod h1:evDBbvNR/KaVFZ2ZlDSOWWXIUKq0wCOEtzLxRM8SG3k= -github.com/go-text/typesetting-utils v0.0.0-20230616150549-2a7df14b6a22 h1:LBQTFxP2MfsyEDqSKmUBZaDuDHN1vpqDyOZjcqS7MYI= -github.com/go-text/typesetting-utils v0.0.0-20230616150549-2a7df14b6a22/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= @@ -62,8 +45,6 @@ github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8i github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -90,11 +71,6 @@ github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJk github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= -github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/xxHash v0.1.5 h1:n/jBpwTHiER4xYvK3/CdPVnLDPchj8eTJFFLUb4QHBo= @@ -108,9 +84,6 @@ github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSg github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/sbinet/npyio v0.8.0 h1:n+jtLFIjcJNENOI44lG7BUwWFqtgdQAerqyXDtC956A= github.com/sbinet/npyio v0.8.0/go.mod h1:26fj1nEFY78AYqkANkcSw4dYwLHXFWFehgOSu5HKwgw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -120,8 +93,9 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/teambition/rrule-go v1.8.2 h1:lIjpjvWTj9fFUZCmuoVDrKVOtdiyzbzc93qTmRVe/J8= github.com/teambition/rrule-go v1.8.2/go.mod h1:Ieq5AbrKGciP1V//Wq8ktsTXwSwJHDD5mD/wLBGl3p4= github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= @@ -139,8 +113,6 @@ golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= -golang.org/x/exp/shiny v0.0.0-20241009180824-f66d83c29e7c h1:jTMrjjZRcSH/BDxWhXCP6OWsfVgmnwI7J+F4/nyVXaU= -golang.org/x/exp/shiny v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:3F+MieQB7dRYLTmnncoFbb1crS5lfQoTfDgQy6K4N0o= golang.org/x/image v0.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68= golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -168,7 +140,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -222,15 +193,15 @@ modernc.org/internal v1.1.0/go.mod h1:IFhfxUE81NbN8Riy+oHylA3PIYgAvIQ5eMufNzg7/Q modernc.org/lldb v1.0.8 h1:gM0Lpmgtw0h/ylWQSxABvzJ++TZKhf1Q/uPAGBAM6aU= modernc.org/lldb v1.0.8/go.mod h1:ybOcsZ/RNZo3q8fiGadQFRnD+1Jc+RWGcTPdeilCnUk= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= -modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/ql v1.4.7 h1:dnGGGL5tHmPwVhMAylnLlwrnIrtk8PPb5KRfMvfgJzE= modernc.org/ql v1.4.7/go.mod h1:I900l6z8ckpPy1y9VR0gu4pZ9hl9AhmQla4F8KERzdc= modernc.org/sortutil v1.1.1/go.mod h1:DTj/8BqjEBLZFVPYvEGDfFFg94SsfPxQ70R+SQJ98qA= -modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= -modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= -modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= -modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/zappy v1.0.9/go.mod h1:y2c4Hv5jzyBP179SxNmx5H/BM6cVgNIXPQv2bCeR6IM= modernc.org/zappy v1.1.0 h1:cAf9HrymATNo2hYMc9c37y0tiZJYuKM2xa1ZAP8THUw= modernc.org/zappy v1.1.0/go.mod h1:cxC0dWAgZuyMsJ+KL3ZBgo3twyKGBB/0By/umSZE2bQ= From 233f253d960b7b827e196aee115f935c1f3dc6ce Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Mon, 17 Feb 2025 11:15:50 +0100 Subject: [PATCH 8/9] all: drop Go-1.22, add Go-1.24 Signed-off-by: Sebastien Binet --- .github/workflows/ci.yml | 2 +- go.mod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1396852bd..5fef4f37c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: name: Build strategy: matrix: - go-version: [1.23.x, 1.22.x] + go-version: [1.24.x, 1.23.x] platform: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.platform }} steps: diff --git a/go.mod b/go.mod index 8ec071e8e..e95aec5b1 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module go-hep.org/x/hep -go 1.22.0 +go 1.23 require ( git.sr.ht/~sbinet/epok v0.5.0 From c8e8d96a955942f0f92081c777ed81cf60b22741 Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Mon, 17 Feb 2025 11:20:06 +0100 Subject: [PATCH 9/9] all: bump sbinet/go-arrow@v0.3.0 Signed-off-by: Sebastien Binet --- go.mod | 5 ++--- go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index e95aec5b1..1b36e4671 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.23 require ( git.sr.ht/~sbinet/epok v0.5.0 - git.sr.ht/~sbinet/go-arrow v0.2.0 + git.sr.ht/~sbinet/go-arrow v0.3.0 github.com/astrogo/fitsio v0.3.0 github.com/campoy/embedmd v1.0.0 github.com/go-mmap/mmap v0.7.0 @@ -40,7 +40,7 @@ require ( github.com/go-latex/latex v0.0.0-20240709081214-31cef3c7570e // indirect github.com/go-pdf/fpdf v0.9.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect @@ -50,7 +50,6 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/posener/complete v1.2.3 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/stretchr/testify v1.9.0 // indirect github.com/teambition/rrule-go v1.8.2 // indirect golang.org/x/mod v0.22.0 // indirect golang.org/x/net v0.33.0 // indirect diff --git a/go.sum b/go.sum index 20a57eb29..d374b6a9e 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ git.sr.ht/~sbinet/epok v0.5.0 h1:eQcocQpGQVYWLiA93dkIgngH0jjjDiTdj7rS3vQLp6w= git.sr.ht/~sbinet/epok v0.5.0/go.mod h1:IO3V831F7MiJ78BrBPcZLImTJSkPYAQeFYXJkdlnU2I= git.sr.ht/~sbinet/gg v0.6.0 h1:RIzgkizAk+9r7uPzf/VfbJHBMKUr0F5hRFxTUGMnt38= git.sr.ht/~sbinet/gg v0.6.0/go.mod h1:uucygbfC9wVPQIfrmwM2et0imr8L7KQWywX0xpFMm94= -git.sr.ht/~sbinet/go-arrow v0.2.0 h1:QIiVPcEtMb2lzOWDgBrIz9Sa+7Xvs2EJ/Icxe6IcUSI= -git.sr.ht/~sbinet/go-arrow v0.2.0/go.mod h1:GIva9P8b7Pom+/pOUMPX5YOrtLOUdGb5tLXBfKuelTY= +git.sr.ht/~sbinet/go-arrow v0.3.0 h1:yH0+AVr3iZtSNcFMpKpNXrZfeoPZPA80fn4FdjOiHAw= +git.sr.ht/~sbinet/go-arrow v0.3.0/go.mod h1:w/rRkiCdHWMNU0EDGrGpTjEwhSQLruknITV8C9pvMAQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= @@ -41,8 +41,8 @@ github.com/gonuts/binary v0.2.0 h1:caITwMWAoQWlL0RNvv2lTU/AHqAJlVuu6nZmNgfbKW4= github.com/gonuts/binary v0.2.0/go.mod h1:kM+CtBrCGDSKdv8WXTuCUsw+loiy8f/QEI8YCCC0M/E= github.com/gonuts/commander v0.4.1 h1:7lmZMnCuDHA0365niE4V5N0Om/hsl6fXskt4MWaKPvg= github.com/gonuts/commander v0.4.1/go.mod h1:qkKJBkuvjm1FgHrH7PO3pMIOuGpl/CDfy+6qw3VKNQs= -github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= @@ -94,8 +94,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/teambition/rrule-go v1.8.2 h1:lIjpjvWTj9fFUZCmuoVDrKVOtdiyzbzc93qTmRVe/J8= github.com/teambition/rrule-go v1.8.2/go.mod h1:Ieq5AbrKGciP1V//Wq8ktsTXwSwJHDD5mD/wLBGl3p4= github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=