Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package hcloud-cli for openSUSE:Factory checked in at 2026-01-12 10:25:31 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/hcloud-cli (Old) and /work/SRC/openSUSE:Factory/.hcloud-cli.new.1928 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "hcloud-cli" Mon Jan 12 10:25:31 2026 rev:13 rq:1326627 version:1.59.0 Changes: -------- --- /work/SRC/openSUSE:Factory/hcloud-cli/hcloud-cli.changes 2025-12-19 16:47:01.188817311 +0100 +++ /work/SRC/openSUSE:Factory/.hcloud-cli.new.1928/hcloud-cli.changes 2026-01-12 10:34:08.837160892 +0100 @@ -1,0 +2,47 @@ +Sun Jan 11 08:52:25 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 1.59.0: + * Deprecation of datacenter attribute for Primary IPs and Servers + The datacenter attribute is deprecated in the Primary IPs and + Servers API resources and will be removed after 1 July 2026. + See + https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters + for more details. + The location attribute already exists for Servers, and was + added for Primary IPs. + Therefor the datacenter attribute is deprecated in favor of the + location attribute in the following commands: + - hcloud server create + - hcloud server describe + - hcloud server list + - hcloud primary-ip create + - hcloud primary-ip describe + - hcloud primary-ip list + In list commands, the datacenter columns is not longer shown by + default, and is replaced with the location column. + * Features + - server,primary-ip: deprecate datacenter (#1278) + * Changelog + - chore(main): release v1.59.0 (#1296) + - feat(server,primary-ip): deprecate datacenter (#1278) + - deps: update dependency goreleaser/goreleaser to v2.13.2 + (#1294) + - ci(mise): annotate GitHub dependencies for renovate (#1293) + - deps: update module github.com/hetznercloud/hcloud-go/v2 to + v2.33.0 (#1285) + - deps: update module github.com/jedib0t/go-pretty/v6 to v6.7.8 + (#1291) + - deps: update dependency jdx/mise to v2025.12.13 (#1292) + - deps: update golang.org/x/exp digest to 944ab1f (#1289) + - ci(mise): go backend no longer experimental (#1283) + - ci(mise): replace deprecated ubi backend (#1284) + - deps: update dependency jdx/mise to v2025.12.12 (#1287) + - ci: automatically update mise version in GitHub Action + (#1286) + - deps: update actions/cache action to v5 (#1281) + - deps: update actions/checkout action to v6 (#1282) + - ci: add link check workflow (#1224) + - chore: rename goreleaser `archive.builds` to `archive.ids` + (#1280) + +------------------------------------------------------------------- Old: ---- hcloud-cli-1.58.0.obscpio New: ---- hcloud-cli-1.59.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ hcloud-cli.spec ++++++ --- /var/tmp/diff_new_pack.1rPrNL/_old 2026-01-12 10:34:09.549190196 +0100 +++ /var/tmp/diff_new_pack.1rPrNL/_new 2026-01-12 10:34:09.553190360 +0100 @@ -1,7 +1,7 @@ # # spec file for package hcloud-cli # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %define executable_name hcloud Name: hcloud-cli -Version: 1.58.0 +Version: 1.59.0 Release: 0 Summary: A command-line interface for Hetzner Cloud License: MIT @@ -29,7 +29,7 @@ BuildRequires: bash-completion BuildRequires: fish BuildRequires: zsh -BuildRequires: golang(API) >= 1.23 +BuildRequires: golang(API) >= 1.24 Provides: hcloud = %{version} %description ++++++ _service ++++++ --- /var/tmp/diff_new_pack.1rPrNL/_old 2026-01-12 10:34:09.613192830 +0100 +++ /var/tmp/diff_new_pack.1rPrNL/_new 2026-01-12 10:34:09.621193158 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/hetznercloud/cli</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v1.58.0</param> + <param name="revision">v1.59.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.1rPrNL/_old 2026-01-12 10:34:09.653194476 +0100 +++ /var/tmp/diff_new_pack.1rPrNL/_new 2026-01-12 10:34:09.657194641 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/hetznercloud/cli</param> - <param name="changesrevision">d5b8b962bee7a9e71e91cab973dd26807d994ea7</param></service></servicedata> + <param name="changesrevision">e01a16ea40bdf213362675eeb94d61776619be01</param></service></servicedata> (No newline at EOF) ++++++ hcloud-cli-1.58.0.obscpio -> hcloud-cli-1.59.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/.golangci.yml new/hcloud-cli-1.59.0/.golangci.yml --- old/hcloud-cli-1.58.0/.golangci.yml 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/.golangci.yml 2026-01-05 17:16:10.000000000 +0100 @@ -63,6 +63,9 @@ - revive path: internal/cmd/(util|context)/.+\.go text: var-naming + - linters: + - staticcheck + text: Datacenter is deprecated formatters: enable: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/.goreleaser.yml new/hcloud-cli-1.59.0/.goreleaser.yml --- old/hcloud-cli-1.58.0/.goreleaser.yml 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/.goreleaser.yml 2026-01-05 17:16:10.000000000 +0100 @@ -84,7 +84,7 @@ archives: - id: hcloud-archive - builds: + ids: - hcloud-build - hcloud-build-darwin name_template: "{{ .Binary }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/CHANGELOG.md new/hcloud-cli-1.59.0/CHANGELOG.md --- old/hcloud-cli-1.58.0/CHANGELOG.md 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/CHANGELOG.md 2026-01-05 17:16:10.000000000 +0100 @@ -1,5 +1,28 @@ # Changelog +## [v1.59.0](https://github.com/hetznercloud/cli/releases/tag/v1.59.0) + +### Deprecation of `datacenter` attribute for Primary IPs and Servers + +The `datacenter` attribute is deprecated in the `Primary IPs` and `Servers` API resources and will be removed after 1 July 2026. See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters for more details. + +The `location` attribute already exists for Servers, and was added for Primary IPs. + +Therefor the `datacenter` attribute is deprecated in favor of the `location` attribute in the following commands: + +- `hcloud server create` +- `hcloud server describe` +- `hcloud server list` +- `hcloud primary-ip create` +- `hcloud primary-ip describe` +- `hcloud primary-ip list` + +In list commands, the `datacenter` columns is not longer shown by default, and is replaced with the `location` column. + +### Features + +- **server,primary-ip**: deprecate datacenter (#1278) + ## [v1.58.0](https://github.com/hetznercloud/cli/releases/tag/v1.58.0) ### Features @@ -80,7 +103,7 @@ This release adds support for the new [DNS API](https://docs.hetzner.cloud/reference/cloud#dns). -The DNS API is currently in **beta**, which will likely end on 10 November 2025. After the beta ended, it will no longer be possible to create new zones in the old DNS system. See the [DNS Beta FAQ](https://docs.hetzner.com/networking/dns/faq/beta) for more details. +The DNS API is currently in **beta**, which will likely end on 10 November 2025. After the beta ended, it will no longer be possible to create new zones in the old DNS system. See the [DNS Beta FAQ](https://docs.hetzner.com/networking/dns/faq/beta/) for more details. Future minor releases of this project may include breaking changes for features that are related to the DNS API. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/docs/README.md new/hcloud-cli-1.59.0/docs/README.md --- old/hcloud-cli-1.58.0/docs/README.md 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/docs/README.md 2026-01-05 17:16:10.000000000 +0100 @@ -11,4 +11,4 @@ ## Getting help - 🐛 Report bugs using [our issue tracker](https://github.com/hetznercloud/cli/issues/new?template=bug.yaml). -- 🙋 If you need help, reach us using the [Support Center](https://console.hetzner.cloud/support). +- 🙋 If you need help, reach us using the [Support Center](https://console.hetzner.com/support). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/docs/guides/using-output-options.md new/hcloud-cli-1.59.0/docs/guides/using-output-options.md --- old/hcloud-cli-1.58.0/docs/guides/using-output-options.md 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/docs/guides/using-output-options.md 2026-01-05 17:16:10.000000000 +0100 @@ -116,7 +116,7 @@ ## Go Template Format `describe` commands support the Go string template format as well. You can read up on the syntax in the -[Go documentation](https://pkg.go.dev/text/template/). The data structures passed to the template are defined +[Go documentation](https://pkg.go.dev/text/template). The data structures passed to the template are defined by our API and can be found in [hcloud-go](https://pkg.go.dev/github.com/hetznercloud/hcloud-go/v2/hcloud/schema). For example, you could obtain the number of cores of a server using the following command: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/docs/reference/manual/hcloud_primary-ip_create.md new/hcloud-cli-1.59.0/docs/reference/manual/hcloud_primary-ip_create.md --- old/hcloud-cli-1.58.0/docs/reference/manual/hcloud_primary-ip_create.md 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/docs/reference/manual/hcloud_primary-ip_create.md 2026-01-05 17:16:10.000000000 +0100 @@ -2,6 +2,13 @@ Create a Primary IP +### Synopsis + +Create a Primary IP. + +The --datacenter flag is deprecated. Use --location or --assignee-id instead. +See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters. + ``` hcloud primary-ip create [options] --type <ipv4|ipv6> --name <name> ``` @@ -9,12 +16,13 @@ ### Options ``` - --assignee-id int Assignee (usually a Server) to assign Primary IP to (required if 'datacenter' is not specified) + --assignee-id int Assignee (usually a Server) to assign Primary IP to --auto-delete Delete Primary IP if assigned resource is deleted (true, false) - --datacenter string Datacenter (ID or name) (required if 'assignee-id' is not specified) + --datacenter string Datacenter (name) (deprecated) --enable-protection strings Enable protection (delete) (default: none) -h, --help help for create --label stringToString User-defined labels ('key=value') (can be specified multiple times) (default []) + --location string Location (ID or name) of Primary IP --name string Name (required) -o, --output stringArray output options: json|yaml --type string Type (ipv4 or ipv6) (required) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/docs/reference/manual/hcloud_server_create.md new/hcloud-cli-1.59.0/docs/reference/manual/hcloud_server_create.md --- old/hcloud-cli-1.58.0/docs/reference/manual/hcloud_server_create.md 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/docs/reference/manual/hcloud_server_create.md 2026-01-05 17:16:10.000000000 +0100 @@ -2,6 +2,13 @@ Create a Server +### Synopsis + +Create a Server. + +The --datacenter flag is deprecated. Use --location instead. +See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters. + ``` hcloud server create [options] --name <name> --type <server-type> --image <image> ``` @@ -11,7 +18,7 @@ ``` --allow-deprecated-image Enable the use of deprecated Images (default: false) (true, false) --automount Automount Volumes after attach (default: false) (true, false) - --datacenter string Datacenter (ID or name) + --datacenter string Datacenter (ID or name) (deprecated) --enable-backup Enable automatic backups (true, false) --enable-protection strings Enable protection (delete, rebuild) (default: none) --firewall strings ID or name of Firewall to attach the Server to (can be specified multiple times) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/docs/reference/manual/hcloud_zone_change-primary-nameservers.md new/hcloud-cli-1.59.0/docs/reference/manual/hcloud_zone_change-primary-nameservers.md --- old/hcloud-cli-1.58.0/docs/reference/manual/hcloud_zone_change-primary-nameservers.md 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/docs/reference/manual/hcloud_zone_change-primary-nameservers.md 2026-01-05 17:16:10.000000000 +0100 @@ -6,7 +6,8 @@ Changes the primary nameservers of a secondary Zone. -Input file has to be in JSON format. You can find the schema at https://docs.hetzner.cloud/reference/cloud#zone-actions-change-a-zone-primary-nameservers +Input file has to be in JSON format. You can find the schema at +https://docs.hetzner.cloud/reference/cloud#zone-actions-change-a-zones-primary-nameservers Example file content: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/docs/tutorials/setup-hcloud-cli.md new/hcloud-cli-1.59.0/docs/tutorials/setup-hcloud-cli.md --- old/hcloud-cli-1.58.0/docs/tutorials/setup-hcloud-cli.md 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/docs/tutorials/setup-hcloud-cli.md 2026-01-05 17:16:10.000000000 +0100 @@ -6,7 +6,7 @@ Before you begin, ensure you have the following: -- A [Hetzner Cloud account](https://console.hetzner.cloud). +- A [Hetzner Cloud account](https://console.hetzner.com). ## 1. Install the hcloud CLI @@ -144,7 +144,7 @@ The hcloud CLI uses contexts to manage multiple Hetzner Cloud tokens and set configuration preferences. First, you need to create an API token. -Follow the instructions in the [Hetzner Cloud documentation](https://docs.hetzner.com/cloud/api/getting-started/generating-api-token) to create your project API token. +Follow the instructions in the [Hetzner Cloud documentation](https://docs.hetzner.com/cloud/api/getting-started/generating-api-token/) to create your project API token. Once you have your token, you can create a context using the following command: @@ -179,4 +179,4 @@ If you see this output, congratulations! You have successfully set up the hcloud CLI on your local machine. If there are any problems, make sure you followed all steps of this tutorial correctly. If there still are problems, -you can reach out to our [Support](https://console.hetzner.cloud/support) to get help. +you can reach out to our [Support](https://console.hetzner.com/support) to get help. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/go.mod new/hcloud-cli-1.59.0/go.mod --- old/hcloud-cli-1.58.0/go.mod 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/go.mod 2026-01-05 17:16:10.000000000 +0100 @@ -12,8 +12,8 @@ github.com/fatih/structs v1.1.0 github.com/goccy/go-yaml v1.19.1 github.com/guptarohit/asciigraph v0.7.3 - github.com/hetznercloud/hcloud-go/v2 v2.32.0 - github.com/jedib0t/go-pretty/v6 v6.7.7 + github.com/hetznercloud/hcloud-go/v2 v2.33.0 + github.com/jedib0t/go-pretty/v6 v6.7.8 github.com/spf13/cast v1.10.0 github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 @@ -22,7 +22,7 @@ github.com/swaggest/assertjson v1.10.0 go.uber.org/mock v0.6.0 golang.org/x/crypto v0.46.0 - golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 + golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 golang.org/x/net v0.48.0 golang.org/x/term v0.38.0 golang.org/x/text v0.32.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/go.sum new/hcloud-cli-1.59.0/go.sum --- old/hcloud-cli-1.58.0/go.sum 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/go.sum 2026-01-05 17:16:10.000000000 +0100 @@ -36,14 +36,14 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/guptarohit/asciigraph v0.7.3 h1:p05XDDn7cBTWiBqWb30mrwxd6oU0claAjqeytllnsPY= github.com/guptarohit/asciigraph v0.7.3/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= -github.com/hetznercloud/hcloud-go/v2 v2.32.0 h1:BRe+k7ESdYv3xQLBGdKUfk+XBFRJNGKzq70nJI24ciM= -github.com/hetznercloud/hcloud-go/v2 v2.32.0/go.mod h1:hAanyyfn9M0cMmZ68CXzPCF54KRb9EXd8eiE2FHKGIE= +github.com/hetznercloud/hcloud-go/v2 v2.33.0 h1:g9hwuo60IXbupXJCYMlO4xDXgxxMPuFk31iOpLXDCV4= +github.com/hetznercloud/hcloud-go/v2 v2.33.0/go.mod h1:GzYEl7slIGKc6Ttt08hjiJvGj8/PbWzcQf6IUi02dIs= github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jedib0t/go-pretty/v6 v6.7.7 h1:Y1Id3lJ3k4UB8uwWWy3l8EVFnUlx5chR5+VbsofPNX0= -github.com/jedib0t/go-pretty/v6 v6.7.7/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.7.8 h1:BVYrDy5DPBA3Qn9ICT+PokP9cvCv1KaHv2i+Hc8sr5o= +github.com/jedib0t/go-pretty/v6 v6.7.8/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -120,8 +120,8 @@ go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= -golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 h1:MDfG8Cvcqlt9XXrmEiD4epKn7VJHZO84hejP9Jmp0MM= -golang.org/x/exp v0.0.0-20251209150349-8475f28825e9/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/all/list_test.go new/hcloud-cli-1.59.0/internal/cmd/all/list_test.go --- old/hcloud-cli-1.58.0/internal/cmd/all/list_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/all/list_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -41,6 +41,7 @@ }, }, Created: time.Now().Add(-72 * time.Hour), + Location: &hcloud.Location{Name: "hel1"}, Datacenter: &hcloud.Datacenter{Name: "hel1-dc2"}, }, }, nil) @@ -236,8 +237,8 @@ expOut := `SERVERS --- -ID NAME STATUS IPV4 IPV6 PRIVATE NET DATACENTER AGE -123 my server running 192.0.2.1 - - hel1-dc2 3d +ID NAME STATUS IPV4 IPV6 PRIVATE NET LOCATION AGE +123 my server running 192.0.2.1 - - hel1 3d IMAGES --- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/config/add_test.go new/hcloud-cli-1.59.0/internal/cmd/config/add_test.go --- old/hcloud-cli-1.58.0/internal/cmd/config/add_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/config/add_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -44,7 +44,7 @@ token = "super secret token" [contexts.preferences] array_option = ["1", "2", "3"] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] array_option = ["1", "2", "3"] @@ -83,7 +83,7 @@ token = "super secret token" [contexts.preferences] array_option = ["1", "2", "3", "a", "b", "c"] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] array_option = ["1", "2", "3"] @@ -111,7 +111,7 @@ token = "super secret token" [contexts.preferences] array_option = ["1", "2", "3"] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] array_option = ["1", "2", "3", "a", "b", "c"] @@ -140,7 +140,7 @@ token = "super secret token" [contexts.preferences] array_option = ["1", "2", "3"] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] array_option = ["1", "2", "3"] @@ -170,7 +170,7 @@ token = "super secret token" [contexts.preferences] array_option = ["1", "2", "3"] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] array_option = ["1", "2", "3"] @@ -204,7 +204,7 @@ token = "super secret token" [contexts.preferences] array_option = ["1", "2", "3"] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] array_option = ["1", "2", "3"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/config/get_test.go new/hcloud-cli-1.59.0/internal/cmd/config/get_test.go --- old/hcloud-cli-1.58.0/internal/cmd/config/get_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/config/get_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -34,7 +34,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.deeply] [contexts.preferences.deeply.nested] @@ -66,7 +66,7 @@ }, { key: "endpoint", - expOut: "https://test-endpoint.com\n", + expOut: "https://example.com\n", }, { key: "poll-interval", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/config/list_test.go new/hcloud-cli-1.59.0/internal/cmd/config/list_test.go --- old/hcloud-cli-1.58.0/internal/cmd/config/list_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/config/list_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -34,7 +34,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.deeply] [contexts.preferences.deeply.nested] @@ -58,14 +58,14 @@ { name: "default", args: []string{}, - expOut: `KEY VALUE -context test_context -debug yes -deeply.nested.option bar -endpoint https://test-endpoint.com -poll-interval 1.234s -quiet yes -token [redacted] + expOut: `KEY VALUE +context test_context +debug yes +deeply.nested.option bar +endpoint https://example.com +poll-interval 1.234s +quiet yes +token [redacted] `, }, { @@ -84,26 +84,26 @@ { name: "no header", args: []string{"-o=noheader"}, - expOut: `context test_context -debug yes -deeply.nested.option bar -endpoint https://test-endpoint.com -poll-interval 1.234s -quiet yes -token [redacted] + expOut: `context test_context +debug yes +deeply.nested.option bar +endpoint https://example.com +poll-interval 1.234s +quiet yes +token [redacted] `, }, { name: "allow sensitive", args: []string{"--allow-sensitive"}, - expOut: `KEY VALUE -context test_context -debug yes -deeply.nested.option bar -endpoint https://test-endpoint.com -poll-interval 1.234s -quiet yes -token super secret token + expOut: `KEY VALUE +context test_context +debug yes +deeply.nested.option bar +endpoint https://example.com +poll-interval 1.234s +quiet yes +token super secret token `, }, { @@ -125,7 +125,7 @@ }, { "key": "endpoint", - "value": "https://test-endpoint.com" + "value": "https://example.com" }, { "key": "poll-interval", @@ -165,6 +165,6 @@ func setTestValues(cfg config.Config) { _ = os.Setenv("HCLOUD_POLL_INTERVAL", "1234ms") _ = os.Setenv("HCLOUD_DEBUG", "true") - _ = cfg.FlagSet().Set("endpoint", "https://test-endpoint.com") + _ = cfg.FlagSet().Set("endpoint", "https://example.com") _ = cfg.FlagSet().Set("quiet", "true") } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/config/remove_test.go new/hcloud-cli-1.59.0/internal/cmd/config/remove_test.go --- old/hcloud-cli-1.58.0/internal/cmd/config/remove_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/config/remove_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -44,7 +44,7 @@ token = "super secret token" [contexts.preferences] array_option = ["1", "2", "3"] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] array_option = ["1", "2", "3"] @@ -84,7 +84,7 @@ token = "super secret token" [contexts.preferences] array_option = ["1"] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] array_option = ["1", "2", "3"] @@ -111,7 +111,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] array_option = ["1", "2", "3"] @@ -146,7 +146,7 @@ token = "super secret token" [contexts.preferences] array_option = ["1", "2", "3"] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] array_option = ["1"] @@ -174,7 +174,7 @@ token = "super secret token" [contexts.preferences] array_option = ["1", "2", "3"] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [[contexts]] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/config/set_test.go new/hcloud-cli-1.59.0/internal/cmd/config/set_test.go --- old/hcloud-cli-1.58.0/internal/cmd/config/set_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/config/set_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -52,7 +52,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [[contexts]] @@ -90,7 +90,7 @@ token = "super secret token" [contexts.preferences] debug_file = "debug.log" - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [[contexts]] @@ -123,7 +123,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [[contexts]] @@ -149,7 +149,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [[contexts]] @@ -174,7 +174,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] option = "bar" @@ -201,7 +201,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.deeply] [contexts.preferences.deeply.nested] @@ -230,7 +230,7 @@ token = "super secret token" [contexts.preferences] array_option = ["a", "b", "c"] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [[contexts]] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/config/unset_test.go new/hcloud-cli-1.59.0/internal/cmd/config/unset_test.go --- old/hcloud-cli-1.58.0/internal/cmd/config/unset_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/config/unset_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -43,7 +43,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.deeply] [contexts.preferences.deeply.nested] @@ -85,7 +85,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" [contexts.preferences.deeply] [contexts.preferences.deeply.nested] option = "bar" @@ -122,7 +122,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.deeply] [contexts.preferences.deeply.nested] @@ -149,7 +149,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.deeply] [contexts.preferences.deeply.nested] @@ -187,7 +187,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.deeply] [contexts.preferences.deeply.nested] @@ -217,7 +217,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.deeply] [contexts.preferences.deeply.nested] @@ -245,7 +245,7 @@ name = "test_context" token = "super secret token" [contexts.preferences] - endpoint = "https://test-endpoint.com" + endpoint = "https://example.com" quiet = true [contexts.preferences.nested] option = "foo" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/datacenter/describe.go new/hcloud-cli-1.59.0/internal/cmd/datacenter/describe.go --- old/hcloud-cli-1.58.0/internal/cmd/datacenter/describe.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/datacenter/describe.go 2026-01-05 17:16:10.000000000 +0100 @@ -41,14 +41,14 @@ fmt.Fprintf(&sb, "Name:\t%s\n", datacenter.Name) fmt.Fprintf(&sb, "Description:\t%s\n", datacenter.Description) - fmt.Fprintln(&sb) - fmt.Fprintf(&sb, "Location:\n") - fmt.Fprint(&sb, util.PrefixLines(location.DescribeLocation(datacenter.Location), " ")) - if short { return sb.String() } + fmt.Fprintln(&sb) + fmt.Fprintf(&sb, "Location:\n") + fmt.Fprint(&sb, util.PrefixLines(location.DescribeLocation(datacenter.Location), " ")) + type ServerTypeStatus struct { ID int64 Available bool diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/primaryip/create.go new/hcloud-cli-1.59.0/internal/cmd/primaryip/create.go --- old/hcloud-cli-1.58.0/internal/cmd/primaryip/create.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/primaryip/create.go 2026-01-05 17:16:10.000000000 +0100 @@ -2,6 +2,7 @@ import ( "fmt" + "strings" "github.com/spf13/cobra" @@ -16,8 +17,12 @@ var CreateCmd = base.CreateCmd[*hcloud.PrimaryIP]{ BaseCobraCommand: func(client hcapi2.Client) *cobra.Command { cmd := &cobra.Command{ - Use: "create [options] --type <ipv4|ipv6> --name <name>", - Short: "Create a Primary IP", + Use: "create [options] --type <ipv4|ipv6> --name <name>", + Short: "Create a Primary IP", + Long: `Create a Primary IP. + +The --datacenter flag is deprecated. Use --location or --assignee-id instead. +See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters.`, TraverseChildren: true, DisableFlagsInUseLine: true, } @@ -28,9 +33,12 @@ cmd.Flags().String("name", "", "Name (required)") _ = cmd.MarkFlagRequired("name") - cmd.Flags().Int64("assignee-id", 0, "Assignee (usually a Server) to assign Primary IP to (required if 'datacenter' is not specified)") + cmd.Flags().Int64("assignee-id", 0, "Assignee (usually a Server) to assign Primary IP to") + + cmd.Flags().String("location", "", "Location (ID or name) of Primary IP") + _ = cmd.RegisterFlagCompletionFunc("location", cmpl.SuggestCandidatesF(client.Location().Names)) - cmd.Flags().String("datacenter", "", "Datacenter (ID or name) (required if 'assignee-id' is not specified)") + cmd.Flags().String("datacenter", "", "Datacenter (name) (deprecated)") _ = cmd.RegisterFlagCompletionFunc("datacenter", cmpl.SuggestCandidatesF(client.Datacenter().Names)) cmd.Flags().StringToString("label", nil, "User-defined labels ('key=value') (can be specified multiple times)") @@ -40,8 +48,8 @@ cmd.Flags().Bool("auto-delete", false, "Delete Primary IP if assigned resource is deleted (true, false)") - cmd.MarkFlagsOneRequired("assignee-id", "datacenter") - cmd.MarkFlagsMutuallyExclusive("assignee-id", "datacenter") + cmd.MarkFlagsOneRequired("assignee-id", "datacenter", "location") + cmd.MarkFlagsMutuallyExclusive("assignee-id", "datacenter", "location") return cmd }, Run: func(s state.State, cmd *cobra.Command, _ []string) (*hcloud.PrimaryIP, any, error) { @@ -49,6 +57,7 @@ name, _ := cmd.Flags().GetString("name") assigneeID, _ := cmd.Flags().GetInt64("assignee-id") datacenter, _ := cmd.Flags().GetString("datacenter") + locationIDOrName, _ := cmd.Flags().GetString("location") labels, _ := cmd.Flags().GetStringToString("label") protection, _ := cmd.Flags().GetStringSlice("enable-protection") autoDelete, _ := cmd.Flags().GetBool("auto-delete") @@ -62,7 +71,6 @@ Type: hcloud.PrimaryIPType(typ), Name: name, AssigneeType: "server", - Datacenter: datacenter, Labels: labels, } if assigneeID != 0 { @@ -71,6 +79,30 @@ if cmd.Flags().Changed("auto-delete") { createOpts.AutoDelete = &autoDelete } + if cmd.Flags().Changed("location") { + location, _, err := s.Client().Location().Get(s, locationIDOrName) + if err != nil { + return nil, nil, err + } + if location == nil { + return nil, nil, fmt.Errorf("Location not found: %s", locationIDOrName) + } + createOpts.Location = location.Name + } + if cmd.Flags().Changed("datacenter") { + cmd.PrintErrln("Warning: The --datacenter flag is deprecated. Use --location or --assignee-id instead.") + + // Backward compatible datacenter argument. + // datacenter hel1-dc2 => location hel1 + parts := strings.Split(datacenter, "-") + + if len(parts) != 2 { + return nil, nil, fmt.Errorf("Datacenter name is not valid, expected format $LOCATION-$DATACENTER, but got: %s", datacenter) + } + + locationName := parts[0] + createOpts.Location = locationName + } result, _, err := s.Client().PrimaryIP().Create(s, createOpts) if err != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/primaryip/create_test.go new/hcloud-cli-1.59.0/internal/cmd/primaryip/create_test.go --- old/hcloud-cli-1.58.0/internal/cmd/primaryip/create_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/primaryip/create_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -39,7 +39,7 @@ hcloud.PrimaryIPCreateOpts{ Name: "my-ip", Type: "ipv4", - Datacenter: "fsn1-dc14", + Location: "fsn1", Labels: map[string]string{"foo": "bar"}, AssigneeType: "server", AutoDelete: hcloud.Ptr(true), @@ -62,12 +62,14 @@ out, errOut, err := fx.Run(cmd, []string{"--name=my-ip", "--type=ipv4", "--datacenter=fsn1-dc14", "--auto-delete", "--label", "foo=bar"}) + expErr := "Warning: The --datacenter flag is deprecated. Use --location or --assignee-id instead.\n" + expOut := `Primary IP 1 created IPv4: 192.168.2.1 ` require.NoError(t, err) - assert.Empty(t, errOut) + assert.Equal(t, expErr, errOut) assert.Equal(t, expOut, out) } @@ -85,6 +87,9 @@ Name: "my-ip", IP: net.ParseIP("192.168.2.1"), Type: "ipv4", + Location: &hcloud.Location{ + Name: "fsn1", + }, Datacenter: &hcloud.Datacenter{ ID: 1, Name: "fsn1-dc14", @@ -104,7 +109,7 @@ hcloud.PrimaryIPCreateOpts{ Name: "my-ip", Type: "ipv4", - Datacenter: "fsn1-dc14", + Location: "fsn1", Labels: map[string]string{"foo": "bar"}, AssigneeType: "server", AutoDelete: hcloud.Ptr(true), @@ -124,7 +129,9 @@ jsonOut, out, err := fx.Run(cmd, []string{"-o=json", "--name=my-ip", "--type=ipv4", "--datacenter=fsn1-dc14", "--auto-delete", "--label", "foo=bar"}) - expOut := "Primary IP 1 created\n" + expOut := `Warning: The --datacenter flag is deprecated. Use --location or --assignee-id instead. +Primary IP 1 created +` require.NoError(t, err) assert.Equal(t, expOut, out) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/primaryip/describe.go new/hcloud-cli-1.59.0/internal/cmd/primaryip/describe.go --- old/hcloud-cli-1.58.0/internal/cmd/primaryip/describe.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/primaryip/describe.go 2026-01-05 17:16:10.000000000 +0100 @@ -9,6 +9,7 @@ "github.com/hetznercloud/cli/internal/cmd/base" "github.com/hetznercloud/cli/internal/cmd/datacenter" + "github.com/hetznercloud/cli/internal/cmd/location" "github.com/hetznercloud/cli/internal/cmd/util" "github.com/hetznercloud/cli/internal/hcapi2" "github.com/hetznercloud/cli/internal/state" @@ -62,8 +63,15 @@ util.DescribeLabels(out, primaryIP.Labels, "") fmt.Fprintln(out) - fmt.Fprintf(out, "Datacenter:\n") - fmt.Fprintf(out, "%s", util.PrefixLines(datacenter.DescribeDatacenter(s.Client(), primaryIP.Datacenter, true), " ")) + fmt.Fprintf(out, "Location:\n") + fmt.Fprintf(out, "%s", util.PrefixLines(location.DescribeLocation(primaryIP.Location), " ")) + + if primaryIP.Datacenter != nil { + fmt.Fprintln(out) + fmt.Fprintf(out, "Datacenter:\n") + fmt.Fprintf(out, "%s", util.PrefixLines(datacenter.DescribeDatacenter(s.Client(), primaryIP.Datacenter, true), " ")) + } + return nil }, } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/primaryip/describe_test.go new/hcloud-cli-1.59.0/internal/cmd/primaryip/describe_test.go --- old/hcloud-cli-1.58.0/internal/cmd/primaryip/describe_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/primaryip/describe_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -35,7 +35,16 @@ Blocked: true, AutoDelete: false, AssigneeType: "server", - Datacenter: &hcloud.Datacenter{ID: 0, Location: &hcloud.Location{ID: 0}}, + Location: &hcloud.Location{ + ID: 3, + Name: "hel1", + Description: "Helsinki DC Park 1", + NetworkZone: "eu-central", + Country: "FI", + City: "Helsinki", + Latitude: 60.169855, + Longitude: 24.938379, + }, } fx.Client.PrimaryIPClient.EXPECT(). @@ -64,20 +73,15 @@ Labels: No labels -Datacenter: - ID: 0 - Name: - Description: - - Location: - ID: 0 - Name: - Description: - Network Zone: - Country: - City: - Latitude: 0.000000 - Longitude: 0.000000 +Location: + ID: 3 + Name: hel1 + Description: Helsinki DC Park 1 + Network Zone: eu-central + Country: FI + City: Helsinki + Latitude: 60.169855 + Longitude: 24.938379 `, util.Datetime(primaryIP.Created), humanize.Time(primaryIP.Created)) require.NoError(t, err) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/primaryip/testdata/create_response.json new/hcloud-cli-1.59.0/internal/cmd/primaryip/testdata/create_response.json --- old/hcloud-cli-1.58.0/internal/cmd/primaryip/testdata/create_response.json 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/primaryip/testdata/create_response.json 2026-01-05 17:16:10.000000000 +0100 @@ -5,6 +5,16 @@ "auto_delete": true, "blocked": false, "created": "2016-01-30T23:50:00Z", + "location": { + "city": "", + "country": "", + "description": "", + "id": 0, + "latitude": 0, + "longitude": 0, + "name": "fsn1", + "network_zone": "" + }, "datacenter": { "description": "", "id": 1, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/server/change_type.go new/hcloud-cli-1.59.0/internal/cmd/server/change_type.go --- old/hcloud-cli-1.58.0/internal/cmd/server/change_type.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/server/change_type.go 2026-01-05 17:16:10.000000000 +0100 @@ -47,7 +47,7 @@ return fmt.Errorf("Server Type not found: %s", serverTypeIDOrName) } - cmd.Print(deprecatedServerTypeWarning(serverType, server.Datacenter.Location.Name)) + cmd.Print(deprecatedServerTypeWarning(serverType, server.Location.Name)) keepDisk, _ := cmd.Flags().GetBool("keep-disk") opts := hcloud.ServerChangeTypeOpts{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/server/change_type_test.go new/hcloud-cli-1.59.0/internal/cmd/server/change_type_test.go --- old/hcloud-cli-1.58.0/internal/cmd/server/change_type_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/server/change_type_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -19,7 +19,7 @@ cmd := server.ChangeTypeCmd.CobraCommand(fx.State()) fx.ExpectEnsureToken() - srv := &hcloud.Server{ID: 123, Name: "my-server", Datacenter: &hcloud.Datacenter{Location: &hcloud.Location{Name: "fsn1"}}} + srv := &hcloud.Server{ID: 123, Name: "my-server", Location: &hcloud.Location{Name: "fsn1"}} st := &hcloud.ServerType{ID: 456, Name: "cax21", Locations: []hcloud.ServerTypeLocation{{Location: &hcloud.Location{Name: "fsn1"}}}} fx.Client.ServerClient.EXPECT(). @@ -53,7 +53,7 @@ cmd := server.ChangeTypeCmd.CobraCommand(fx.State()) fx.ExpectEnsureToken() - srv := &hcloud.Server{ID: 123, Name: "my-server", Datacenter: &hcloud.Datacenter{Location: &hcloud.Location{Name: "fsn1"}}} + srv := &hcloud.Server{ID: 123, Name: "my-server", Location: &hcloud.Location{Name: "fsn1"}} st := &hcloud.ServerType{ID: 456, Name: "cax21", Locations: []hcloud.ServerTypeLocation{{Location: &hcloud.Location{Name: "fsn1"}}}} fx.Client.ServerClient.EXPECT(). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/server/create.go new/hcloud-cli-1.59.0/internal/cmd/server/create.go --- old/hcloud-cli-1.58.0/internal/cmd/server/create.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/server/create.go 2026-01-05 17:16:10.000000000 +0100 @@ -9,6 +9,7 @@ "mime/multipart" "net/textproto" "os" + "strconv" "strings" "time" @@ -41,6 +42,10 @@ cmd := &cobra.Command{ Use: "create [options] --name <name> --type <server-type> --image <image>", Short: "Create a Server", + Long: `Create a Server. + +The --datacenter flag is deprecated. Use --location instead. +See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters.`, } cmd.Flags().String("name", "", "Server name (required)") @@ -57,7 +62,7 @@ cmd.Flags().String("location", "", "Location (ID or name)") _ = cmd.RegisterFlagCompletionFunc("location", cmpl.SuggestCandidatesF(client.Location().Names)) - cmd.Flags().String("datacenter", "", "Datacenter (ID or name)") + cmd.Flags().String("datacenter", "", "Datacenter (ID or name) (deprecated)") _ = cmd.RegisterFlagCompletionFunc("datacenter", cmpl.SuggestCandidatesF(client.Datacenter().Names)) cmd.Flags().StringSlice("ssh-key", nil, "ID or name of SSH Key to inject (can be specified multiple times)") @@ -433,17 +438,40 @@ } if datacenterIDOrName != "" { - var datacenter *hcloud.Datacenter - datacenter, _, err = s.Client().Datacenter().Get(s, datacenterIDOrName) - if err != nil { - return - } - if datacenter == nil { - err = fmt.Errorf("Datacenter not found: %s", datacenterIDOrName) - return + cmd.PrintErrln("Warning: The --datacenter flag is deprecated. Use --location instead.") + + // If parseable as ID -> GetByID and use Location Name + // Else -> Backwards-compatible split + var datacenterID int64 + datacenterID, err = strconv.ParseInt(datacenterIDOrName, 10, 64) + if err == nil { + // Input was a valid number/ID + var datacenter *hcloud.Datacenter + datacenter, _, err = s.Client().Datacenter().GetByID(s, datacenterID) + if err != nil { + return + } + if datacenter == nil { + err = fmt.Errorf("Datacenter not found: %s", datacenterIDOrName) + return + } + createOpts.Location = datacenter.Location + } else { + // Input was not a valid number/ID, probably DC name + + // Backward compatible datacenter argument. + // datacenter hel1-dc2 => location hel1 + parts := strings.Split(datacenterIDOrName, "-") + + if len(parts) != 2 { + err = fmt.Errorf("Datacenter name is not valid, expected format $LOCATION-$DATACENTER, but got: %s", datacenterIDOrName) + return + } + + createOpts.Location = &hcloud.Location{Name: parts[0]} } - createOpts.Datacenter = datacenter } + if locationIDOrName != "" { var location *hcloud.Location location, _, err = s.Client().Location().Get(s, locationIDOrName) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/server/describe.go new/hcloud-cli-1.59.0/internal/cmd/server/describe.go --- old/hcloud-cli-1.58.0/internal/cmd/server/describe.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/server/describe.go 2026-01-05 17:16:10.000000000 +0100 @@ -12,6 +12,7 @@ "github.com/hetznercloud/cli/internal/cmd/datacenter" "github.com/hetznercloud/cli/internal/cmd/image" "github.com/hetznercloud/cli/internal/cmd/iso" + "github.com/hetznercloud/cli/internal/cmd/location" "github.com/hetznercloud/cli/internal/cmd/placementgroup" "github.com/hetznercloud/cli/internal/cmd/servertype" "github.com/hetznercloud/cli/internal/cmd/util" @@ -45,7 +46,7 @@ // As we already know the location the server is in, we can show the deprecation info // of that server type in that specific location. locationInfoIndex := slices.IndexFunc(server.ServerType.Locations, func(locInfo hcloud.ServerTypeLocation) bool { - return locInfo.Location.Name == server.Datacenter.Location.Name + return locInfo.Location.Name == server.Location.Name }) if locationInfoIndex >= 0 { if text := util.DescribeDeprecation(server.ServerType.Locations[locationInfoIndex]); text != "" { @@ -145,8 +146,14 @@ } fmt.Fprintln(out) - fmt.Fprintf(out, "Datacenter:\n") - fmt.Fprint(out, util.PrefixLines(datacenter.DescribeDatacenter(s.Client(), server.Datacenter, true), " ")) + fmt.Fprintf(out, "Location:\n") + fmt.Fprint(out, util.PrefixLines(location.DescribeLocation(server.Location), " ")) + + if server.Datacenter != nil { + fmt.Fprintln(out) + fmt.Fprintf(out, "Datacenter:\n") + fmt.Fprintf(out, "%s", util.PrefixLines(datacenter.DescribeDatacenter(s.Client(), server.Datacenter, true), " ")) + } fmt.Fprintln(out) if server.BackupWindow != "" { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/server/describe_test.go new/hcloud-cli-1.59.0/internal/cmd/server/describe_test.go --- old/hcloud-cli-1.58.0/internal/cmd/server/describe_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/server/describe_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -66,20 +66,15 @@ "key": "value", }, }, - Datacenter: &hcloud.Datacenter{ - ID: 4, - Name: "hel1-dc2", - Location: &hcloud.Location{ - ID: 3, - Name: "hel1", - Description: "Helsinki DC Park 1", - NetworkZone: "eu-central", - Country: "FI", - City: "Helsinki", - Latitude: 60.169855, - Longitude: 24.938379, - }, - Description: "Helsinki 1 virtual DC 2", + Location: &hcloud.Location{ + ID: 3, + Name: "hel1", + Description: "Helsinki DC Park 1", + NetworkZone: "eu-central", + Country: "FI", + City: "Helsinki", + Latitude: 60.169855, + Longitude: 24.938379, }, IncludedTraffic: 20 * util.Tebibyte, Protection: hcloud.ServerProtection{Delete: true, Rebuild: true}, @@ -149,20 +144,15 @@ Labels: key: value -Datacenter: - ID: 4 - Name: hel1-dc2 - Description: Helsinki 1 virtual DC 2 - - Location: - ID: 3 - Name: hel1 - Description: Helsinki DC Park 1 - Network Zone: eu-central - Country: FI - City: Helsinki - Latitude: 60.169855 - Longitude: 24.938379 +Location: + ID: 3 + Name: hel1 + Description: Helsinki DC Park 1 + Network Zone: eu-central + Country: FI + City: Helsinki + Latitude: 60.169855 + Longitude: 24.938379 Backup Window: Backups disabled diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/server/list.go new/hcloud-cli-1.59.0/internal/cmd/server/list.go --- old/hcloud-cli-1.58.0/internal/cmd/server/list.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/server/list.go 2026-01-05 17:16:10.000000000 +0100 @@ -7,7 +7,7 @@ "strings" "time" - humanize "github.com/dustin/go-humanize" + "github.com/dustin/go-humanize" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -37,7 +37,7 @@ var ListCmd = &base.ListCmd[*hcloud.Server, schema.Server]{ ResourceNamePlural: "Servers", JSONKeyGetByName: "servers", - DefaultColumns: []string{"id", "name", "status", "ipv4", "ipv6", "private_net", "datacenter", "age"}, + DefaultColumns: []string{"id", "name", "status", "ipv4", "ipv6", "private_net", "location", "age"}, SortOption: config.OptionSortServer, AdditionalFlags: func(cmd *cobra.Command) { @@ -89,10 +89,14 @@ return humanize.IBytes(server.OutgoingTraffic) }). AddFieldFn("datacenter", func(server *hcloud.Server) string { - return server.Datacenter.Name + if server.Datacenter != nil { + return server.Datacenter.Name + } + return "-" + }). AddFieldFn("location", func(server *hcloud.Server) string { - return server.Datacenter.Location.Name + return server.Location.Name }). AddFieldFn("labels", func(server *hcloud.Server) string { return util.LabelsToString(server.Labels) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/server/list_test.go new/hcloud-cli-1.59.0/internal/cmd/server/list_test.go --- old/hcloud-cli-1.58.0/internal/cmd/server/list_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/server/list_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -34,10 +34,10 @@ ). Return([]*hcloud.Server{ { - ID: 123, - Name: "test", - Status: hcloud.ServerStatusRunning, - Datacenter: &hcloud.Datacenter{Name: "fsn1-dc14"}, + ID: 123, + Name: "test", + Status: hcloud.ServerStatusRunning, + Location: &hcloud.Location{Name: "fsn1"}, PublicNet: hcloud.ServerPublicNet{ IPv4: hcloud.ServerPublicNetIPv4{ IP: net.ParseIP("192.168.2.1"), @@ -49,8 +49,8 @@ out, errOut, err := fx.Run(cmd, []string{"--status", "running"}) - expOut := `ID NAME STATUS IPV4 IPV6 PRIVATE NET DATACENTER AGE -123 test running 192.168.2.1 - - fsn1-dc14 20s + expOut := `ID NAME STATUS IPV4 IPV6 PRIVATE NET LOCATION AGE +123 test running 192.168.2.1 - - fsn1 20s ` require.NoError(t, err) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/server/request_console_test.go new/hcloud-cli-1.59.0/internal/cmd/server/request_console_test.go --- old/hcloud-cli-1.58.0/internal/cmd/server/request_console_test.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/server/request_console_test.go 2026-01-05 17:16:10.000000000 +0100 @@ -29,7 +29,7 @@ Return(hcloud.ServerRequestConsoleResult{ Action: &hcloud.Action{ID: 789}, Password: "root-password", - WSSURL: "wss://console.hetzner.cloud/?token=123", + WSSURL: "wss://console.hetzner.com/?token=123", }, nil, nil) fx.ActionWaiter.EXPECT(). WaitForActions(gomock.Any(), gomock.Any(), &hcloud.Action{ID: 789}). @@ -40,7 +40,7 @@ require.NoError(t, err) assert.Empty(t, errOut) - assert.Equal(t, "Console for Server 123:\nWebSocket URL: wss://console.hetzner.cloud/?token=123\nVNC Password: root-password\n", out) + assert.Equal(t, "Console for Server 123:\nWebSocket URL: wss://console.hetzner.com/?token=123\nVNC Password: root-password\n", out) } func TestRequestConsoleJSON(t *testing.T) { @@ -60,7 +60,7 @@ Return(hcloud.ServerRequestConsoleResult{ Action: &hcloud.Action{ID: 789}, Password: "root-password", - WSSURL: "wss://console.hetzner.cloud/?token=123", + WSSURL: "wss://console.hetzner.com/?token=123", }, nil, nil) fx.ActionWaiter.EXPECT(). WaitForActions(gomock.Any(), gomock.Any(), &hcloud.Action{ID: 789}). @@ -71,5 +71,5 @@ require.NoError(t, err) assert.Empty(t, errOut) - assert.JSONEq(t, `{"wss_url": "wss://console.hetzner.cloud/?token=123", "password": "root-password"}`, out) + assert.JSONEq(t, `{"wss_url": "wss://console.hetzner.com/?token=123", "password": "root-password"}`, out) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/server/testdata/create_response.json new/hcloud-cli-1.59.0/internal/cmd/server/testdata/create_response.json --- old/hcloud-cli-1.58.0/internal/cmd/server/testdata/create_response.json 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/server/testdata/create_response.json 2026-01-05 17:16:10.000000000 +0100 @@ -3,6 +3,16 @@ "server": { "backup_window": null, "created": "2016-01-30T23:50:00Z", + "location": { + "city": "", + "country": "", + "description": "", + "id": 0, + "latitude": 0, + "longitude": 0, + "name": "", + "network_zone": "" + }, "datacenter": { "description": "", "id": 1, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/cmd/zone/change_primary_nameservers.go new/hcloud-cli-1.59.0/internal/cmd/zone/change_primary_nameservers.go --- old/hcloud-cli-1.58.0/internal/cmd/zone/change_primary_nameservers.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/cmd/zone/change_primary_nameservers.go 2026-01-05 17:16:10.000000000 +0100 @@ -24,7 +24,8 @@ Short: "Changes the primary nameservers of a secondary Zone", Long: `Changes the primary nameservers of a secondary Zone. -Input file has to be in JSON format. You can find the schema at https://docs.hetzner.cloud/reference/cloud#zone-actions-change-a-zone-primary-nameservers +Input file has to be in JSON format. You can find the schema at +https://docs.hetzner.cloud/reference/cloud#zone-actions-change-a-zones-primary-nameservers Example file content: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/hcapi2/mock/zz_zone_client_mock.go new/hcloud-cli-1.59.0/internal/hcapi2/mock/zz_zone_client_mock.go --- old/hcloud-cli-1.58.0/internal/hcapi2/mock/zz_zone_client_mock.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/hcapi2/mock/zz_zone_client_mock.go 2026-01-05 17:16:10.000000000 +0100 @@ -510,3 +510,19 @@ mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateRRSet", reflect.TypeOf((*MockZoneClient)(nil).UpdateRRSet), ctx, rrset, opts) } + +// UpdateRRSetRecords mocks base method. +func (m *MockZoneClient) UpdateRRSetRecords(ctx context.Context, rrset *hcloud.ZoneRRSet, opts hcloud.ZoneRRSetUpdateRecordsOpts) (*hcloud.Action, *hcloud.Response, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateRRSetRecords", ctx, rrset, opts) + ret0, _ := ret[0].(*hcloud.Action) + ret1, _ := ret[1].(*hcloud.Response) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// UpdateRRSetRecords indicates an expected call of UpdateRRSetRecords. +func (mr *MockZoneClientMockRecorder) UpdateRRSetRecords(ctx, rrset, opts any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateRRSetRecords", reflect.TypeOf((*MockZoneClient)(nil).UpdateRRSetRecords), ctx, rrset, opts) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/internal/version/version.go new/hcloud-cli-1.59.0/internal/version/version.go --- old/hcloud-cli-1.58.0/internal/version/version.go 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/internal/version/version.go 2026-01-05 17:16:10.000000000 +0100 @@ -2,7 +2,7 @@ var ( // version is a semver version (https://semver.org). - version = "1.58.0" // x-releaser-pleaser-version + version = "1.59.0" // x-releaser-pleaser-version // versionPrerelease is a semver version pre-release identifier (https://semver.org). // diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hcloud-cli-1.58.0/mise.toml new/hcloud-cli-1.59.0/mise.toml --- old/hcloud-cli-1.58.0/mise.toml 2025-12-18 17:46:45.000000000 +0100 +++ new/hcloud-cli-1.59.0/mise.toml 2026-01-05 17:16:10.000000000 +0100 @@ -1,11 +1,7 @@ [tools] go = "1.25.5" "go:go.uber.org/mock/mockgen" = "v0.6.0" -"ubi:golangci/golangci-lint" = "2.7.2" -"ubi:goreleaser/goreleaser" = "v2.13.1" -"ubi:anchore/quill" = "v0.5.1" -"ubi:jstemmer/go-junit-report" = "v2.1.0" - -[settings] -# Experimental features are needed for the Go backend -experimental = true +"github:golangci/golangci-lint" = "2.7.2" # renovate: datasource=github-releases depName=golangci/golangci-lint +"github:goreleaser/goreleaser" = "v2.13.2" # renovate: datasource=github-releases depName=goreleaser/goreleaser +"github:anchore/quill" = "v0.5.1" # renovate: datasource=github-releases depName=anchore/quill +"github:jstemmer/go-junit-report" = "v2.1.0" # renovate: datasource=github-releases depName=jstemmer/go-junit-report ++++++ hcloud-cli.obsinfo ++++++ --- /var/tmp/diff_new_pack.1rPrNL/_old 2026-01-12 10:34:10.437226743 +0100 +++ /var/tmp/diff_new_pack.1rPrNL/_new 2026-01-12 10:34:10.453227401 +0100 @@ -1,5 +1,5 @@ name: hcloud-cli -version: 1.58.0 -mtime: 1766076405 -commit: d5b8b962bee7a9e71e91cab973dd26807d994ea7 +version: 1.59.0 +mtime: 1767629770 +commit: e01a16ea40bdf213362675eeb94d61776619be01 ++++++ vendor.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/action.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/action.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/action.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/action.go 2026-01-05 17:16:10.000000000 +0100 @@ -128,13 +128,17 @@ // // Deprecated: It is required to pass in a list of IDs since 30 January 2025. Please use [ActionClient.AllWithOpts] instead. func (c *ActionClient) All(ctx context.Context) ([]*Action, error) { - return c.action.All(ctx, ActionListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.action.All(ctx, ActionListOpts{}) } // AllWithOpts returns all actions for the given options. // // It is required to set [ActionListOpts.ID]. Any other fields set in the opts are ignored. func (c *ActionClient) AllWithOpts(ctx context.Context, opts ActionListOpts) ([]*Action, error) { + if opts.ListOpts.PerPage == 0 { + // Do not send unused per page param + opts.ListOpts.PerPage = -1 + } return c.action.All(ctx, opts) } @@ -189,6 +193,9 @@ // All returns all actions for the given options. func (c *ResourceActionClient) All(ctx context.Context, opts ActionListOpts) ([]*Action, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*Action, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/certificate.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/certificate.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/certificate.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/certificate.go 2026-01-05 17:16:10.000000000 +0100 @@ -161,11 +161,14 @@ // All returns all Certificates. func (c *CertificateClient) All(ctx context.Context) ([]*Certificate, error) { - return c.AllWithOpts(ctx, CertificateListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, CertificateListOpts{}) } // AllWithOpts returns all Certificates for the given options. func (c *CertificateClient) AllWithOpts(ctx context.Context, opts CertificateListOpts) ([]*Certificate, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*Certificate, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/datacenter.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/datacenter.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/datacenter.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/datacenter.go 2026-01-05 17:16:10.000000000 +0100 @@ -103,11 +103,14 @@ // All returns all datacenters. func (c *DatacenterClient) All(ctx context.Context) ([]*Datacenter, error) { - return c.AllWithOpts(ctx, DatacenterListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, DatacenterListOpts{}) } // AllWithOpts returns all datacenters for the given options. func (c *DatacenterClient) AllWithOpts(ctx context.Context, opts DatacenterListOpts) ([]*Datacenter, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*Datacenter, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/firewall.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/firewall.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/firewall.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/firewall.go 2026-01-05 17:16:10.000000000 +0100 @@ -163,11 +163,14 @@ // All returns all Firewalls. func (c *FirewallClient) All(ctx context.Context) ([]*Firewall, error) { - return c.AllWithOpts(ctx, FirewallListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, FirewallListOpts{}) } // AllWithOpts returns all Firewalls for the given options. func (c *FirewallClient) AllWithOpts(ctx context.Context, opts FirewallListOpts) ([]*Firewall, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*Firewall, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/floating_ip.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/floating_ip.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/floating_ip.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/floating_ip.go 2026-01-05 17:16:10.000000000 +0100 @@ -157,11 +157,14 @@ // All returns all Floating IPs. func (c *FloatingIPClient) All(ctx context.Context) ([]*FloatingIP, error) { - return c.AllWithOpts(ctx, FloatingIPListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, FloatingIPListOpts{}) } // AllWithOpts returns all Floating IPs for the given options. func (c *FloatingIPClient) AllWithOpts(ctx context.Context, opts FloatingIPListOpts) ([]*FloatingIP, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*FloatingIP, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/hcloud.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/hcloud.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/hcloud.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/hcloud.go 2026-01-05 17:16:10.000000000 +0100 @@ -31,4 +31,4 @@ package hcloud // Version is the library's version following Semantic Versioning. -const Version = "2.32.0" // x-releaser-pleaser-version +const Version = "2.33.0" // x-releaser-pleaser-version diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/image.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/image.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/image.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/image.go 2026-01-05 17:16:10.000000000 +0100 @@ -198,11 +198,14 @@ // All returns all images. func (c *ImageClient) All(ctx context.Context) ([]*Image, error) { - return c.AllWithOpts(ctx, ImageListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, ImageListOpts{}) } // AllWithOpts returns all images for the given options. func (c *ImageClient) AllWithOpts(ctx context.Context, opts ImageListOpts) ([]*Image, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*Image, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/iso.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/iso.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/iso.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/iso.go 2026-01-05 17:16:10.000000000 +0100 @@ -123,11 +123,14 @@ // All returns all ISOs. func (c *ISOClient) All(ctx context.Context) ([]*ISO, error) { - return c.AllWithOpts(ctx, ISOListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, ISOListOpts{}) } // AllWithOpts returns all ISOs for the given options. func (c *ISOClient) AllWithOpts(ctx context.Context, opts ISOListOpts) ([]*ISO, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*ISO, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/load_balancer.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/load_balancer.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/load_balancer.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/load_balancer.go 2026-01-05 17:16:10.000000000 +0100 @@ -316,11 +316,14 @@ // All returns all Load Balancers. func (c *LoadBalancerClient) All(ctx context.Context) ([]*LoadBalancer, error) { - return c.AllWithOpts(ctx, LoadBalancerListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, LoadBalancerListOpts{}) } // AllWithOpts returns all Load Balancers for the given options. func (c *LoadBalancerClient) AllWithOpts(ctx context.Context, opts LoadBalancerListOpts) ([]*LoadBalancer, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*LoadBalancer, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/load_balancer_type.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/load_balancer_type.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/load_balancer_type.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/load_balancer_type.go 2026-01-05 17:16:10.000000000 +0100 @@ -100,11 +100,14 @@ // All returns all Load Balancer types. func (c *LoadBalancerTypeClient) All(ctx context.Context) ([]*LoadBalancerType, error) { - return c.AllWithOpts(ctx, LoadBalancerTypeListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, LoadBalancerTypeListOpts{}) } // AllWithOpts returns all Load Balancer types for the given options. func (c *LoadBalancerTypeClient) AllWithOpts(ctx context.Context, opts LoadBalancerTypeListOpts) ([]*LoadBalancerType, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*LoadBalancerType, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/location.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/location.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/location.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/location.go 2026-01-05 17:16:10.000000000 +0100 @@ -99,11 +99,14 @@ // All returns all locations. func (c *LocationClient) All(ctx context.Context) ([]*Location, error) { - return c.AllWithOpts(ctx, LocationListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, LocationListOpts{}) } // AllWithOpts returns all locations for the given options. func (c *LocationClient) AllWithOpts(ctx context.Context, opts LocationListOpts) ([]*Location, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*Location, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/network.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/network.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/network.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/network.go 2026-01-05 17:16:10.000000000 +0100 @@ -151,11 +151,14 @@ // All returns all networks. func (c *NetworkClient) All(ctx context.Context) ([]*Network, error) { - return c.AllWithOpts(ctx, NetworkListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, NetworkListOpts{}) } // AllWithOpts returns all networks for the given options. func (c *NetworkClient) AllWithOpts(ctx context.Context, opts NetworkListOpts) ([]*Network, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*Network, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/placement_group.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/placement_group.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/placement_group.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/placement_group.go 2026-01-05 17:16:10.000000000 +0100 @@ -106,17 +106,14 @@ // All returns all PlacementGroups. func (c *PlacementGroupClient) All(ctx context.Context) ([]*PlacementGroup, error) { - opts := PlacementGroupListOpts{ - ListOpts: ListOpts{ - PerPage: 50, - }, - } - - return c.AllWithOpts(ctx, opts) + return c.AllWithOpts(ctx, PlacementGroupListOpts{}) } // AllWithOpts returns all PlacementGroups for the given options. func (c *PlacementGroupClient) AllWithOpts(ctx context.Context, opts PlacementGroupListOpts) ([]*PlacementGroup, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*PlacementGroup, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/primary_ip.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/primary_ip.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/primary_ip.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/primary_ip.go 2026-01-05 17:16:10.000000000 +0100 @@ -26,7 +26,12 @@ AutoDelete bool Blocked bool Created time.Time - Datacenter *Datacenter + Location *Location + + // Deprecated: [PrimaryIP.Datacenter] is deprecated and will be removed after 1 July 2026. + // Use [PrimaryIP.Location] instead. + // See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters + Datacenter *Datacenter } // PrimaryIPProtection represents the protection level of a Primary IP. @@ -88,10 +93,15 @@ AssigneeID *int64 AssigneeType string AutoDelete *bool - Datacenter string + Location string Labels map[string]string Name string Type PrimaryIPType + + // Deprecated: [PrimaryIPCreateOpts.Datacenter] is deprecated and will be removed after 1 July 2026. + // Use [PrimaryIPCreateOpts.Location] instead. + // See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters + Datacenter string } // PrimaryIPCreateResult defines the response @@ -230,11 +240,14 @@ // All returns all Primary IPs. func (c *PrimaryIPClient) All(ctx context.Context) ([]*PrimaryIP, error) { - return c.AllWithOpts(ctx, PrimaryIPListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, PrimaryIPListOpts{}) } // AllWithOpts returns all Primary IPs for the given options. func (c *PrimaryIPClient) AllWithOpts(ctx context.Context, opts PrimaryIPListOpts) ([]*PrimaryIP, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*PrimaryIP, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/primary_ip.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/primary_ip.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/primary_ip.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/primary_ip.go 2026-01-05 17:16:10.000000000 +0100 @@ -16,7 +16,12 @@ AutoDelete bool `json:"auto_delete"` Blocked bool `json:"blocked"` Created time.Time `json:"created"` - Datacenter Datacenter `json:"datacenter"` + Location Location `json:"location"` + + // Deprecated: [PrimaryIP.Datacenter] is deprecated and will be removed after 1 July 2026. + // Use [PrimaryIP.Location] instead. + // See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters + Datacenter *Datacenter `json:"datacenter"` } // PrimaryIPProtection represents the protection level of a Primary IP. @@ -40,7 +45,12 @@ AssigneeID *int64 `json:"assignee_id,omitempty"` Labels *map[string]string `json:"labels,omitempty"` AutoDelete *bool `json:"auto_delete,omitempty"` - Datacenter string `json:"datacenter,omitempty"` + Location string `json:"location,omitempty"` + + // Deprecated: [PrimaryIPCreateRequest.Datacenter] is deprecated and will be removed after 1 July 2026. + // Use [PrimaryIPCreateRequest.Location] instead. + // See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters + Datacenter string `json:"datacenter,omitempty"` } // PrimaryIPCreateResponse defines the schema of the response diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/server.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/server.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/server.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/server.go 2026-01-05 17:16:10.000000000 +0100 @@ -18,7 +18,7 @@ RescueEnabled bool `json:"rescue_enabled"` ISO *ISO `json:"iso"` Locked bool `json:"locked"` - Datacenter Datacenter `json:"datacenter"` + Location Location `json:"location"` Image *Image `json:"image"` Protection ServerProtection `json:"protection"` Labels map[string]string `json:"labels"` @@ -26,6 +26,11 @@ PrimaryDiskSize int `json:"primary_disk_size"` PlacementGroup *PlacementGroup `json:"placement_group"` LoadBalancers []int64 `json:"load_balancers"` + + // Deprecated: [Server.Datacenter] is deprecated and will be removed after 1 July 2026. + // Use [Server.Location] instead. + // See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters + Datacenter *Datacenter `json:"datacenter"` } // ServerProtection defines the schema of a server's resource protection. @@ -103,7 +108,6 @@ Image IDOrName `json:"image"` SSHKeys []int64 `json:"ssh_keys,omitempty"` Location string `json:"location,omitempty"` - Datacenter string `json:"datacenter,omitempty"` UserData string `json:"user_data,omitempty"` StartAfterCreate *bool `json:"start_after_create,omitempty"` Labels *map[string]string `json:"labels,omitempty"` @@ -113,6 +117,11 @@ Firewalls []ServerCreateFirewalls `json:"firewalls,omitempty"` PlacementGroup int64 `json:"placement_group,omitempty"` PublicNet *ServerCreatePublicNet `json:"public_net,omitempty"` + + // Deprecated: [ServerCreateRequest.Datacenter] is deprecated and will be removed after 1 July 2026. + // Use [ServerCreateRequest.Location] instead. + // See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters + Datacenter string `json:"datacenter,omitempty"` } // ServerCreatePublicNet defines the public network configuration of a server. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/zone_rrset.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/zone_rrset.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/zone_rrset.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema/zone_rrset.go 2026-01-05 17:16:10.000000000 +0100 @@ -66,6 +66,15 @@ TTL *int `json:"ttl,omitempty"` } +type ZoneRRSetUpdateRecordsRequest struct { + Records []ZoneRRSetUpdateRecordsRequestRecord `json:"records"` +} + +type ZoneRRSetUpdateRecordsRequestRecord struct { + Value string `json:"value"` + Comment string `json:"comment"` // Always send comment +} + type ZoneRRSetRemoveRecordsRequest struct { Records []ZoneRRSetRecord `json:"records"` } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema.go 2026-01-05 17:16:10.000000000 +0100 @@ -423,6 +423,10 @@ return c.SchemaFromZoneRRSetAddRecordsOpts(opts) } +func SchemaFromZoneRRSetUpdateRecordsOpts(opts ZoneRRSetUpdateRecordsOpts) schema.ZoneRRSetUpdateRecordsRequest { + return c.SchemaFromZoneRRSetUpdateRecordsOpts(opts) +} + func SchemaFromZoneRRSetRemoveRecordsOpts(opts ZoneRRSetRemoveRecordsOpts) schema.ZoneRRSetRemoveRecordsRequest { return c.SchemaFromZoneRRSetRemoveRecordsOpts(opts) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema_gen.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema_gen.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema_gen.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/schema_gen.go 2026-01-05 17:16:10.000000000 +0100 @@ -388,6 +388,7 @@ SchemaFromZoneRRSetSetRecordsOpts(ZoneRRSetSetRecordsOpts) schema.ZoneRRSetSetRecordsRequest SchemaFromZoneRRSetAddRecordsOpts(ZoneRRSetAddRecordsOpts) schema.ZoneRRSetAddRecordsRequest + SchemaFromZoneRRSetUpdateRecordsOpts(ZoneRRSetUpdateRecordsOpts) schema.ZoneRRSetUpdateRecordsRequest SchemaFromZoneRRSetRemoveRecordsOpts(ZoneRRSetRemoveRecordsOpts) schema.ZoneRRSetRemoveRecordsRequest // StorageBoxType diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/server.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/server.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/server.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/server.go 2026-01-05 17:16:10.000000000 +0100 @@ -22,7 +22,7 @@ PublicNet ServerPublicNet PrivateNet []ServerPrivateNet ServerType *ServerType - Datacenter *Datacenter + Location *Location IncludedTraffic uint64 OutgoingTraffic uint64 IngoingTraffic uint64 @@ -37,6 +37,11 @@ PrimaryDiskSize int PlacementGroup *PlacementGroup LoadBalancers []*LoadBalancer + + // Deprecated: [Server.Datacenter] is deprecated and will be removed after 1 July 2026. + // Use [Server.Location] instead. + // See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters + Datacenter *Datacenter } // ServerProtection represents the protection level of a server. @@ -274,11 +279,14 @@ // All returns all servers. func (c *ServerClient) All(ctx context.Context) ([]*Server, error) { - return c.AllWithOpts(ctx, ServerListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, ServerListOpts{}) } // AllWithOpts returns all servers for the given options. func (c *ServerClient) AllWithOpts(ctx context.Context, opts ServerListOpts) ([]*Server, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*Server, *Response, error) { opts.Page = page return c.List(ctx, opts) @@ -292,7 +300,6 @@ Image *Image SSHKeys []*SSHKey Location *Location - Datacenter *Datacenter UserData string StartAfterCreate *bool Labels map[string]string @@ -302,6 +309,11 @@ Firewalls []*ServerCreateFirewall PlacementGroup *PlacementGroup PublicNet *ServerCreatePublicNet + + // Deprecated: [ServerCreateOpts.Datacenter] is deprecated and will be removed after 1 July 2026. + // Use [ServerCreateOpts.Location] instead. + // See https://docs.hetzner.cloud/changelog#2025-12-16-phasing-out-datacenters + Datacenter *Datacenter } type ServerCreatePublicNet struct { @@ -404,9 +416,9 @@ } if opts.Datacenter != nil { if opts.Datacenter.ID != 0 { - reqBody.Datacenter = strconv.FormatInt(opts.Datacenter.ID, 10) + reqBody.Datacenter = strconv.FormatInt(opts.Datacenter.ID, 10) // nolint:staticcheck // Deprecated } else { - reqBody.Datacenter = opts.Datacenter.Name + reqBody.Datacenter = opts.Datacenter.Name // nolint:staticcheck // Deprecated } } if opts.PlacementGroup != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/server_type.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/server_type.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/server_type.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/server_type.go 2026-01-05 17:16:10.000000000 +0100 @@ -139,11 +139,14 @@ // All returns all server types. func (c *ServerTypeClient) All(ctx context.Context) ([]*ServerType, error) { - return c.AllWithOpts(ctx, ServerTypeListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, ServerTypeListOpts{}) } // AllWithOpts returns all server types for the given options. func (c *ServerTypeClient) AllWithOpts(ctx context.Context, opts ServerTypeListOpts) ([]*ServerType, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*ServerType, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/ssh_key.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/ssh_key.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/ssh_key.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/ssh_key.go 2026-01-05 17:16:10.000000000 +0100 @@ -105,11 +105,14 @@ // All returns all SSH keys. func (c *SSHKeyClient) All(ctx context.Context) ([]*SSHKey, error) { - return c.AllWithOpts(ctx, SSHKeyListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, SSHKeyListOpts{}) } // AllWithOpts returns all SSH keys with the given options. func (c *SSHKeyClient) AllWithOpts(ctx context.Context, opts SSHKeyListOpts) ([]*SSHKey, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*SSHKey, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/storage_box.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/storage_box.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/storage_box.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/storage_box.go 2026-01-05 17:16:10.000000000 +0100 @@ -180,7 +180,7 @@ // // Experimental: [StorageBoxClient] is experimental, breaking changes may occur within minor releases. func (c *StorageBoxClient) All(ctx context.Context) ([]*StorageBox, error) { - return c.AllWithOpts(ctx, StorageBoxListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, StorageBoxListOpts{}) } // AllWithOpts returns all [StorageBox] with the given options. @@ -189,6 +189,9 @@ // // Experimental: [StorageBoxClient] is experimental, breaking changes may occur within minor releases. func (c *StorageBoxClient) AllWithOpts(ctx context.Context, opts StorageBoxListOpts) ([]*StorageBox, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*StorageBox, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/storage_box_type.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/storage_box_type.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/storage_box_type.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/storage_box_type.go 2026-01-05 17:16:10.000000000 +0100 @@ -79,7 +79,7 @@ // // Experimental: [StorageBoxTypeClient] is experimental, breaking changes may occur within minor releases. func (c *StorageBoxTypeClient) All(ctx context.Context) ([]*StorageBoxType, error) { - return c.AllWithOpts(ctx, StorageBoxTypeListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, StorageBoxTypeListOpts{}) } // AllWithOpts returns all storage box types for the given options. @@ -88,6 +88,9 @@ // // Experimental: [StorageBoxTypeClient] is experimental, breaking changes may occur within minor releases. func (c *StorageBoxTypeClient) AllWithOpts(ctx context.Context, opts StorageBoxTypeListOpts) ([]*StorageBoxType, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*StorageBoxType, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/volume.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/volume.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/volume.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/volume.go 2026-01-05 17:16:10.000000000 +0100 @@ -125,11 +125,14 @@ // All returns all volumes. func (c *VolumeClient) All(ctx context.Context) ([]*Volume, error) { - return c.AllWithOpts(ctx, VolumeListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, VolumeListOpts{}) } // AllWithOpts returns all volumes with the given options. func (c *VolumeClient) AllWithOpts(ctx context.Context, opts VolumeListOpts) ([]*Volume, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*Volume, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zone.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zone.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zone.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zone.go 2026-01-05 17:16:10.000000000 +0100 @@ -197,13 +197,16 @@ // // See https://docs.hetzner.cloud/reference/cloud#zones-list-zones func (c *ZoneClient) All(ctx context.Context) ([]*Zone, error) { - return c.AllWithOpts(ctx, ZoneListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllWithOpts(ctx, ZoneListOpts{}) } // AllWithOpts returns a list of all [Zone] with the given options. // // See https://docs.hetzner.cloud/reference/cloud#zones-list-zones func (c *ZoneClient) AllWithOpts(ctx context.Context, opts ZoneListOpts) ([]*Zone, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*Zone, *Response, error) { opts.Page = page return c.List(ctx, opts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zone_rrset.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zone_rrset.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zone_rrset.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zone_rrset.go 2026-01-05 17:16:10.000000000 +0100 @@ -163,6 +163,9 @@ // // See https://docs.hetzner.cloud/reference/cloud#zone-rrsets-list-rrsets func (c *ZoneClient) AllRRSetsWithOpts(ctx context.Context, zone *Zone, opts ZoneRRSetListOpts) ([]*ZoneRRSet, error) { + if opts.ListOpts.PerPage == 0 { + opts.ListOpts.PerPage = 50 + } return iterPages(func(page int) ([]*ZoneRRSet, *Response, error) { opts.Page = page return c.ListRRSets(ctx, zone, opts) @@ -173,7 +176,7 @@ // // See https://docs.hetzner.cloud/reference/cloud#zone-rrsets-list-rrsets func (c *ZoneClient) AllRRSets(ctx context.Context, zone *Zone) ([]*ZoneRRSet, error) { - return c.AllRRSetsWithOpts(ctx, zone, ZoneRRSetListOpts{ListOpts: ListOpts{PerPage: 50}}) + return c.AllRRSetsWithOpts(ctx, zone, ZoneRRSetListOpts{}) } // ZoneRRSetCreateOpts defines options for creating a [ZoneRRSet]. @@ -445,6 +448,44 @@ respBody, resp, err := postRequest[schema.ActionGetResponse](ctx, c.client, reqPath, reqBody) if err != nil { + return nil, resp, err + } + + return ActionFromSchema(respBody.Action), resp, err +} + +// ZoneRRSetUpdateRecordsOpts defines options for updating records of a [ZoneRRSet]. +type ZoneRRSetUpdateRecordsOpts struct { + Records []ZoneRRSetRecord +} + +// UpdateRRSetRecords updates records of a [ZoneRRSet]. +// +// See https://docs.hetzner.cloud/reference/cloud#zone-rrset-actions-add-records-to-an-rrset +func (c *ZoneClient) UpdateRRSetRecords(ctx context.Context, rrset *ZoneRRSet, opts ZoneRRSetUpdateRecordsOpts) (*Action, *Response, error) { + const opPath = "/zones/%s/rrsets/%s/%s/actions/update_records" + ctx = ctxutil.SetOpPath(ctx, opPath) + + if rrset.Zone == nil { + return nil, nil, invalidArgument("rrset", rrset, missingField(rrset, "Zone")) + } + + zoneIDOrName, err := rrset.Zone.idOrName() + if err != nil { + return nil, nil, invalidArgument("rrset", rrset, err) + } + + rrsetName, rrsetType, err := rrset.nameAndType() + if err != nil { + return nil, nil, invalidArgument("rrset", rrset, err) + } + + reqPath := fmt.Sprintf(opPath, zoneIDOrName, rrsetName, rrsetType) + + reqBody := SchemaFromZoneRRSetUpdateRecordsOpts(opts) + + respBody, resp, err := postRequest[schema.ActionGetResponse](ctx, c.client, reqPath, reqBody) + if err != nil { return nil, resp, err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zz_schema.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zz_schema.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zz_schema.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zz_schema.go 2026-01-05 17:16:10.000000000 +0100 @@ -442,7 +442,8 @@ hcloudPrimaryIP.AutoDelete = source.AutoDelete hcloudPrimaryIP.Blocked = source.Blocked hcloudPrimaryIP.Created = c.timeTimeToTimeTime(source.Created) - hcloudPrimaryIP.Datacenter = c.DatacenterFromSchema(source.Datacenter) + hcloudPrimaryIP.Location = c.LocationFromSchema(source.Location) + hcloudPrimaryIP.Datacenter = c.pSchemaDatacenterToPHcloudDatacenter(source.Datacenter) return &hcloudPrimaryIP } func (c *converterImpl) SSHKeyFromSchema(source schema.SSHKey) *SSHKey { @@ -956,7 +957,8 @@ schemaPrimaryIP.AutoDelete = (*source).AutoDelete schemaPrimaryIP.Blocked = (*source).Blocked schemaPrimaryIP.Created = c.timeTimeToTimeTime((*source).Created) - schemaPrimaryIP.Datacenter = c.SchemaFromDatacenter((*source).Datacenter) + schemaPrimaryIP.Location = c.SchemaFromLocation((*source).Location) + schemaPrimaryIP.Datacenter = c.pHcloudDatacenterToPSchemaDatacenter((*source).Datacenter) } return schemaPrimaryIP } @@ -986,6 +988,7 @@ schemaPrimaryIPCreateRequest.AssigneeID = source.AssigneeID schemaPrimaryIPCreateRequest.Labels = stringMapToStringMapPtr(source.Labels) schemaPrimaryIPCreateRequest.AutoDelete = source.AutoDelete + schemaPrimaryIPCreateRequest.Location = source.Location schemaPrimaryIPCreateRequest.Datacenter = source.Datacenter return schemaPrimaryIPCreateRequest } @@ -1030,7 +1033,7 @@ schemaServer.RescueEnabled = (*source).RescueEnabled schemaServer.ISO = c.pHcloudISOToPSchemaISO((*source).ISO) schemaServer.Locked = (*source).Locked - schemaServer.Datacenter = c.SchemaFromDatacenter((*source).Datacenter) + schemaServer.Location = c.SchemaFromLocation((*source).Location) schemaServer.Image = c.pHcloudImageToPSchemaImage((*source).Image) schemaServer.Protection = c.hcloudServerProtectionToSchemaServerProtection((*source).Protection) schemaServer.Labels = (*source).Labels @@ -1048,6 +1051,7 @@ schemaServer.LoadBalancers[k] = c.pHcloudLoadBalancerToInt64((*source).LoadBalancers[k]) } } + schemaServer.Datacenter = c.pHcloudDatacenterToPSchemaDatacenter((*source).Datacenter) } return schemaServer } @@ -1467,6 +1471,16 @@ schemaZoneRRSetUpdateRequest.Labels = stringMapToStringMapPtr(source.Labels) return schemaZoneRRSetUpdateRequest } +func (c *converterImpl) SchemaFromZoneRRSetUpdateRecordsOpts(source ZoneRRSetUpdateRecordsOpts) schema.ZoneRRSetUpdateRecordsRequest { + var schemaZoneRRSetUpdateRecordsRequest schema.ZoneRRSetUpdateRecordsRequest + if source.Records != nil { + schemaZoneRRSetUpdateRecordsRequest.Records = make([]schema.ZoneRRSetUpdateRecordsRequestRecord, len(source.Records)) + for i := 0; i < len(source.Records); i++ { + schemaZoneRRSetUpdateRecordsRequest.Records[i] = c.hcloudZoneRRSetRecordToSchemaZoneRRSetUpdateRecordsRequestRecord(source.Records[i]) + } + } + return schemaZoneRRSetUpdateRecordsRequest +} func (c *converterImpl) SchemaFromZoneUpdateOpts(source ZoneUpdateOpts) schema.ZoneUpdateRequest { var schemaZoneUpdateRequest schema.ZoneUpdateRequest schemaZoneUpdateRequest.Labels = stringMapToStringMapPtr(source.Labels) @@ -1486,7 +1500,7 @@ } } hcloudServer.ServerType = c.ServerTypeFromSchema(source.ServerType) - hcloudServer.Datacenter = c.DatacenterFromSchema(source.Datacenter) + hcloudServer.Location = c.LocationFromSchema(source.Location) hcloudServer.IncludedTraffic = source.IncludedTraffic if source.OutgoingTraffic != nil { hcloudServer.OutgoingTraffic = *source.OutgoingTraffic @@ -1518,6 +1532,7 @@ hcloudServer.LoadBalancers[k] = &hcloudLoadBalancer } } + hcloudServer.Datacenter = c.pSchemaDatacenterToPHcloudDatacenter(source.Datacenter) return &hcloudServer } func (c *converterImpl) ServerMetricsFromSchema(source *schema.ServerGetMetricsResponse) (*ServerMetrics, error) { @@ -2049,6 +2064,12 @@ schemaZoneRRSetRecord.Comment = source.Comment return schemaZoneRRSetRecord } +func (c *converterImpl) hcloudZoneRRSetRecordToSchemaZoneRRSetUpdateRecordsRequestRecord(source ZoneRRSetRecord) schema.ZoneRRSetUpdateRecordsRequestRecord { + var schemaZoneRRSetUpdateRecordsRequestRecord schema.ZoneRRSetUpdateRecordsRequestRecord + schemaZoneRRSetUpdateRecordsRequestRecord.Value = source.Value + schemaZoneRRSetUpdateRecordsRequestRecord.Comment = source.Comment + return schemaZoneRRSetUpdateRecordsRequestRecord +} func (c *converterImpl) intISOFromSchema(source schema.ISO) ISO { var hcloudISO ISO hcloudISO.ID = source.ID @@ -2110,6 +2131,19 @@ } return pSchemaCertificateStatusRef } +func (c *converterImpl) pHcloudDatacenterToPSchemaDatacenter(source *Datacenter) *schema.Datacenter { + var pSchemaDatacenter *schema.Datacenter + if source != nil { + var schemaDatacenter schema.Datacenter + schemaDatacenter.ID = (*source).ID + schemaDatacenter.Name = (*source).Name + schemaDatacenter.Description = (*source).Description + schemaDatacenter.Location = c.SchemaFromLocation((*source).Location) + schemaDatacenter.ServerTypes = c.hcloudDatacenterServerTypesToSchemaDatacenterServerTypes((*source).ServerTypes) + pSchemaDatacenter = &schemaDatacenter + } + return pSchemaDatacenter +} func (c *converterImpl) pHcloudErrorToPSchemaError(source *Error) *schema.Error { var pSchemaError *schema.Error if source != nil { @@ -2535,6 +2569,19 @@ } return pHcloudCertificateStatus } +func (c *converterImpl) pSchemaDatacenterToPHcloudDatacenter(source *schema.Datacenter) *Datacenter { + var pHcloudDatacenter *Datacenter + if source != nil { + var hcloudDatacenter Datacenter + hcloudDatacenter.ID = (*source).ID + hcloudDatacenter.Name = (*source).Name + hcloudDatacenter.Description = (*source).Description + hcloudDatacenter.Location = c.LocationFromSchema((*source).Location) + hcloudDatacenter.ServerTypes = c.schemaDatacenterServerTypesToHcloudDatacenterServerTypes((*source).ServerTypes) + pHcloudDatacenter = &hcloudDatacenter + } + return pHcloudDatacenter +} func (c *converterImpl) pSchemaErrorToPHcloudError(source *schema.Error) *Error { var pHcloudError *Error if source != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zz_zone_client_iface.go new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zz_zone_client_iface.go --- old/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zz_zone_client_iface.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/hetznercloud/hcloud-go/v2/hcloud/zz_zone_client_iface.go 2026-01-05 17:16:10.000000000 +0100 @@ -112,6 +112,10 @@ // // See https://docs.hetzner.cloud/reference/cloud#zone-rrset-actions-add-records-to-an-rrset AddRRSetRecords(ctx context.Context, rrset *ZoneRRSet, opts ZoneRRSetAddRecordsOpts) (*Action, *Response, error) + // UpdateRRSetRecords updates records of a [ZoneRRSet]. + // + // See https://docs.hetzner.cloud/reference/cloud#zone-rrset-actions-add-records-to-an-rrset + UpdateRRSetRecords(ctx context.Context, rrset *ZoneRRSet, opts ZoneRRSetUpdateRecordsOpts) (*Action, *Response, error) // RemoveRRSetRecords removes records from a [ZoneRRSet]. // // See https://docs.hetzner.cloud/reference/cloud#zone-rrset-actions-remove-records-from-an-rrset diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/jedib0t/go-pretty/v6/table/render_csv.go new/vendor/github.com/jedib0t/go-pretty/v6/table/render_csv.go --- old/vendor/github.com/jedib0t/go-pretty/v6/table/render_csv.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/jedib0t/go-pretty/v6/table/render_csv.go 2026-01-05 17:16:10.000000000 +0100 @@ -36,11 +36,11 @@ } func (t *Table) csvFixCommas(str string) string { - return strings.Replace(str, ",", "\\,", -1) + return strings.ReplaceAll(str, ",", "\\,") } func (t *Table) csvFixDoubleQuotes(str string) string { - return strings.Replace(str, "\"", "\\\"", -1) + return strings.ReplaceAll(str, "\"", "\\\"") } func (t *Table) csvRenderRow(out *strings.Builder, row rowStr, hint renderHint) { @@ -54,7 +54,7 @@ // auto-index column if colIdx == 0 && t.autoIndex { if hint.isRegularRow() { - out.WriteString(fmt.Sprint(hint.rowNumber)) + fmt.Fprint(out, hint.rowNumber) } out.WriteRune(',') } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/jedib0t/go-pretty/v6/table/render_html.go new/vendor/github.com/jedib0t/go-pretty/v6/table/render_html.go --- old/vendor/github.com/jedib0t/go-pretty/v6/table/render_html.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/jedib0t/go-pretty/v6/table/render_html.go 2026-01-05 17:16:10.000000000 +0100 @@ -151,7 +151,7 @@ out.WriteString("</td>\n") } else { out.WriteString(" <td align=\"right\">") - out.WriteString(fmt.Sprint(hint.rowNumber)) + fmt.Fprint(out, hint.rowNumber) out.WriteString("</td>\n") } } @@ -191,10 +191,10 @@ t.htmlRenderColumnAttributes(out, colIdx, hint, align) if extraColumnsRendered > 0 { out.WriteString(" colspan=") - out.WriteString(fmt.Sprint(extraColumnsRendered + 1)) + fmt.Fprint(out, extraColumnsRendered+1) } else if rowSpan := t.shouldMergeCellsVerticallyBelow(colIdx, hint); rowSpan > 1 { out.WriteString(" rowspan=") - out.WriteString(fmt.Sprint(rowSpan)) + fmt.Fprint(out, rowSpan) } out.WriteString(">") if len(colStr) == 0 { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/jedib0t/go-pretty/v6/table/render_markdown.go new/vendor/github.com/jedib0t/go-pretty/v6/table/render_markdown.go --- old/vendor/github.com/jedib0t/go-pretty/v6/table/render_markdown.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/jedib0t/go-pretty/v6/table/render_markdown.go 2026-01-05 17:16:10.000000000 +0100 @@ -66,7 +66,7 @@ if hint.isSeparatorRow { out.WriteString("---:") } else if hint.isRegularRow() { - out.WriteString(fmt.Sprintf("%d ", hint.rowNumber)) + fmt.Fprintf(out, "%d ", hint.rowNumber) } out.WriteRune('|') } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/jedib0t/go-pretty/v6/table/render_tsv.go new/vendor/github.com/jedib0t/go-pretty/v6/table/render_tsv.go --- old/vendor/github.com/jedib0t/go-pretty/v6/table/render_tsv.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/jedib0t/go-pretty/v6/table/render_tsv.go 2026-01-05 17:16:10.000000000 +0100 @@ -40,7 +40,7 @@ for idx, col := range row { if idx == 0 && t.autoIndex { if hint.isRegularRow() { - out.WriteString(fmt.Sprint(hint.rowNumber)) + fmt.Fprint(out, hint.rowNumber) } out.WriteRune('\t') } @@ -51,7 +51,7 @@ if strings.ContainsAny(col, "\t\n\"") || strings.Contains(col, " ") { col = strings.ReplaceAll(col, "\"", "\"\"") // fix double-quotes - out.WriteString(fmt.Sprintf("\"%s\"", col)) + fmt.Fprintf(out, "\"%s\"", col) } else { out.WriteString(col) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/jedib0t/go-pretty/v6/text/ansi.go new/vendor/github.com/jedib0t/go-pretty/v6/text/ansi.go --- old/vendor/github.com/jedib0t/go-pretty/v6/text/ansi.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/jedib0t/go-pretty/v6/text/ansi.go 2026-01-05 17:16:10.000000000 +0100 @@ -15,18 +15,22 @@ // Escape("Nymeria\x1b[94mGhost\x1b[0mLady", "\x1b[91m") == "\x1b[91mNymeria\x1b[94mGhost\x1b[0m\x1b[91mLady\x1b[0m" // Escape("Nymeria \x1b[94mGhost\x1b[0m Lady", "\x1b[91m") == "\x1b[91mNymeria \x1b[94mGhost\x1b[0m\x1b[91m Lady\x1b[0m" func Escape(str string, escapeSeq string) string { - out := "" + var out strings.Builder + // Estimate capacity: original string + escape sequences + out.Grow(len(str) + len(escapeSeq)*3 + len(EscapeReset)*2) + if !strings.HasPrefix(str, EscapeStart) { - out += escapeSeq + out.WriteString(escapeSeq) } - out += strings.Replace(str, EscapeReset, EscapeReset+escapeSeq, -1) - if !strings.HasSuffix(out, EscapeReset) { - out += EscapeReset + out.WriteString(strings.ReplaceAll(str, EscapeReset, EscapeReset+escapeSeq)) + if !strings.HasSuffix(out.String(), EscapeReset) { + out.WriteString(EscapeReset) } - if strings.Contains(out, escapeSeq+EscapeReset) { - out = strings.Replace(out, escapeSeq+EscapeReset, "", -1) + result := out.String() + if strings.Contains(result, escapeSeq+EscapeReset) { + result = strings.ReplaceAll(result, escapeSeq+EscapeReset, "") } - return out + return result } // StripEscape strips all ANSI Escape Sequence from the string. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/jedib0t/go-pretty/v6/text/valign.go new/vendor/github.com/jedib0t/go-pretty/v6/text/valign.go --- old/vendor/github.com/jedib0t/go-pretty/v6/text/valign.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/jedib0t/go-pretty/v6/text/valign.go 2026-01-05 17:16:10.000000000 +0100 @@ -27,10 +27,11 @@ maxLines = len(lines) } - insertIdx := 0 - if va == VAlignMiddle { + var insertIdx int + switch va { + case VAlignMiddle: insertIdx = int(maxLines-len(lines)) / 2 - } else if va == VAlignBottom { + case VAlignBottom: insertIdx = maxLines - len(lines) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/jedib0t/go-pretty/v6/text/wrap.go new/vendor/github.com/jedib0t/go-pretty/v6/text/wrap.go --- old/vendor/github.com/jedib0t/go-pretty/v6/text/wrap.go 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/github.com/jedib0t/go-pretty/v6/text/wrap.go 2026-01-05 17:16:10.000000000 +0100 @@ -13,7 +13,7 @@ if wrapLen <= 0 { return "" } - str = strings.Replace(str, "\t", " ", -1) + str = strings.ReplaceAll(str, "\t", " ") sLen := StringWidthWithoutEscSequences(str) if sLen <= wrapLen { return str @@ -41,7 +41,7 @@ if wrapLen <= 0 { return "" } - str = strings.Replace(str, "\t", " ", -1) + str = strings.ReplaceAll(str, "\t", " ") sLen := StringWidthWithoutEscSequences(str) if sLen <= wrapLen { return str @@ -68,7 +68,7 @@ if wrapLen <= 0 { return "" } - str = strings.Replace(str, "\t", " ", -1) + str = strings.ReplaceAll(str, "\t", " ") sLen := StringWidthWithoutEscSequences(str) if sLen <= wrapLen { return str diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/modules.txt new/vendor/modules.txt --- old/vendor/modules.txt 2025-12-18 17:46:45.000000000 +0100 +++ new/vendor/modules.txt 2026-01-05 17:16:10.000000000 +0100 @@ -55,7 +55,7 @@ # github.com/guptarohit/asciigraph v0.7.3 ## explicit; go 1.11 github.com/guptarohit/asciigraph -# github.com/hetznercloud/hcloud-go/v2 v2.32.0 +# github.com/hetznercloud/hcloud-go/v2 v2.33.0 ## explicit; go 1.24.0 github.com/hetznercloud/hcloud-go/v2/hcloud github.com/hetznercloud/hcloud-go/v2/hcloud/exp/actionutil @@ -73,7 +73,7 @@ # github.com/inconshreveable/mousetrap v1.1.0 ## explicit; go 1.18 github.com/inconshreveable/mousetrap -# github.com/jedib0t/go-pretty/v6 v6.7.7 +# github.com/jedib0t/go-pretty/v6 v6.7.8 ## explicit; go 1.18 github.com/jedib0t/go-pretty/v6/table github.com/jedib0t/go-pretty/v6/text @@ -193,7 +193,7 @@ golang.org/x/crypto/internal/poly1305 golang.org/x/crypto/ssh golang.org/x/crypto/ssh/internal/bcrypt_pbkdf -# golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 +# golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 ## explicit; go 1.24.0 golang.org/x/exp/maps # golang.org/x/net v0.48.0
