Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package talhelper for openSUSE:Factory checked in at 2026-01-20 21:03:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/talhelper (Old) and /work/SRC/openSUSE:Factory/.talhelper.new.1928 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "talhelper" Tue Jan 20 21:03:10 2026 rev:38 rq:1328172 version:3.1.2 Changes: -------- --- /work/SRC/openSUSE:Factory/talhelper/talhelper.changes 2026-01-17 14:54:27.394439871 +0100 +++ /work/SRC/openSUSE:Factory/.talhelper.new.1928/talhelper.changes 2026-01-20 21:03:15.012841553 +0100 @@ -1,0 +2,18 @@ +Tue Jan 20 05:38:36 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 3.1.2: + * chore(github-action): update renovatebot/github-action action + to v44.2.5 + * fix(genconfig): vlan parent interface should get a LinkConfig + * fix(genconfig): a lot of silent errors + * fix(lint): shut golangci-lint up + * fix(genconfig): VLAN with DHCP set to true should generate + DHCPConfigs + * chore(schema): update talos-extensions.yaml JSON schema (#1389) + * fix(deps): update module github.com/budimanjojo/talhelper/v3 to + v3.1.1 + * fix(deps): update module github.com/sirupsen/logrus to v1.9.4 + * feat: update Scoop for talhelper version v3.1.1 + * feat: update flake + +------------------------------------------------------------------- Old: ---- talhelper-3.1.1.obscpio New: ---- talhelper-3.1.2.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ talhelper.spec ++++++ --- /var/tmp/diff_new_pack.cQdJ90/_old 2026-01-20 21:03:18.264976162 +0100 +++ /var/tmp/diff_new_pack.cQdJ90/_new 2026-01-20 21:03:18.264976162 +0100 @@ -17,7 +17,7 @@ Name: talhelper -Version: 3.1.1 +Version: 3.1.2 Release: 0 Summary: Tool to help creating Talos kubernetes cluster License: BSD-3-Clause ++++++ _service ++++++ --- /var/tmp/diff_new_pack.cQdJ90/_old 2026-01-20 21:03:18.312978149 +0100 +++ /var/tmp/diff_new_pack.cQdJ90/_new 2026-01-20 21:03:18.316978314 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/budimanjojo/talhelper</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v3.1.1</param> + <param name="revision">v3.1.2</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.cQdJ90/_old 2026-01-20 21:03:18.344979473 +0100 +++ /var/tmp/diff_new_pack.cQdJ90/_new 2026-01-20 21:03:18.352979804 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/budimanjojo/talhelper</param> - <param name="changesrevision">074dc70ec0cc4c9690e62798802ff14fb37e29f8</param></service></servicedata> + <param name="changesrevision">598d11139a83225801c8565700774a9db7e5ff25</param></service></servicedata> (No newline at EOF) ++++++ talhelper-3.1.1.obscpio -> talhelper-3.1.2.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.1.1/default.nix new/talhelper-3.1.2/default.nix --- old/talhelper-3.1.1/default.nix 2026-01-15 17:32:49.000000000 +0100 +++ new/talhelper-3.1.2/default.nix 2026-01-20 03:14:30.000000000 +0100 @@ -8,13 +8,13 @@ buildGo125Module rec { pname = "talhelper"; - version = "3.1.0"; + version = "3.1.1"; src = fetchFromGitHub { owner = "budimanjojo"; repo = pname; rev = "v${version}"; - sha256 = "sha256-pvJQ6l/Zh5TpGiWe3SXWsUOwFK5WUoGTu76MPyZcXRo="; + sha256 = "sha256-2CuMGYzJV1kfOjAl9eniyzIUJGAeg32Jro5f8Y5m7cs="; }; vendorHash = "sha256-AkCUKg5oA2XvvDtE0m9fQdeqowx5A1SnnimF7F/CORg="; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.1.1/hack/tsehelper/go.mod new/talhelper-3.1.2/hack/tsehelper/go.mod --- old/talhelper-3.1.1/hack/tsehelper/go.mod 2026-01-15 17:32:49.000000000 +0100 +++ new/talhelper-3.1.2/hack/tsehelper/go.mod 2026-01-20 03:14:30.000000000 +0100 @@ -3,9 +3,9 @@ go 1.25.5 require ( - github.com/budimanjojo/talhelper/v3 v3.1.0 + github.com/budimanjojo/talhelper/v3 v3.1.1 github.com/google/go-containerregistry v0.20.7 - github.com/sirupsen/logrus v1.9.4-0.20251023124752-b61f268f75b6 + github.com/sirupsen/logrus v1.9.4 gopkg.in/yaml.v3 v3.0.1 ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.1.1/hack/tsehelper/go.sum new/talhelper-3.1.2/hack/tsehelper/go.sum --- old/talhelper-3.1.1/hack/tsehelper/go.sum 2026-01-15 17:32:49.000000000 +0100 +++ new/talhelper-3.1.2/hack/tsehelper/go.sum 2026-01-20 03:14:30.000000000 +0100 @@ -86,6 +86,8 @@ github.com/budimanjojo/talhelper/v3 v3.0.45/go.mod h1:Q7nx013ejd41oJXTkujkViwszT6cRo+wvAZHYYh/9J8= github.com/budimanjojo/talhelper/v3 v3.1.0 h1:0YDjgySRg3SeFFfm7w3ZlJ2DToNWN673x/GONtyd71M= github.com/budimanjojo/talhelper/v3 v3.1.0/go.mod h1:0LjuZyGUQKRY6TGB0Py9sxFrKbFekdYinnwKLY/osvk= +github.com/budimanjojo/talhelper/v3 v3.1.1 h1:4sAvlDLcUym1S5y09AWvXNEaC6g9UV/ywXHH908ztso= +github.com/budimanjojo/talhelper/v3 v3.1.1/go.mod h1:0LjuZyGUQKRY6TGB0Py9sxFrKbFekdYinnwKLY/osvk= github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU= github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk= github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= @@ -177,6 +179,8 @@ github.com/sirupsen/logrus v1.9.4-0.20230606125235-dd1b4c2e81af/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.4-0.20251023124752-b61f268f75b6 h1:JEH4GlfEqachL/BWMxNEqYZGst5AGInBdLF/bEx+dZY= github.com/sirupsen/logrus v1.9.4-0.20251023124752-b61f268f75b6/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= +github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= +github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.1.1/pkg/config/schemas/talos-extensions.json new/talhelper-3.1.2/pkg/config/schemas/talos-extensions.json --- old/talhelper-3.1.1/pkg/config/schemas/talos-extensions.json 2026-01-15 17:32:49.000000000 +0100 +++ new/talhelper-3.1.2/pkg/config/schemas/talos-extensions.json 2026-01-20 03:14:30.000000000 +0100 @@ -38997,6 +38997,91 @@ "siderolabs/nonfree-kmod-nvidia-production" ], "overlays": null + }, + { + "version": "v1.13.0-alpha.0-3-g5b356b5", + "systemExtensions": [ + "siderolabs/amazon-ena", + "siderolabs/amdgpu", + "siderolabs/amd-ucode", + "siderolabs/binfmt-misc", + "siderolabs/bird2", + "siderolabs/bnx2-bnx2x", + "siderolabs/btrfs", + "siderolabs/chelsio-drivers", + "siderolabs/chelsio-firmware", + "siderolabs/cloudflared", + "siderolabs/crun", + "siderolabs/ctr", + "siderolabs/drbd", + "siderolabs/dvb-cx23885", + "siderolabs/dvb-m88ds3103", + "siderolabs/ecr-credential-provider", + "siderolabs/fuse3", + "siderolabs/gasket-driver", + "siderolabs/gpio-pinctrl", + "siderolabs/glibc", + "siderolabs/gvisor", + "siderolabs/gvisor-debug", + "siderolabs/hailort", + "siderolabs/hello-world-service", + "siderolabs/i915", + "siderolabs/intel-ice-firmware", + "siderolabs/intel-ucode", + "siderolabs/iscsi-tools", + "siderolabs/kata-containers", + "siderolabs/lldpd", + "siderolabs/mdadm", + "siderolabs/mei", + "siderolabs/mellanox-mstflint", + "siderolabs/metal-agent", + "siderolabs/multipath-tools", + "siderolabs/nebula", + "siderolabs/netbird", + "siderolabs/newt", + "siderolabs/nfs-utils", + "siderolabs/nfsd", + "siderolabs/nfsrahead", + "siderolabs/nut-client", + "siderolabs/nvidia-container-toolkit-lts", + "siderolabs/nvidia-container-toolkit-production", + "siderolabs/nvidia-fabricmanager-lts", + "siderolabs/nvidia-fabricmanager-production", + "siderolabs/nvidia-gdrdrv-device", + "siderolabs/nvidia-open-gpu-kernel-modules-lts", + "siderolabs/nvidia-open-gpu-kernel-modules-production", + "siderolabs/nvme-cli", + "siderolabs/soci-snapshotter", + "siderolabs/panfrost", + "siderolabs/qemu-guest-agent", + "siderolabs/qlogic-firmware", + "siderolabs/realtek-firmware", + "siderolabs/revpi-firmware", + "siderolabs/rockchip-rknn", + "siderolabs/spin", + "siderolabs/stargz-snapshotter", + "siderolabs/tailscale", + "siderolabs/tenstorrent", + "siderolabs/thunderbolt", + "siderolabs/trident-iscsi-tools", + "siderolabs/uinput", + "siderolabs/usb-modem-drivers", + "siderolabs/usb-audio-drivers", + "siderolabs/util-linux-tools", + "siderolabs/v4l-uvc-drivers", + "siderolabs/vc4", + "siderolabs/vmtoolsd-guest-agent", + "siderolabs/wasmedge", + "siderolabs/xdma-driver", + "siderolabs/xe", + "siderolabs/xen-guest-agent", + "siderolabs/youki", + "siderolabs/zerotier", + "siderolabs/zfs", + "siderolabs/nonfree-kmod-nvidia-lts", + "siderolabs/nonfree-kmod-nvidia-production" + ], + "overlays": null } ] } \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.1.1/pkg/talos/multidocs.go new/talhelper-3.1.2/pkg/talos/multidocs.go --- old/talhelper-3.1.1/pkg/talos/multidocs.go 2026-01-15 17:32:49.000000000 +0100 +++ new/talhelper-3.1.2/pkg/talos/multidocs.go 2026-01-20 03:14:30.000000000 +0100 @@ -119,11 +119,7 @@ return nil, err } - if err := appendNetworkConfig(&result, vc, node, "dhcp4", GenerateDHCP4ConfigBytes); err != nil { - return nil, err - } - - if err := appendNetworkConfig(&result, vc, node, "dhcp6", GenerateDHCP6ConfigBytes); err != nil { + if err := appendNetworkConfig(&result, vc, node, "dhcp", GenerateDHCPConfigsBytes); err != nil { return nil, err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.1.1/pkg/talos/networkconfig.go new/talhelper-3.1.2/pkg/talos/networkconfig.go --- old/talhelper-3.1.1/pkg/talos/networkconfig.go 2026-01-15 17:32:49.000000000 +0100 +++ new/talhelper-3.1.2/pkg/talos/networkconfig.go 2026-01-20 03:14:30.000000000 +0100 @@ -11,6 +11,7 @@ "github.com/siderolabs/go-pointer" "github.com/siderolabs/talos/pkg/machinery/cel" "github.com/siderolabs/talos/pkg/machinery/cel/celenv" + cinterfaces "github.com/siderolabs/talos/pkg/machinery/config/config" "github.com/siderolabs/talos/pkg/machinery/config/types/network" "github.com/siderolabs/talos/pkg/machinery/config/types/v1alpha1" "github.com/siderolabs/talos/pkg/machinery/nethelpers" @@ -346,7 +347,11 @@ continue } - bondConfig := GenerateBondConfig(device) + bondConfig, err := GenerateBondConfig(device) + if err != nil { + return nil, err + } + if bondConfig == nil { continue } @@ -366,9 +371,9 @@ return CombineYamlBytes(result), nil } -func GenerateBondConfig(device *v1alpha1.Device) *network.BondConfigV1Alpha1 { +func GenerateBondConfig(device *v1alpha1.Device) (*network.BondConfigV1Alpha1, error) { if device == nil || device.DeviceBond == nil { - return nil + return nil, nil } bondConfig := network.NewBondConfigV1Alpha1(device.DeviceInterface) @@ -485,94 +490,42 @@ } } - addCommonLinkConfig(&bondConfig.CommonLinkConfig, device) - - return bondConfig -} - -func GenerateDHCP4ConfigBytes(devices []*v1alpha1.Device) ([]byte, error) { - var result [][]byte - - for _, device := range devices { - if device.DeviceDHCP == nil || !*device.DeviceDHCP { - continue - } - - dhcpConfig := GenerateDHCP4Config(device) - if dhcpConfig == nil { - continue - } - - dhcpBytes, err := marshalYaml(dhcpConfig) - if err != nil { - return nil, err - } - - result = append(result, dhcpBytes) - } - - if len(result) == 0 { - return nil, nil - } - return CombineYamlBytes(result), nil -} - -func GenerateDHCP4Config(device *v1alpha1.Device) *network.DHCPv4ConfigV1Alpha1 { - if device == nil || device.DeviceDHCP == nil || !*device.DeviceDHCP { - return nil - } - - dhcpConfig := network.NewDHCPv4ConfigV1Alpha1(device.DeviceInterface) - - if device.DeviceDHCPOptions != nil { - if device.DeviceDHCPOptions.DHCPRouteMetric != 0 { - dhcpConfig.ConfigRouteMetric = device.DeviceDHCPOptions.DHCPRouteMetric - } + if err := addCommonLinkConfig(&bondConfig.CommonLinkConfig, device); err != nil { + return nil, err } - return dhcpConfig + return bondConfig, nil } -func GenerateDHCP6ConfigBytes(devices []*v1alpha1.Device) ([]byte, error) { +func GenerateDHCPConfigsBytes(devices []*v1alpha1.Device) ([]byte, error) { var result [][]byte for _, device := range devices { - if device.DeviceDHCPOptions == nil || device.DeviceDHCPOptions.DHCPIPv6 == nil || !*device.DeviceDHCPOptions.DHCPIPv6 { - continue - } - - dhcp6Config := GenerateDHCP6Config(device) - if dhcp6Config == nil { - continue - } - - dhcp6Bytes, err := marshalYaml(dhcp6Config) - if err != nil { - return nil, err + dhcpConfigs := GenerateDHCPConfigs(device) + if len(dhcpConfigs) > 0 { + for _, dhcpConfig := range dhcpConfigs { + dhcpBytes, err := marshalYaml(dhcpConfig) + if err != nil { + return nil, err + } + result = append(result, dhcpBytes) + } } - - result = append(result, dhcp6Bytes) } - if len(result) == 0 { - return nil, nil + if len(result) > 0 { + return CombineYamlBytes(result), nil } - return CombineYamlBytes(result), nil + return nil, nil } -func GenerateDHCP6Config(device *v1alpha1.Device) *network.DHCPv6ConfigV1Alpha1 { - if device == nil || device.DeviceDHCPOptions == nil || device.DeviceDHCPOptions.DHCPIPv6 == nil || !*device.DeviceDHCPOptions.DHCPIPv6 { - return nil - } - - dhcp6Config := network.NewDHCPv6ConfigV1Alpha1(device.DeviceInterface) - - if device.DeviceDHCPOptions.DHCPRouteMetric != 0 { - dhcp6Config.ConfigRouteMetric = device.DeviceDHCPOptions.DHCPRouteMetric +func GenerateDHCPConfigs(device *v1alpha1.Device) []cinterfaces.NetworkDHCPConfig { + if device != nil && device.DHCP() { + return generateDHCPConfigs(device.DeviceInterface, device.DeviceDHCPOptions) } - return dhcp6Config + return nil } func GenerateVIPConfigBytes(devices []*v1alpha1.Device) ([]byte, error) { @@ -622,7 +575,11 @@ continue } - linkConfig := GenerateLinkConfig(device) + linkConfig, err := GenerateLinkConfig(device) + if err != nil { + return nil, err + } + if linkConfig == nil { continue } @@ -642,9 +599,9 @@ return CombineYamlBytes(result), nil } -func GenerateLinkConfig(device *v1alpha1.Device) *network.LinkConfigV1Alpha1 { +func GenerateLinkConfig(device *v1alpha1.Device) (*network.LinkConfigV1Alpha1, error) { if device == nil { - return nil + return nil, nil } hasAddresses := len(device.DeviceAddresses) > 0 @@ -652,7 +609,7 @@ hasMTU := device.DeviceMTU > 0 if !hasAddresses && !hasRoutes && !hasMTU { - return nil + return nil, nil } linkConfig := network.NewLinkConfigV1Alpha1(device.DeviceInterface) @@ -660,9 +617,9 @@ for _, address := range device.DeviceAddresses { prefix, err := netip.ParsePrefix(address) if err != nil { - ip, ipErr := netip.ParseAddr(address) - if ipErr != nil { - continue + ip, err := netip.ParseAddr(address) + if err != nil { + return nil, err } bits := 32 if ip.Is6() { @@ -679,7 +636,7 @@ for _, route := range device.DeviceRoutes { routeConfig, err := buildRouteConfig(route) if err != nil { - continue + return nil, err } linkConfig.LinkRoutes = append(linkConfig.LinkRoutes, *routeConfig) } @@ -688,7 +645,7 @@ linkConfig.LinkMTU = uint32(device.DeviceMTU) } - return linkConfig + return linkConfig, nil } func GenerateVLANConfigBytes(devices []*v1alpha1.Device) ([]byte, error) { @@ -700,17 +657,18 @@ } for _, vlan := range device.DeviceVlans { - vlanConfig := GenerateVLANConfig(device, vlan) - if vlanConfig == nil { - continue - } - - vlanBytes, err := marshalYaml(vlanConfig) + vlanConfigs, err := GenerateVLANConfig(device, vlan) if err != nil { return nil, err } - result = append(result, vlanBytes) + for _, vlanConfig := range vlanConfigs { + bytes, err := marshalYaml(vlanConfig) + if err != nil { + return nil, err + } + result = append(result, bytes) + } } } @@ -721,12 +679,14 @@ return CombineYamlBytes(result), nil } -func GenerateVLANConfig(device *v1alpha1.Device, vlan *v1alpha1.Vlan) *network.VLANConfigV1Alpha1 { +func GenerateVLANConfig(device *v1alpha1.Device, vlan *v1alpha1.Vlan) ([]cinterfaces.NamedDocument, error) { if device == nil || vlan == nil { - return nil + return nil, nil } if vlan.VlanID > 0 { + var docs []cinterfaces.NamedDocument + vlanInterface := fmt.Sprintf("%s.%d", device.DeviceInterface, vlan.VlanID) vlanConfig := network.NewVLANConfigV1Alpha1(vlanInterface) vlanConfig.VLANIDConfig = vlan.VlanID @@ -766,10 +726,21 @@ vlanConfig.LinkMTU = uint32(vlan.VlanMTU) } - return vlanConfig + docs = append(docs, vlanConfig) + + if vlan.DHCP() { + dhcpConfigs := generateDHCPConfigs(vlanInterface, vlan.VlanDHCPOptions) + if len(dhcpConfigs) > 0 { + for _, dhcpConfig := range dhcpConfigs { + docs = append(docs, dhcpConfig) + } + } + } + + return docs, nil } - return nil + return nil, nil } func GenerateWireguardConfigBytes(devices []*v1alpha1.Device) ([]byte, error) { @@ -780,7 +751,11 @@ continue } - wgConfig := GenerateWireguardConfig(device) + wgConfig, err := GenerateWireguardConfig(device) + if err != nil { + return nil, err + } + if wgConfig == nil { continue } @@ -800,9 +775,9 @@ return CombineYamlBytes(result), nil } -func GenerateWireguardConfig(device *v1alpha1.Device) *network.WireguardConfigV1Alpha1 { +func GenerateWireguardConfig(device *v1alpha1.Device) (*network.WireguardConfigV1Alpha1, error) { if device == nil || device.DeviceWireguardConfig == nil { - return nil + return nil, nil } wgConfig := network.NewWireguardConfigV1Alpha1(device.DeviceInterface) @@ -851,9 +826,11 @@ } } - addCommonLinkConfig(&wgConfig.CommonLinkConfig, device) + if err := addCommonLinkConfig(&wgConfig.CommonLinkConfig, device); err != nil { + return nil, err + } - return wgConfig + return wgConfig, nil } func GenerateBridgeConfigBytes(devices []*v1alpha1.Device) ([]byte, error) { @@ -864,7 +841,11 @@ continue } - bridgeConfig := GenerateBridgeConfig(device) + bridgeConfig, err := GenerateBridgeConfig(device) + if err != nil { + return nil, err + } + if bridgeConfig == nil { continue } @@ -884,9 +865,9 @@ return CombineYamlBytes(result), nil } -func GenerateBridgeConfig(device *v1alpha1.Device) *network.BridgeConfigV1Alpha1 { +func GenerateBridgeConfig(device *v1alpha1.Device) (*network.BridgeConfigV1Alpha1, error) { if device == nil || device.DeviceBridge == nil { - return nil + return nil, nil } bridgeConfig := network.NewBridgeConfigV1Alpha1(device.DeviceInterface) @@ -901,17 +882,44 @@ } } - addCommonLinkConfig(&bridgeConfig.CommonLinkConfig, device) + if err := addCommonLinkConfig(&bridgeConfig.CommonLinkConfig, device); err != nil { + return nil, err + } + + return bridgeConfig, nil +} + +func generateDHCPConfigs(name string, options *v1alpha1.DHCPOptions) []cinterfaces.NetworkDHCPConfig { + if options == nil { + options = &v1alpha1.DHCPOptions{} + } + + result := []cinterfaces.NetworkDHCPConfig{} + + if options.IPv4() { + ipv4 := network.NewDHCPv4ConfigV1Alpha1(name) + if options.RouteMetric() > 0 { + ipv4.ConfigRouteMetric = options.RouteMetric() + } + result = append(result, ipv4) + } + + if options.IPv6() { + ipv6 := network.NewDHCPv6ConfigV1Alpha1(name) + if options.RouteMetric() > 0 { + ipv6.ConfigRouteMetric = options.RouteMetric() + } + result = append(result, ipv6) + } - return bridgeConfig + return result } func hasSpecialConfig(device *v1alpha1.Device) bool { if device == nil { return false } - return device.DeviceBond != nil || len(device.DeviceVlans) > 0 || - device.DeviceWireguardConfig != nil || device.DeviceBridge != nil + return device.DeviceBond != nil || device.DeviceWireguardConfig != nil || device.DeviceBridge != nil } func buildRouteConfig(route interface { @@ -920,38 +928,39 @@ Source() string Metric() uint32 MTU() uint32 -}) (*network.RouteConfig, error) { - networkStr := route.Network() - if networkStr == "" { - return nil, fmt.Errorf("route network is empty") - } - - prefix, err := netip.ParsePrefix(networkStr) - if err != nil { - return nil, fmt.Errorf("invalid network prefix: %w", err) - } - +}, +) (*network.RouteConfig, error) { routeConfig := &network.RouteConfig{} - // For default routes (0.0.0.0/0 or ::/0), omit the destination field - // and let Talos infer it from the gateway's address family - isDefaultRoute := (prefix.String() == "0.0.0.0/0" || prefix.String() == "::/0") - if !isDefaultRoute { - routeConfig.RouteDestination = network.Prefix{Prefix: prefix} + networkStr := route.Network() + if networkStr != "" { + prefix, err := netip.ParsePrefix(networkStr) + if err != nil { + return nil, fmt.Errorf("invalid network prefix: %w", err) + } + + // For default routes (0.0.0.0/0 or ::/0), omit the destination field + // and let Talos infer it from the gateway's address family + isDefaultRoute := (prefix.String() == "0.0.0.0/0" || prefix.String() == "::/0") + if !isDefaultRoute { + routeConfig.RouteDestination = network.Prefix{Prefix: prefix} + } } if route.Gateway() != "" { gateway, err := netip.ParseAddr(route.Gateway()) - if err == nil { - routeConfig.RouteGateway = network.Addr{Addr: gateway} + if err != nil { + return nil, err } + routeConfig.RouteGateway = network.Addr{Addr: gateway} } if route.Source() != "" { source, err := netip.ParseAddr(route.Source()) - if err == nil { - routeConfig.RouteSource = network.Addr{Addr: source} + if err != nil { + return nil, err } + routeConfig.RouteSource = network.Addr{Addr: source} } if route.Metric() > 0 { @@ -965,17 +974,17 @@ return routeConfig, nil } -func addCommonLinkConfig(linkConfig *network.CommonLinkConfig, device *v1alpha1.Device) { +func addCommonLinkConfig(linkConfig *network.CommonLinkConfig, device *v1alpha1.Device) error { if device == nil || linkConfig == nil { - return + return nil } for _, address := range device.DeviceAddresses { prefix, err := netip.ParsePrefix(address) if err != nil { - ip, ipErr := netip.ParseAddr(address) - if ipErr != nil { - continue + ip, err := netip.ParseAddr(address) + if err != nil { + return err } bits := 32 if ip.Is6() { @@ -992,7 +1001,7 @@ for _, route := range device.DeviceRoutes { routeConfig, err := buildRouteConfig(route) if err != nil { - continue + return err } linkConfig.LinkRoutes = append(linkConfig.LinkRoutes, *routeConfig) } @@ -1000,6 +1009,8 @@ if device.DeviceMTU > 0 { linkConfig.LinkMTU = uint32(device.DeviceMTU) } + + return nil } // marshalYaml encodes `in` into `yaml` bytes with 2 indentation. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.1.1/pkg/talos/networkconfig_test.go new/talhelper-3.1.2/pkg/talos/networkconfig_test.go --- old/talhelper-3.1.1/pkg/talos/networkconfig_test.go 2026-01-15 17:32:49.000000000 +0100 +++ new/talhelper-3.1.2/pkg/talos/networkconfig_test.go 2026-01-20 03:14:30.000000000 +0100 @@ -11,6 +11,8 @@ networktypes "github.com/siderolabs/talos/pkg/machinery/api/resource/definitions/network" "github.com/siderolabs/talos/pkg/machinery/cel" "github.com/siderolabs/talos/pkg/machinery/cel/celenv" + cinterfaces "github.com/siderolabs/talos/pkg/machinery/config/config" + "github.com/siderolabs/talos/pkg/machinery/config/configloader" "github.com/siderolabs/talos/pkg/machinery/config/types/network" v1alpha1 "github.com/siderolabs/talos/pkg/machinery/config/types/v1alpha1" "github.com/siderolabs/talos/pkg/machinery/nethelpers" @@ -140,7 +142,11 @@ t.Fatal("failed to parse test data") } - result := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0]) + result, err := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0]) + if err != nil { + t.Fatal(err) + } + if result == nil { t.Fatal("expected bond config, got nil") } @@ -194,13 +200,17 @@ } } -func TestGenerateDHCP4Config(t *testing.T) { +func TestGenerateDHCPConfigs(t *testing.T) { data := []byte(`nodes: - hostname: node1 networkInterfaces: - interface: eth0 dhcp: true dhcpOptions: + ipv6: true + - interface: eth1 + dhcp: true + dhcpOptions: routeMetric: 1024`) var m config.TalhelperConfig @@ -208,53 +218,66 @@ t.Fatal(err) } - if len(m.Nodes) == 0 || len(m.Nodes[0].NetworkInterfaces) == 0 { + if len(m.Nodes) == 0 || len(m.Nodes[0].NetworkInterfaces) != 2 { t.Fatal("failed to parse test data") } - result := GenerateDHCP4Config(m.Nodes[0].NetworkInterfaces[0]) - if result == nil { - t.Fatal("expected DHCP4 config, got nil") - } + var results []cinterfaces.NetworkDHCPConfig - if result.Name() != "eth0" { - t.Errorf("expected name=eth0, got %s", result.Name()) - } + results = append(results, GenerateDHCPConfigs(m.Nodes[0].NetworkInterfaces[0])...) + results = append(results, GenerateDHCPConfigs(m.Nodes[0].NetworkInterfaces[1])...) - if result.ConfigRouteMetric != 1024 { - t.Errorf("expected route metric=1024, got %d", result.ConfigRouteMetric) + type check struct { + kind string + name string + routeMetric uint32 } -} -func TestGenerateDHCP6Config(t *testing.T) { - data := []byte(`nodes: - - hostname: node1 - networkInterfaces: - - interface: eth0 - dhcpOptions: - ipv6: true - routeMetric: 2048`) - - var m config.TalhelperConfig - if err := yaml.Unmarshal(data, &m); err != nil { - t.Fatal(err) - } - - if len(m.Nodes) == 0 || len(m.Nodes[0].NetworkInterfaces) == 0 { - t.Fatal("failed to parse test data") - } - - result := GenerateDHCP6Config(m.Nodes[0].NetworkInterfaces[0]) - if result == nil { - t.Fatal("expected DHCP6 config, got nil") + expected := []check{ + { + kind: "DHCPv4Config", + name: "eth0", + }, + { + kind: "DHCPv6Config", + name: "eth0", + }, + { + kind: "DHCPv4Config", + name: "eth1", + routeMetric: 1024, + }, } - if result.Name() != "eth0" { - t.Errorf("expected name=eth0, got %s", result.Name()) + if len(results) != len(expected) { + t.Fatalf("expected results to have length of %d, got %d", len(expected), len(results)) } - if result.ConfigRouteMetric != 2048 { - t.Errorf("expected route metric=2048, got %d", result.ConfigRouteMetric) + for k, v := range results { + switch doc := v.(type) { + case *network.DHCPv4ConfigV1Alpha1: + if doc.MetaKind != expected[k].kind { + t.Errorf("expected results[%d] kind to be %s, got %s", k, expected[k].kind, doc.MetaKind) + } + if doc.MetaName != expected[k].name { + t.Errorf("expected results[%d] name to be %s, got %s", k, expected[k].name, doc.MetaName) + } + if doc.ConfigRouteMetric != expected[k].routeMetric { + t.Errorf("expected results[%d] route metric to be %d, got %d", k, expected[k].routeMetric, doc.ConfigRouteMetric) + } + case *network.DHCPv6ConfigV1Alpha1: + if doc.MetaKind != expected[k].kind { + t.Errorf("expected results[%d] kind to be %s, got %s", k, expected[k].kind, doc.MetaKind) + } + if doc.MetaName != expected[k].name { + t.Errorf("expected results[%d] name to be %s, got %s", k, expected[k].name, doc.MetaName) + } + if doc.ConfigRouteMetric != expected[k].routeMetric { + t.Errorf("expected results[%d] route metric to be %d, got %d", k, expected[k].routeMetric, doc.ConfigRouteMetric) + } + default: + t.Errorf("unexpected type for results[%d]: %T", k, doc) + } } } @@ -296,38 +319,6 @@ t.Logf("Bond config output:\n%s", bondStr) } -func TestGenerateDHCP4ConfigBytes(t *testing.T) { - data := []byte(`nodes: - - hostname: node1 - networkInterfaces: - - interface: eth0 - dhcp: true - - interface: eth1`) - - var m config.TalhelperConfig - if err := yaml.Unmarshal(data, &m); err != nil { - t.Fatal(err) - } - - dhcpBytes, err := GenerateDHCP4ConfigBytes(m.Nodes[0].NetworkInterfaces) - if err != nil { - t.Fatal(err) - } - - if dhcpBytes == nil { - t.Fatal("expected DHCP4 config bytes, got nil") - } - - dhcpStr := string(dhcpBytes) - if !bytes.Contains(dhcpBytes, []byte("kind: DHCPv4Config")) { - t.Error("expected output to contain 'kind: DHCPv4Config'") - } - if !bytes.Contains(dhcpBytes, []byte("name: eth0")) { - t.Error("expected output to contain 'name: eth0'") - } - t.Logf("DHCP4 config output:\n%s", dhcpStr) -} - func TestGenerateVIPConfig(t *testing.T) { data := []byte(`nodes: - hostname: node1 @@ -410,7 +401,11 @@ t.Fatal(err) } - result := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0]) + result, err := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0]) + if err != nil { + t.Fatal(err) + } + if result == nil { t.Fatal("expected link config, got nil") } @@ -492,7 +487,11 @@ t.Fatal(err) } - result := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0]) + result, err := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0]) + if err != nil { + t.Fatal(err) + } + if result == nil { t.Fatal("expected link config, got nil") } @@ -581,7 +580,11 @@ t.Fatal(err) } - result := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0]) + result, err := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0]) + if err != nil { + t.Fatal(err) + } + if result == nil { t.Fatal("expected link config, got nil") } @@ -594,7 +597,11 @@ t.Errorf("expected MTU 9000, got %d", result.LinkMTU) } - result2 := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[1]) + result2, err := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[1]) + if err != nil { + t.Fatal(err) + } + if result2 != nil { t.Error("expected nil for interface without MTU") } @@ -647,7 +654,8 @@ routes: - network: 10.0.0.0/8 gateway: 192.168.100.254 - mtu: 1500`) + mtu: 1500 + dhcp: true`) var m config.TalhelperConfig if err := yaml.Unmarshal(data, &m); err != nil { @@ -659,38 +667,60 @@ t.Fatal("expected VLANs, got none") } - result := GenerateVLANConfig(m.Nodes[0].NetworkInterfaces[0], vlans[0]) - if result == nil { - t.Fatal("expected VLAN config, got nil") + result, err := GenerateVLANConfig(m.Nodes[0].NetworkInterfaces[0], vlans[0]) + if err != nil { + t.Fatal(err) } - if result.MetaName != "eth0.100" { - t.Errorf("expected name=eth0.100, got %s", result.MetaName) + if len(result) != 2 { + t.Fatalf("expected 2 documents, got %v document(s)", len(result)) } - if result.VLANIDConfig != 100 { - t.Errorf("expected VLAN ID 100, got %d", result.VLANIDConfig) + result0, ok := result[0].(*network.VLANConfigV1Alpha1) + if !ok { + t.Errorf("expected first document to be type of VlanConfig, got %T", result0) } - if result.ParentLinkConfig != "eth0" { - t.Errorf("expected parent=eth0, got %s", result.ParentLinkConfig) + if result0.MetaName != "eth0.100" { + t.Errorf("expected first document name=eth0.100, got %s", result0.MetaName) } - if len(result.LinkAddresses) != 1 { - t.Fatalf("expected 1 address, got %d", len(result.LinkAddresses)) + if result0.VLANIDConfig != 100 { + t.Errorf("expected VLAN ID 100, got %d", result0.VLANIDConfig) + } + + if result0.ParentLinkConfig != "eth0" { + t.Errorf("expected parent=eth0, got %s", result0.ParentLinkConfig) + } + + if len(result0.LinkAddresses) != 1 { + t.Fatalf("expected 1 address, got %d", len(result0.LinkAddresses)) } expectedAddr := netip.MustParsePrefix("192.168.100.1/24") - if result.LinkAddresses[0].AddressAddress != expectedAddr { - t.Errorf("expected address %s, got %s", expectedAddr, result.LinkAddresses[0].AddressAddress) + if result0.LinkAddresses[0].AddressAddress != expectedAddr { + t.Errorf("expected address %s, got %s", expectedAddr, result0.LinkAddresses[0].AddressAddress) + } + + if len(result0.LinkRoutes) != 1 { + t.Fatalf("expected 1 route, got %d", len(result0.LinkRoutes)) } - if len(result.LinkRoutes) != 1 { - t.Fatalf("expected 1 route, got %d", len(result.LinkRoutes)) + if result0.LinkMTU != 1500 { + t.Errorf("expected MTU 1500, got %d", result0.LinkMTU) } - if result.LinkMTU != 1500 { - t.Errorf("expected MTU 1500, got %d", result.LinkMTU) + if result[0].Name() != "eth0.100" || result[1].Name() != "eth0.100" { + t.Errorf("expected name=eth0.100, got %s and %s", result[0].Name(), result[1].Name()) + } + + result1, ok := result[1].(*network.DHCPv4ConfigV1Alpha1) + if !ok { + t.Errorf("expected second document to be type of DHCPv4Config, got %T", result1) + } + + if result1.MetaName != "eth0.100" { + t.Errorf("expected second document name=eth0.100, got %s", result1.MetaName) } } @@ -734,21 +764,19 @@ t.Logf("VLAN config output:\n%s", vlanStr) } -func TestGenerateVLANConfigMultipleVLANs(t *testing.T) { +func TestGenerateVLANConfigBytesMultipleVLANs(t *testing.T) { data := []byte(`nodes: - hostname: node1 networkInterfaces: - interface: eth0 vlans: - vlanId: 100 - addresses: - - 192.168.100.1/24 + dhcp: true - vlanId: 200 - addresses: - - 192.168.200.1/24 - - vlanId: 300 - addresses: - - 192.168.300.1/24`) + dhcp: true + dhcpOptions: + ipv6: true + - vlanId: 300`) var m config.TalhelperConfig if err := yaml.Unmarshal(data, &m); err != nil { @@ -756,83 +784,94 @@ } vlans := m.Nodes[0].NetworkInterfaces[0].DeviceVlans + if len(vlans) != 3 { t.Fatalf("expected 3 VLANs, got %d", len(vlans)) } - vlan100 := GenerateVLANConfig(m.Nodes[0].NetworkInterfaces[0], vlans[0]) - vlan200 := GenerateVLANConfig(m.Nodes[0].NetworkInterfaces[0], vlans[1]) - vlan300 := GenerateVLANConfig(m.Nodes[0].NetworkInterfaces[0], vlans[2]) - - if vlan100 == nil || vlan200 == nil || vlan300 == nil { - t.Fatal("expected all VLAN configs to be non-nil") - } - - names := map[string]bool{ - vlan100.MetaName: true, - vlan200.MetaName: true, - vlan300.MetaName: true, - } - - if len(names) != 3 { - t.Errorf("expected 3 unique VLAN names, got %d: vlan100=%s, vlan200=%s, vlan300=%s", - len(names), vlan100.MetaName, vlan200.MetaName, vlan300.MetaName) - } - - expectedNames := map[string]bool{ - "eth0.100": true, - "eth0.200": true, - "eth0.300": true, + result, err := GenerateVLANConfigBytes(m.Nodes[0].NetworkInterfaces) + if err != nil { + t.Fatal(err) } - if vlan100.MetaName != "eth0.100" { - t.Errorf("expected VLAN 100 name to be eth0.100, got %s", vlan100.MetaName) - } - if vlan200.MetaName != "eth0.200" { - t.Errorf("expected VLAN 200 name to be eth0.200, got %s", vlan200.MetaName) - } - if vlan300.MetaName != "eth0.300" { - t.Errorf("expected VLAN 300 name to be eth0.300, got %s", vlan300.MetaName) + test, err := configloader.NewFromBytes(result) + if err != nil { + t.Fatal(err) } - if vlan100.ParentLinkConfig != "eth0" { - t.Errorf("expected parent eth0, got %s", vlan100.ParentLinkConfig) - } - if vlan200.ParentLinkConfig != "eth0" { - t.Errorf("expected parent eth0, got %s", vlan200.ParentLinkConfig) - } - if vlan300.ParentLinkConfig != "eth0" { - t.Errorf("expected parent eth0, got %s", vlan300.ParentLinkConfig) + type check struct { + kind string + name string + vlanId uint16 } - if vlan100.VLANIDConfig != 100 { - t.Errorf("expected VLAN ID 100, got %d", vlan100.VLANIDConfig) - } - if vlan200.VLANIDConfig != 200 { - t.Errorf("expected VLAN ID 200, got %d", vlan200.VLANIDConfig) - } - if vlan300.VLANIDConfig != 300 { - t.Errorf("expected VLAN ID 300, got %d", vlan300.VLANIDConfig) - } - - vlanBytes, err := GenerateVLANConfigBytes(m.Nodes[0].NetworkInterfaces) - if err != nil { - t.Fatal(err) + expected := []check{ + { + kind: "VLANConfig", + name: "eth0.100", + vlanId: 100, + }, + { + kind: "DHCPv4Config", + name: "eth0.100", + }, + { + kind: "VLANConfig", + name: "eth0.200", + vlanId: 200, + }, + { + kind: "DHCPv4Config", + name: "eth0.200", + }, + { + kind: "DHCPv6Config", + name: "eth0.200", + }, + { + kind: "VLANConfig", + name: "eth0.300", + vlanId: 300, + }, } - if vlanBytes == nil { - t.Fatal("expected VLAN config bytes, got nil") + if len(test.Documents()) != len(expected) { + t.Fatalf("expected %d documents, got %d documents", len(expected), len(test.Documents())) } - vlanStr := string(vlanBytes) - - for name := range expectedNames { - if !bytes.Contains(vlanBytes, []byte("name: "+name)) { - t.Errorf("expected output to contain 'name: %s'", name) + for k, v := range test.Documents() { + switch doc := v.(type) { + case *network.VLANConfigV1Alpha1: + if doc.MetaKind != expected[k].kind { + t.Errorf("expected result[%d] kind to be %s, got %s", k, expected[k].kind, doc.MetaKind) + } + if doc.MetaName != expected[k].name { + t.Errorf("expected result[%d] name to be %s, got %s", k, expected[k].name, doc.MetaName) + } + if doc.VLANIDConfig != expected[k].vlanId { + t.Errorf("expected result[%d] vlanId to be %d, got %d", k, expected[k].vlanId, doc.VLANIDConfig) + } + if doc.ParentLinkConfig != "eth0" { + t.Errorf("expected result[%d] parent name to be eth0, got %s", k, doc.ParentLinkConfig) + } + case *network.DHCPv4ConfigV1Alpha1: + if doc.MetaKind != expected[k].kind { + t.Errorf("expected result[%d] kind to be %s, got %s", k, expected[k].kind, doc.MetaKind) + } + if doc.MetaName != expected[k].name { + t.Errorf("expected result[%d] name to be %s, got %s", k, expected[k].name, doc.MetaName) + } + case *network.DHCPv6ConfigV1Alpha1: + if doc.MetaKind != expected[k].kind { + t.Errorf("expected result[%d] kind to be %s, got %s", k, expected[k].kind, doc.MetaKind) + } + if doc.MetaName != expected[k].name { + t.Errorf("expected result[%d] name to be %s, got %s", k, expected[k].name, doc.MetaName) + } + default: + t.Errorf("unexpected result[%d] kind: %T", k, doc) } } - - t.Logf("Multiple VLAN config output:\n%s", vlanStr) } func TestGenerateWireguardConfig(t *testing.T) { @@ -856,7 +895,11 @@ t.Fatal(err) } - result := GenerateWireguardConfig(m.Nodes[0].NetworkInterfaces[0]) + result, err := GenerateWireguardConfig(m.Nodes[0].NetworkInterfaces[0]) + if err != nil { + t.Fatal(err) + } + if result == nil { t.Fatal("expected WireGuard config, got nil") } @@ -957,7 +1000,11 @@ t.Fatal(err) } - result := GenerateBridgeConfig(m.Nodes[0].NetworkInterfaces[0]) + result, err := GenerateBridgeConfig(m.Nodes[0].NetworkInterfaces[0]) + if err != nil { + t.Fatal(err) + } + if result == nil { t.Fatal("expected bridge config, got nil") } @@ -1045,7 +1092,11 @@ t.Fatal(err) } - bondConfig := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0]) + bondConfig, err := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0]) + if err != nil { + t.Fatal(err) + } + if bondConfig == nil { t.Fatal("expected bond config, got nil") } @@ -1096,7 +1147,11 @@ t.Fatal(err) } - wgConfig := GenerateWireguardConfig(m.Nodes[0].NetworkInterfaces[0]) + wgConfig, err := GenerateWireguardConfig(m.Nodes[0].NetworkInterfaces[0]) + if err != nil { + t.Fatal(err) + } + if wgConfig == nil { t.Fatal("expected wireguard config, got nil") } @@ -1140,7 +1195,11 @@ t.Fatal(err) } - bridgeConfig := GenerateBridgeConfig(m.Nodes[0].NetworkInterfaces[0]) + bridgeConfig, err := GenerateBridgeConfig(m.Nodes[0].NetworkInterfaces[0]) + if err != nil { + t.Fatal(err) + } + if bridgeConfig == nil { t.Fatal("expected bridge config, got nil") } @@ -1201,8 +1260,8 @@ t.Error("expected bridge interface to have special config") } - if !hasSpecialConfig(m.Nodes[0].NetworkInterfaces[3]) { - t.Error("expected interface with VLAN to have special config") + if hasSpecialConfig(m.Nodes[0].NetworkInterfaces[3]) { + t.Error("expected interface with VLAN to NOT have special config") } if hasSpecialConfig(m.Nodes[0].NetworkInterfaces[4]) { @@ -1658,7 +1717,11 @@ t.Fatal(err) } - bondConfig := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0]) + bondConfig, err := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0]) + if err != nil { + t.Fatal(err) + } + if bondConfig == nil { t.Fatal("expected bond config, got nil") } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/talhelper-3.1.1/talhelper.json new/talhelper-3.1.2/talhelper.json --- old/talhelper-3.1.1/talhelper.json 2026-01-15 17:32:49.000000000 +0100 +++ new/talhelper-3.1.2/talhelper.json 2026-01-20 03:14:30.000000000 +0100 @@ -1,19 +1,19 @@ { - "version": "3.1.0", + "version": "3.1.1", "architecture": { "64bit": { - "url": "https://github.com/budimanjojo/talhelper/releases/download/v3.1.0/talhelper_windows_amd64.tar.gz", + "url": "https://github.com/budimanjojo/talhelper/releases/download/v3.1.1/talhelper_windows_amd64.tar.gz", "bin": [ "talhelper.exe" ], - "hash": "498c6919d552f1d3a0acf2faee2929d0828597b3b21777d714a15423aae14f23" + "hash": "c0918411820b3e9c77872292cacf57b6efb5af6926338e2403a573aac41013e6" }, "arm64": { - "url": "https://github.com/budimanjojo/talhelper/releases/download/v3.1.0/talhelper_windows_arm64.tar.gz", + "url": "https://github.com/budimanjojo/talhelper/releases/download/v3.1.1/talhelper_windows_arm64.tar.gz", "bin": [ "talhelper.exe" ], - "hash": "5a5e65a962defc94eb95dfcb3f5037fb9bc87b14ce8f6294ae04ea6d7d9b073b" + "hash": "f903e4ff760be1ca371896d84de63331141a1de1cbb817df655502ac21b1f026" } }, "homepage": "https://github.com/budimanjojo/talhelper", ++++++ talhelper.obsinfo ++++++ --- /var/tmp/diff_new_pack.cQdJ90/_old 2026-01-20 21:03:18.748996196 +0100 +++ /var/tmp/diff_new_pack.cQdJ90/_new 2026-01-20 21:03:18.760996692 +0100 @@ -1,5 +1,5 @@ name: talhelper -version: 3.1.1 -mtime: 1768494769 -commit: 074dc70ec0cc4c9690e62798802ff14fb37e29f8 +version: 3.1.2 +mtime: 1768875270 +commit: 598d11139a83225801c8565700774a9db7e5ff25 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/talhelper/vendor.tar.gz /work/SRC/openSUSE:Factory/.talhelper.new.1928/vendor.tar.gz differ: char 134, line 2
