Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kubectl-klock for openSUSE:Factory checked in at 2026-05-29 18:07:55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kubectl-klock (Old) and /work/SRC/openSUSE:Factory/.kubectl-klock.new.1937 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kubectl-klock" Fri May 29 18:07:55 2026 rev:6 rq:1355765 version:0.9.1 Changes: -------- --- /work/SRC/openSUSE:Factory/kubectl-klock/kubectl-klock.changes 2026-04-25 21:35:54.338195081 +0200 +++ /work/SRC/openSUSE:Factory/.kubectl-klock.new.1937/kubectl-klock.changes 2026-05-29 18:09:44.376921633 +0200 @@ -1,0 +2,27 @@ +Fri May 29 05:56:10 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 0.9.1: + * Fixes + - fix: add mutex to table.Model to prevent concurrent access + panic (#227) + * Updates + - Bump k8s.io/cli-runtime from 0.36.0 to 0.36.1 (#234) + - Bump k8s.io/kubectl from 0.36.0 to 0.36.1 (#235) + - Bump k8s.io/client-go from 0.36.0 to 0.36.1 (#237) + - Bump zizmorcore/zizmor-action from 0.5.3 to 0.5.5 in the all + group (#238) + - Bump github.com/fsnotify/fsnotify from 1.10.0 to 1.10.1 + (#231) + - Bump github.com/gookit/color from 1.6.0 to 1.6.1 (#232) + - Bump github/codeql-action from 4.35.2 to 4.35.4 in the all + group (#233) + - Update golang.org/x/net v0.51.0 -> v0.54.0 (#230) + - Bump goreleaser/goreleaser-action from 7.1.0 to 7.2.1 in the + all group (#229) + - Bump github.com/fsnotify/fsnotify from 1.9.0 to 1.10.0 (#228) + - Bump k8s.io/kubectl from 0.35.4 to 0.36.0 (#224) + - Bump k8s.io/apimachinery from 0.35.4 to 0.36.0 (#225) + - Bump goreleaser/goreleaser-action from 7.0.0 to 7.1.0 in the + all group (#226) + +------------------------------------------------------------------- Old: ---- kubectl-klock-0.9.0.obscpio New: ---- kubectl-klock-0.9.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kubectl-klock.spec ++++++ --- /var/tmp/diff_new_pack.9VsVrP/_old 2026-05-29 18:09:47.669059003 +0200 +++ /var/tmp/diff_new_pack.9VsVrP/_new 2026-05-29 18:09:47.673059170 +0200 @@ -17,7 +17,7 @@ Name: kubectl-klock -Version: 0.9.0 +Version: 0.9.1 Release: 0 Summary: Kubectl plugin to render watch output in a more readable fashion License: Apache-2.0 AND GPL-3.0-or-later AND CC-BY-4.0 AND CC0-1.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.9VsVrP/_old 2026-05-29 18:09:47.745062175 +0200 +++ /var/tmp/diff_new_pack.9VsVrP/_new 2026-05-29 18:09:47.749062341 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/applejag/kubectl-klock.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.9.0</param> + <param name="revision">refs/tags/v0.9.1</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.9VsVrP/_old 2026-05-29 18:09:47.793064177 +0200 +++ /var/tmp/diff_new_pack.9VsVrP/_new 2026-05-29 18:09:47.805064678 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/applejag/kubectl-klock.git</param> - <param name="changesrevision">bea45b953405a1fbfbe43a98ba01fe81d607de78</param></service></servicedata> + <param name="changesrevision">6506dad4cbf87eed4da486037b9bc73bd82b5b87</param></service></servicedata> (No newline at EOF) ++++++ kubectl-klock-0.9.0.obscpio -> kubectl-klock-0.9.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubectl-klock-0.9.0/go.mod new/kubectl-klock-0.9.1/go.mod --- old/kubectl-klock-0.9.0/go.mod 2026-04-23 16:58:29.000000000 +0200 +++ new/kubectl-klock-0.9.1/go.mod 2026-05-28 13:16:03.000000000 +0200 @@ -10,8 +10,8 @@ github.com/charmbracelet/bubbles v1.0.0 github.com/charmbracelet/bubbletea v1.3.10 github.com/charmbracelet/lipgloss v1.1.0 - github.com/fsnotify/fsnotify v1.9.0 - github.com/gookit/color v1.6.0 + github.com/fsnotify/fsnotify v1.10.1 + github.com/gookit/color v1.6.1 github.com/knadh/koanf/providers/env v1.1.0 github.com/knadh/koanf/providers/posflag v1.0.1 github.com/knadh/koanf/v2 v2.3.4 @@ -20,10 +20,10 @@ github.com/muesli/reflow v0.3.0 github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 - k8s.io/apimachinery v0.35.4 - k8s.io/cli-runtime v0.35.4 - k8s.io/client-go v0.35.4 - k8s.io/kubectl v0.35.4 + k8s.io/apimachinery v0.36.1 + k8s.io/cli-runtime v0.36.1 + k8s.io/client-go v0.36.1 + k8s.io/kubectl v0.36.1 ) require ( @@ -64,9 +64,7 @@ github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/google/btree v1.1.3 // indirect github.com/google/gnostic-models v0.7.1 // indirect - github.com/google/go-cmp v0.7.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf/maps v0.1.2 // indirect @@ -89,7 +87,7 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.12.0 // indirect @@ -103,22 +101,22 @@ go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/net v0.51.0 // indirect + golang.org/x/net v0.54.0 // indirect golang.org/x/oauth2 v0.35.0 // indirect - golang.org/x/sync v0.19.0 // indirect - golang.org/x/sys v0.41.0 // indirect - golang.org/x/term v0.40.0 // indirect - golang.org/x/text v0.34.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.44.0 // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.14.0 // indirect - google.golang.org/protobuf v1.36.11 // indirect + google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.35.4 // indirect - k8s.io/component-base v0.35.4 // indirect - k8s.io/component-helpers v0.35.4 // indirect - k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20260304202019-5b3e3fdb0acf // indirect + k8s.io/api v0.36.1 // indirect + k8s.io/component-base v0.36.1 // indirect + k8s.io/component-helpers v0.36.1 // indirect + k8s.io/klog/v2 v2.140.0 // indirect + k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/kustomize/api v0.21.1 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubectl-klock-0.9.0/go.sum new/kubectl-klock-0.9.1/go.sum --- old/kubectl-klock-0.9.0/go.sum 2026-04-23 16:58:29.000000000 +0200 +++ new/kubectl-klock-0.9.1/go.sum 2026-05-28 13:16:03.000000000 +0200 @@ -51,8 +51,8 @@ github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= -github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho= +github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo= github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= @@ -104,16 +104,14 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gookit/assert v0.1.1 h1:lh3GcawXe/p+cU7ESTZ5Ui3Sm/x8JWpIis4/1aF0mY0= github.com/gookit/assert v0.1.1/go.mod h1:jS5bmIVQZTIwk42uXl4lyj4iaaxx32tqH16CFj0VX2E= -github.com/gookit/color v1.6.0 h1:JjJXBTk1ETNyqyilJhkTXJYYigHG24TM9Xa2M1xAhRA= -github.com/gookit/color v1.6.0/go.mod h1:9ACFc7/1IpHGBW8RwuDm/0YEnhg3dwwXpoMsmtyHfjs= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gookit/color v1.6.1 h1:KoTnDxJPRgrL0SoX0f8rCFg2zI0t4E3GZZBMo2nN8LU= +github.com/gookit/color v1.6.1/go.mod h1:9ACFc7/1IpHGBW8RwuDm/0YEnhg3dwwXpoMsmtyHfjs= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -175,16 +173,17 @@ github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns= -github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= -github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= -github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= +github.com/onsi/ginkgo/v2 v2.28.1 h1:S4hj+HbZp40fNKuLUQOYLDgZLwNUVn19N3Atb98NCyI= +github.com/onsi/ginkgo/v2 v2.28.1/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE= +github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= +github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= @@ -232,29 +231,29 @@ go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= -golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= -golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= -golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= -golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= -golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= -golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= -golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= -golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= -golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -265,24 +264,24 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.35.4 h1:P7nFYKl5vo9AGUp1Z+Pmd3p2tA7bX2wbFWCvDeRv988= -k8s.io/api v0.35.4/go.mod h1:yl4lqySWOgYJJf9RERXKUwE9g2y+CkuwG+xmcOK8wXU= -k8s.io/apimachinery v0.35.4 h1:xtdom9RG7e+yDp71uoXoJDWEE2eOiHgeO4GdBzwWpds= -k8s.io/apimachinery v0.35.4/go.mod h1:NNi1taPOpep0jOj+oRha3mBJPqvi0hGdaV8TCqGQ+cc= -k8s.io/cli-runtime v0.35.4 h1:8QRCXSDvopflFNM65Vkkdv42BljPdRSiqf6HFyI1iik= -k8s.io/cli-runtime v0.35.4/go.mod h1:MKLFuZxiJpm87UxjVeQRNy3sCaczHrSOPKN9pinlrM0= -k8s.io/client-go v0.35.4 h1:DN6fyaGuzK64UvnKO5fOA6ymSjvfGAnCAHAR0C66kD8= -k8s.io/client-go v0.35.4/go.mod h1:2Pg9WpsS4NeOpoYTfHHfMxBG8zFMSAUi4O/qoiJC3nY= -k8s.io/component-base v0.35.4 h1:6n1tNJ87johN0Hif0Fs8K2GMthsaUwMqCebUDLYyv7U= -k8s.io/component-base v0.35.4/go.mod h1:qaDJgz5c1KYKla9occFmlJEfPpkuA55s90G509R+PeY= -k8s.io/component-helpers v0.35.4 h1:WJM/+fAeeJTAqxPDxgH0aB0q7t8DP+AbV5WkRkOoxYA= -k8s.io/component-helpers v0.35.4/go.mod h1:mE7X9mnMQEX6IbZejdMlWvCx3EPVt1/9PhH/FW0XHDI= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20260304202019-5b3e3fdb0acf h1:btPscg4cMql0XdYK2jLsJcNEKmACJz8l+U7geC06FiM= -k8s.io/kube-openapi v0.0.0-20260304202019-5b3e3fdb0acf/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= -k8s.io/kubectl v0.35.4 h1:IHitney6OUeH29rBQnt6Cas6az8HpFeSAohormITNMc= -k8s.io/kubectl v0.35.4/go.mod h1:CGWAaof9ae4vGDAyhnSf1bSQN/U7jiWQHLVbMbLMjRI= +k8s.io/api v0.36.1 h1:XbL/EMj8K2aJpJtePmqUyQMsM0D4QI2pvl7YKJ20FTY= +k8s.io/api v0.36.1/go.mod h1:KOWo4ey3TINlXjeHVuwB3i+tXXnu+UcwFBHlI/9dvEo= +k8s.io/apimachinery v0.36.1 h1:G63Gjx2W+q0YD+72Vo8oY0nDnePVwnuzTmmy5ENrVSA= +k8s.io/apimachinery v0.36.1/go.mod h1:ibYOR00vW/I1kzvi5SF0dRuJ52BvKtfvRdOn35GPQ+8= +k8s.io/cli-runtime v0.36.1 h1:yuC/BGnnj1YYPh6D1P+pZnzinCs6DvMq86yAeNqoqzM= +k8s.io/cli-runtime v0.36.1/go.mod h1:ZQWHGt8xAF7KnviB79vX0lYNyUUqKIpU+LQg7exuFAw= +k8s.io/client-go v0.36.1 h1:FN/K8QIT2CEDt+2WB2HnWrUANZ50AP5GII43/SP2JR0= +k8s.io/client-go v0.36.1/go.mod h1:s6rAnCtTGYDQnpNjEhSaISV+2O8jwruZ6m3QOYBFbtU= +k8s.io/component-base v0.36.1 h1:iG6GsELftXqTNG9HG6kiVjatSgAw1sf5pJ6R5a6N0kA= +k8s.io/component-base v0.36.1/go.mod h1:nf9XPlntRdqO6WMeEWAA5F93Y4ICZQdeT9GeqLDB3JI= +k8s.io/component-helpers v0.36.1 h1:BTrr5fzNSm8TkQfXrKT3N9ioWwiC4n2FTIwGTUo/ccg= +k8s.io/component-helpers v0.36.1/go.mod h1:s38HnzKQRurbUnhI5IV8GwyL/a3lVuNCYZMTd+rITMM= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= +k8s.io/kubectl v0.36.1 h1:96HqS9twIdHM0MlJLTwbo14b9kUKPkOzZ4tlRDLv4qI= +k8s.io/kubectl v0.36.1/go.mod h1:/DGPAIewKsFWF9VFgGvkPhao2Ev4SNuE3BioZo8yPbk= k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubectl-klock-0.9.0/mise.toml new/kubectl-klock-0.9.1/mise.toml --- old/kubectl-klock-0.9.0/mise.toml 1970-01-01 01:00:00.000000000 +0100 +++ new/kubectl-klock-0.9.1/mise.toml 2026-05-28 13:16:03.000000000 +0200 @@ -0,0 +1,6 @@ +# SPDX-FileCopyrightText: 2023 Kalle Fagerberg +# +# SPDX-License-Identifier: CC0-1.0 + +[tools] +go = "1.26.3" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubectl-klock-0.9.0/pkg/table/keys.go new/kubectl-klock-0.9.1/pkg/table/keys.go --- old/kubectl-klock-0.9.0/pkg/table/keys.go 2026-04-23 16:58:29.000000000 +0200 +++ new/kubectl-klock-0.9.1/pkg/table/keys.go 2026-05-28 13:16:03.000000000 +0200 @@ -129,7 +129,7 @@ // FullHelp returns bindings to show the full help view. It's part of the // help.KeyMap interface. -func (m Model) FullHelp() [][]key.Binding { +func (m *Model) FullHelp() [][]key.Binding { browsingBindings := [][]key.Binding{{ m.KeyMap.NextPage, m.KeyMap.PrevPage, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubectl-klock-0.9.0/pkg/table/race_test.go new/kubectl-klock-0.9.1/pkg/table/race_test.go --- old/kubectl-klock-0.9.0/pkg/table/race_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/kubectl-klock-0.9.1/pkg/table/race_test.go 2026-05-28 13:16:03.000000000 +0200 @@ -0,0 +1,133 @@ +// SPDX-FileCopyrightText: 2025 Kalle Fagerberg +// +// SPDX-License-Identifier: GPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the +// Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along +// with this program. If not, see <http://www.gnu.org/licenses/>. + +package table + +import ( + "fmt" + "sync" + "testing" + "time" +) + +// TestRace_AddRowWhileUpdate reproduces the data race between the Kubernetes +// watch goroutine calling AddRow and the bubbletea event loop calling Update +// (on TickMsg) and View concurrently. +// +// This is the root cause of https://github.com/applejag/kubectl-klock/issues/161 +// +// Run with: go test -race -run TestRace_AddRowWhileUpdate -count=1 ./pkg/table/ +func TestRace_AddRowWhileUpdate(t *testing.T) { + m := New() + m.SetHeaders([]string{"NAME", "READY", "STATUS", "RESTARTS", "AGE"}) + + // Pre-populate some rows so the TickMsg handler has something to iterate + for i := 0; i < 10; i++ { + m.AddRow(Row{ + ID: fmt.Sprintf("uid-%d", i), + Fields: []any{fmt.Sprintf("pod-%d", i), "1/1", "Running", "0", time.Now()}, + }) + } + + const ( + numWriters = 3 + numUpdates = 200 + numAddRows = 200 + ) + + var wg sync.WaitGroup + + // Simulate the Kubernetes watch goroutine: call AddRow, SetHeaders, + // SetError, SetRows, StartSpinner, StopSpinner concurrently. + // This is what happens in klock.go watch() and pipeEvents(). + for w := 0; w < numWriters; w++ { + wg.Add(1) + go func(writerID int) { + defer wg.Done() + for i := 0; i < numAddRows; i++ { + uid := fmt.Sprintf("uid-%d-%d", writerID, i) + row := Row{ + ID: uid, + Fields: []any{fmt.Sprintf("pod-%d-%d", writerID, i), "1/1", "Running", "0", time.Now()}, + } + m.AddRow(row) + + // Also exercise the other methods called from background goroutines + if i%50 == 0 { + m.SetHeaders([]string{"NAME", "READY", "STATUS", "RESTARTS", "AGE"}) + } + if i%70 == 0 { + m.SetError(fmt.Errorf("transient error %d", i)) + } + if i%71 == 0 { + m.SetError(nil) + } + if i%100 == 0 { + m.StopSpinner() + } + } + }(w) + } + + // Simulate the bubbletea event loop: call Update(TickMsg) and View() + // concurrently with the AddRow goroutines above. + wg.Add(1) + go func() { + defer wg.Done() + for i := 0; i < numUpdates; i++ { + m.Update(TickMsg(time.Now())) + _ = m.View() + } + }() + + wg.Wait() +} + +// TestRace_SetRowsWhileView reproduces the race between Clear/SetRows +// (called from klock.go watch() on restart) and View (bubbletea event loop). +func TestRace_SetRowsWhileView(t *testing.T) { + m := New() + m.SetHeaders([]string{"NAME", "STATUS"}) + + var wg sync.WaitGroup + + wg.Add(1) + go func() { + defer wg.Done() + for i := 0; i < 200; i++ { + rows := make([]Row, 5) + for j := range rows { + rows[j] = Row{ + ID: fmt.Sprintf("uid-%d-%d", i, j), + Fields: []any{fmt.Sprintf("pod-%d-%d", i, j), "Running"}, + } + } + m.SetRows(rows) + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + for i := 0; i < 200; i++ { + m.Update(TickMsg(time.Now())) + _ = m.View() + } + }() + + wg.Wait() +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kubectl-klock-0.9.0/pkg/table/table.go new/kubectl-klock-0.9.1/pkg/table/table.go --- old/kubectl-klock-0.9.0/pkg/table/table.go 2026-04-23 16:58:29.000000000 +0200 +++ new/kubectl-klock-0.9.1/pkg/table/table.go 2026-05-28 13:16:03.000000000 +0200 @@ -23,6 +23,7 @@ "fmt" "slices" "strings" + "sync" "time" "github.com/applejag/kubectl-klock/internal/util" @@ -102,6 +103,14 @@ filterInput textinput.Model showSpinner bool + // mu protects all mutable state below (and the fields above that are + // written after construction) from concurrent access. The Kubernetes + // watch goroutine calls AddRow/SetRows/SetHeaders/SetError/StartSpinner/ + // StopSpinner while the bubbletea event loop calls Update/View on the + // main goroutine. + // See: https://github.com/applejag/kubectl-klock/issues/161 + mu sync.Mutex + err error headers []string maxHeight int @@ -135,6 +144,12 @@ } func (m *Model) RowIndex(id string) int { + m.mu.Lock() + defer m.mu.Unlock() + return m.rowIndex(id) +} + +func (m *Model) rowIndex(id string) int { for i, row := range m.rows { if row.ID == id { return i @@ -144,7 +159,9 @@ } func (m *Model) AddRow(row Row) tea.Cmd { - index := m.RowIndex(row.ID) + m.mu.Lock() + defer m.mu.Unlock() + index := m.rowIndex(row.ID) if index == -1 { m.rows = append(m.rows, row) } else { @@ -152,17 +169,19 @@ } m.sortItems() - m.StopSpinner() + m.stopSpinner() m.updateRows() fullscreenCmd := m.updateFullscreenCmd() return fullscreenCmd } func (m *Model) SetRows(rows []Row) tea.Cmd { + m.mu.Lock() + defer m.mu.Unlock() m.rows = slices.Clone(rows) m.sortItems() if len(m.rows) > 0 { - m.StopSpinner() + m.stopSpinner() } m.updateRows() return m.updateFullscreenCmd() @@ -222,6 +241,8 @@ } func (m *Model) SetError(err error) { + m.mu.Lock() + defer m.mu.Unlock() m.err = err } @@ -264,7 +285,7 @@ } } -func (m Model) Init() tea.Cmd { +func (m *Model) Init() tea.Cmd { cmd := doTick() if m.showSpinner { cmd = tea.Batch(cmd, m.spinner.Tick) @@ -273,6 +294,8 @@ } func (m *Model) SetHeaders(headers []string) { + m.mu.Lock() + defer m.mu.Unlock() m.headers = headers m.updateColumnWidths() } @@ -286,6 +309,12 @@ } func (m *Model) StartSpinner() tea.Cmd { + m.mu.Lock() + defer m.mu.Unlock() + return m.startSpinner() +} + +func (m *Model) startSpinner() tea.Cmd { if m.showSpinner { return nil } @@ -294,10 +323,18 @@ } func (m *Model) StopSpinner() { + m.mu.Lock() + defer m.mu.Unlock() + m.stopSpinner() +} + +func (m *Model) stopSpinner() { m.showSpinner = false } func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + m.mu.Lock() + defer m.mu.Unlock() switch msg := msg.(type) { case tea.KeyMsg: switch { @@ -368,7 +405,9 @@ return m, nil } -func (m Model) View() string { +func (m *Model) View() string { + m.mu.Lock() + defer m.mu.Unlock() if m.ShowHelp { return m.help.FullHelpView(m.FullHelp()) } @@ -446,7 +485,7 @@ return buf.String() } -func (m Model) currentPaginatedPage() []Row { +func (m *Model) currentPaginatedPage() []Row { if len(m.filteredRows) == 0 { return nil } @@ -454,7 +493,7 @@ return m.filteredRows[start:end] } -func (m Model) viewWriteRows(buf *bytes.Buffer, currentPage []Row) { +func (m *Model) viewWriteRows(buf *bytes.Buffer, currentPage []Row) { for i, row := range currentPage { if i > 0 { buf.WriteByte('\n') @@ -463,7 +502,7 @@ } } -func (m Model) rowView(buf *bytes.Buffer, row Row) { +func (m *Model) rowView(buf *bytes.Buffer, row Row) { style := m.Styles.Row.Cell switch row.Status { case StatusError: @@ -476,7 +515,7 @@ var lotsOfSpaces = strings.Repeat(" ", 200) -func (m Model) columnsView(buf *bytes.Buffer, columns []string, style lipgloss.Style) { +func (m *Model) columnsView(buf *bytes.Buffer, columns []string, style lipgloss.Style) { for i, col := range columns { if i > 0 { // TODO: test style.Width() ++++++ kubectl-klock.obsinfo ++++++ --- /var/tmp/diff_new_pack.9VsVrP/_old 2026-05-29 18:09:48.097076863 +0200 +++ /var/tmp/diff_new_pack.9VsVrP/_new 2026-05-29 18:09:48.105077197 +0200 @@ -1,5 +1,5 @@ name: kubectl-klock -version: 0.9.0 -mtime: 1776956309 -commit: bea45b953405a1fbfbe43a98ba01fe81d607de78 +version: 0.9.1 +mtime: 1779966963 +commit: 6506dad4cbf87eed4da486037b9bc73bd82b5b87 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/kubectl-klock/vendor.tar.gz /work/SRC/openSUSE:Factory/.kubectl-klock.new.1937/vendor.tar.gz differ: char 13, line 1
