Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package hcloud-upload-image for
openSUSE:Factory checked in at 2026-05-15 23:54:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/hcloud-upload-image (Old)
and /work/SRC/openSUSE:Factory/.hcloud-upload-image.new.1966 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "hcloud-upload-image"
Fri May 15 23:54:27 2026 rev:6 rq:1353299 version:1.4.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/hcloud-upload-image/hcloud-upload-image.changes
2026-01-13 21:24:17.446500896 +0100
+++
/work/SRC/openSUSE:Factory/.hcloud-upload-image.new.1966/hcloud-upload-image.changes
2026-05-15 23:54:46.036213814 +0200
@@ -1,0 +2,39 @@
+Fri May 15 06:51:47 UTC 2026 - Johannes Kastl
<[email protected]>
+
+- Update to version 1.4.0:
+ * Features
+ - feat: faster writing to disk by skipping zero blocks (#165)
+ - docs: fix label value in comment (#161)
+ - feat: Add Nix support (#109)
+ - docs(nix): Add installation from nixpkgs, simplify others
+ (#164)
+ * Dependencies
+ - chore(deps): update module
+ github.com/apricote/hcloud-upload-image/hcloudimages to
+ v1.4.0 (#173)
+ - chore(main): release hcloudimages 1.4.0 (#166)
+ - chore(deps): update module
+ github.com/hetznercloud/hcloud-go/v2 to v2.40.0 (#155)
+ - feat: require Go 1.25 (#172)
+ - chore(deps): update actions/deploy-pages action to v5 (#167)
+ - chore(deps): update googleapis/release-please-action action
+ to v5 (#171)
+ - chore(deps): update actions/upload-pages-artifact action to
+ v5 (#170)
+ - chore(deps): update actions/configure-pages action to v6
+ (#168)
+ - chore(deps): update go toolchain directive to v1.26.3 (#162)
+ - chore(deps): update dependency golangci/golangci-lint to
+ v2.12.2 (#163)
+ - chore(deps): update dependency go to v1.26.0 (#154)
+ - chore(deps): update docker/login-action digest to 3227f53
+ (#150)
+ - chore(deps): update actions/checkout digest to de0fac2 (#156)
+ - chore(deps): update dependency golangci/golangci-lint to
+ v2.10.1 (#151)
+ - chore(deps): update goreleaser/goreleaser-action action to v7
+ (#158)
+ - chore(deps): update module
+ github.com/hetznercloud/hcloud-go/v2 to v2.34.0 (#152)
+
+-------------------------------------------------------------------
Old:
----
hcloud-upload-image-1.3.0.obscpio
New:
----
hcloud-upload-image-1.4.0.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ hcloud-upload-image.spec ++++++
--- /var/tmp/diff_new_pack.Snjcrc/_old 2026-05-15 23:54:47.280265023 +0200
+++ /var/tmp/diff_new_pack.Snjcrc/_new 2026-05-15 23:54:47.292265517 +0200
@@ -17,7 +17,7 @@
Name: hcloud-upload-image
-Version: 1.3.0
+Version: 1.4.0
Release: 0
Summary: Quickly upload any raw disk images into your Hetzner Cloud
projects
License: MIT
@@ -27,7 +27,7 @@
BuildRequires: bash-completion
BuildRequires: fish
BuildRequires: zsh
-BuildRequires: golang(API) >= 1.24
+BuildRequires: golang(API) >= 1.25
%description
Quickly upload any raw disk images into your Hetzner Cloud projects!
++++++ _service ++++++
--- /var/tmp/diff_new_pack.Snjcrc/_old 2026-05-15 23:54:47.604278361 +0200
+++ /var/tmp/diff_new_pack.Snjcrc/_new 2026-05-15 23:54:47.648280172 +0200
@@ -5,7 +5,7 @@
<param name="exclude">.git</param>
<param name="exclude">go.work</param>
<param name="exclude">go.work.sum</param>
- <param name="revision">v1.3.0</param>
+ <param name="revision">v1.4.0</param>
<param name="match-tag">v*</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="versionrewrite-pattern">v(.*)</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.Snjcrc/_old 2026-05-15 23:54:47.820287252 +0200
+++ /var/tmp/diff_new_pack.Snjcrc/_new 2026-05-15 23:54:47.856288734 +0200
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param
name="url">https://github.com/apricote/hcloud-upload-image/</param>
- <param
name="changesrevision">b440f8d7f6d465e706a86fd2edfe20ad3e1982bc</param></service></servicedata>
+ <param
name="changesrevision">73af6a8a750a37d062bbb8e8dd4d09f17274f5a3</param></service></servicedata>
(No newline at EOF)
++++++ hcloud-upload-image-1.3.0.obscpio -> hcloud-upload-image-1.4.0.obscpio
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/CHANGELOG.md
new/hcloud-upload-image-1.4.0/CHANGELOG.md
--- old/hcloud-upload-image-1.3.0/CHANGELOG.md 2025-12-22 15:20:32.000000000
+0100
+++ new/hcloud-upload-image-1.4.0/CHANGELOG.md 2026-05-14 20:52:38.000000000
+0200
@@ -1,5 +1,14 @@
# Changelog
+##
[1.4.0](https://github.com/apricote/hcloud-upload-image/compare/v1.3.0...v1.4.0)
(2026-05-14)
+
+
+### Features
+
+* Add Nix support
([#109](https://github.com/apricote/hcloud-upload-image/issues/109))
([756f051](https://github.com/apricote/hcloud-upload-image/commit/756f0515707c58bd228349928a6c88f58f1fe56a))
+* faster writing to disk by skipping zero blocks
([#165](https://github.com/apricote/hcloud-upload-image/issues/165))
([fc871af](https://github.com/apricote/hcloud-upload-image/commit/fc871afa8d9a5f468572cda0911537ecbf79fd58))
+* require Go 1.25
([#172](https://github.com/apricote/hcloud-upload-image/issues/172))
([6a457b1](https://github.com/apricote/hcloud-upload-image/commit/6a457b11d3ea400e9ac8b6e25bbbb46168fe0ab5))
+
##
[1.3.0](https://github.com/apricote/hcloud-upload-image/compare/v1.2.0...v1.3.0)
(2025-12-22)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/README.md
new/hcloud-upload-image-1.4.0/README.md
--- old/hcloud-upload-image-1.3.0/README.md 2025-12-22 15:20:32.000000000
+0100
+++ new/hcloud-upload-image-1.4.0/README.md 2026-05-14 20:52:38.000000000
+0200
@@ -58,6 +58,48 @@
go install github.com/apricote/hcloud-upload-image@latest
```
+#### Nix/NixOS
+
+To run directly without installing (assumes flakes are enabled):
+
+```shell
+# Run the application directly
+nix run github:apricote/hcloud-upload-image
+```
+
+To install on your system from nixpkgs (assumes nixos-unstable):
+
+```nix
+{pkgs, ...}: {
+ environment.systemPackages = [ pkgs.hcloud-upload-image ];
+}
+```
+
+To install on your system (assumes flakes are enabled):
+
+```nix
+# flake.nix
+{
+ inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+ inputs.hcloud-upload-image.url = "github:apricote/hcloud-upload-image";
+ inputs.hcloud-upload-image.inputs.nixpkgs.follows = "nixpkgs";
+
+ outputs = { self, nixpkgs, hcloud-upload-image }: {
+ nixosConfigurations.my-system = nixpkgs.lib.nixosSystem {
+ system = "x86_64-linux";
+ modules = [
+ ./configuration.nix
+ {
+ environment.systemPackages = [
+ hcloud-upload-image.packages.x86_64-linux.default
+ ];
+ }
+ ];
+ };
+ };
+}
+```
+
#### Docker
There is a docker image published at `ghcr.io/apricote/hcloud-upload-image`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/default.nix
new/hcloud-upload-image-1.4.0/default.nix
--- old/hcloud-upload-image-1.3.0/default.nix 1970-01-01 01:00:00.000000000
+0100
+++ new/hcloud-upload-image-1.4.0/default.nix 2026-05-14 20:52:38.000000000
+0200
@@ -0,0 +1,35 @@
+{
+ lib,
+ buildGoModule,
+}:
+buildGoModule rec {
+ pname = "hcloud-upload-image";
+ version =
+ builtins.head (builtins.match ".*version = \"([0-9.]+)\".*"
+ (builtins.readFile ./internal/version/version.go));
+
+ src = ./.;
+ vendorHash = "sha256-CVdhf8pDBANzlZzaqaGPv+vUTOQB/K+LEIh8tZUTSnA=";
+ env.GOWORK = "off";
+ subPackages = ["."];
+ goSum = ./go.sum; # make sure to rebuild
+
+ postPatch = ''
+ echo 'replace github.com/apricote/hcloud-upload-image/hcloudimages =>
./hcloudimages' >> go.mod
+ '';
+
+
+ ldflags = [
+ "-s"
+ "-w"
+ "-X main.version=${version}"
+ ];
+
+ meta = {
+ description = "Quickly upload any raw disk images into your Hetzner Cloud
projects";
+ homepage = "https://github.com/apricote/hcloud-upload-image";
+ license = lib.licenses.mit;
+ maintainers = [];
+ mainProgram = "hcloud-upload-image";
+ };
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/flake.lock
new/hcloud-upload-image-1.4.0/flake.lock
--- old/hcloud-upload-image-1.3.0/flake.lock 1970-01-01 01:00:00.000000000
+0100
+++ new/hcloud-upload-image-1.4.0/flake.lock 2026-05-14 20:52:38.000000000
+0200
@@ -0,0 +1,61 @@
+{
+ "nodes": {
+ "flake-parts": {
+ "inputs": {
+ "nixpkgs-lib": "nixpkgs-lib"
+ },
+ "locked": {
+ "lastModified": 1778716662,
+ "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1778443072,
+ "narHash": "sha256-zi7/fsqM/kFdNuED//4WOCUtezGtKKqRNORjMvfwjnA=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "da5ad661ba4e5ef59ba743f0d112cbc30e474f32",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs-lib": {
+ "locked": {
+ "lastModified": 1777168982,
+ "narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=",
+ "owner": "nix-community",
+ "repo": "nixpkgs.lib",
+ "rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "nixpkgs.lib",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "flake-parts": "flake-parts",
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/flake.nix
new/hcloud-upload-image-1.4.0/flake.nix
--- old/hcloud-upload-image-1.3.0/flake.nix 1970-01-01 01:00:00.000000000
+0100
+++ new/hcloud-upload-image-1.4.0/flake.nix 2026-05-14 20:52:38.000000000
+0200
@@ -0,0 +1,34 @@
+{
+ description = "hcloud-upload-image - Quickly upload any raw disk images into
your Hetzner Cloud projects";
+
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+ flake-parts.url = "github:hercules-ci/flake-parts";
+ };
+
+ outputs = inputs @ {flake-parts, ...}:
+ flake-parts.lib.mkFlake {inherit inputs;} {
+ systems = [
+ "x86_64-linux"
+ "aarch64-linux"
+ "x86_64-darwin"
+ "aarch64-darwin"
+ ];
+
+ perSystem = {pkgs, ...}: let
+ pkg = pkgs.callPackage ./default.nix {};
+ app = {
+ type = "app";
+ program = "${pkg}/bin/hcloud-upload-image";
+ };
+ in {
+ packages.default = pkg;
+ packages.hcloud-upload-image = pkg;
+
+ apps.default = app;
+ apps.hcloud-upload-image = app;
+
+ devShells.default = pkgs.callPackage ./shell.nix {};
+ };
+ };
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/go.mod
new/hcloud-upload-image-1.4.0/go.mod
--- old/hcloud-upload-image-1.3.0/go.mod 2025-12-22 15:20:32.000000000
+0100
+++ new/hcloud-upload-image-1.4.0/go.mod 2026-05-14 20:52:38.000000000
+0200
@@ -1,19 +1,19 @@
module github.com/apricote/hcloud-upload-image
-go 1.24.0
+go 1.25.0
-toolchain go1.25.5
+toolchain go1.26.3
require (
- github.com/apricote/hcloud-upload-image/hcloudimages v1.3.0
- github.com/hetznercloud/hcloud-go/v2 v2.33.0
+ github.com/apricote/hcloud-upload-image/hcloudimages v1.4.0
+ github.com/hetznercloud/hcloud-go/v2 v2.40.0
github.com/spf13/cobra v1.10.2
)
require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
- github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
+ github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 //
indirect
github.com/prometheus/client_golang v1.23.2 // indirect
@@ -24,9 +24,9 @@
github.com/spf13/pflag v1.0.9 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
- golang.org/x/crypto v0.46.0 // indirect
- golang.org/x/net v0.48.0 // indirect
- golang.org/x/sys v0.39.0 // indirect
- golang.org/x/text v0.32.0 // indirect
+ golang.org/x/crypto v0.51.0 // indirect
+ golang.org/x/net v0.53.0 // indirect
+ golang.org/x/sys v0.44.0 // indirect
+ golang.org/x/text v0.37.0 // indirect
google.golang.org/protobuf v1.36.8 // indirect
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/go.sum
new/hcloud-upload-image-1.4.0/go.sum
--- old/hcloud-upload-image-1.3.0/go.sum 2025-12-22 15:20:32.000000000
+0100
+++ new/hcloud-upload-image-1.4.0/go.sum 2026-05-14 20:52:38.000000000
+0200
@@ -1,17 +1,18 @@
-github.com/apricote/hcloud-upload-image/hcloudimages v1.3.0
h1:FVIKGSqpxdkO4+t1N8a8xu/xxc+13vHy2QaTAWICuQo=
-github.com/apricote/hcloud-upload-image/hcloudimages v1.3.0/go.mod
h1:NiCZ7xGoYNbWeK9L083leB7/g5oa7SAOZq405XkUSeQ=
+github.com/apricote/hcloud-upload-image/hcloudimages v1.4.0
h1:h9cxSQo8uYn7y5zLEOQF/GjLuXAqU9eVHt6vY/XIM1Y=
+github.com/apricote/hcloud-upload-image/hcloudimages v1.4.0/go.mod
h1:9452aAvFQ28wGKZOMWS6djWvoQwqhbfUg6I2zEQIUXI=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod
h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/cespare/xxhash/v2 v2.3.0
h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod
h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cpuguy83/go-md2man/v2 v2.0.6
h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod
h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/cpuguy83/go-md2man/v2 v2.0.7
h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
+github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod
h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/davecgh/go-spew v1.1.1
h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod
h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
-github.com/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/hetznercloud/hcloud-go/v2 v2.40.0
h1:fuP7khfiDQAIXdKyQq7f3LnnOjyZg0PXTafXjUKkqIA=
+github.com/hetznercloud/hcloud-go/v2 v2.40.0/go.mod
h1:ANz38eerXjPv00dm9dckKhttOGtYeeGmjjvwL5e6c5E=
github.com/inconshreveable/mousetrap v1.1.0
h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod
h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/klauspost/compress v1.18.0
h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
@@ -50,16 +51,16 @@
go.yaml.in/yaml/v2 v2.4.2/go.mod
h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
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/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
-golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
-golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
-golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
-golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q=
-golang.org/x/term v0.38.0/go.mod
h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg=
-golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
-golang.org/x/text v0.32.0/go.mod
h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
+golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=
+golang.org/x/crypto v0.51.0/go.mod
h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8=
+golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
+golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
+golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
+golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4=
+golang.org/x/term v0.43.0/go.mod
h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk=
+golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
+golang.org/x/text v0.37.0/go.mod
h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
google.golang.org/protobuf v1.36.8
h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
google.golang.org/protobuf v1.36.8/go.mod
h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/hcloudimages/CHANGELOG.md
new/hcloud-upload-image-1.4.0/hcloudimages/CHANGELOG.md
--- old/hcloud-upload-image-1.3.0/hcloudimages/CHANGELOG.md 2025-12-22
15:20:32.000000000 +0100
+++ new/hcloud-upload-image-1.4.0/hcloudimages/CHANGELOG.md 2026-05-14
20:52:38.000000000 +0200
@@ -1,5 +1,13 @@
# Changelog
+##
[1.4.0](https://github.com/apricote/hcloud-upload-image/compare/hcloudimages/v1.3.0...hcloudimages/v1.4.0)
(2026-05-14)
+
+
+### Features
+
+* faster writing to disk by skipping zero blocks
([#165](https://github.com/apricote/hcloud-upload-image/issues/165))
([fc871af](https://github.com/apricote/hcloud-upload-image/commit/fc871afa8d9a5f468572cda0911537ecbf79fd58))
+* require Go 1.25
([#172](https://github.com/apricote/hcloud-upload-image/issues/172))
([6a457b1](https://github.com/apricote/hcloud-upload-image/commit/6a457b11d3ea400e9ac8b6e25bbbb46168fe0ab5))
+
##
[1.3.0](https://github.com/apricote/hcloud-upload-image/compare/hcloudimages/v1.2.0...hcloudimages/v1.3.0)
(2025-12-22)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/hcloudimages/client.go
new/hcloud-upload-image-1.4.0/hcloudimages/client.go
--- old/hcloud-upload-image-1.3.0/hcloudimages/client.go 2025-12-22
15:20:32.000000000 +0100
+++ new/hcloud-upload-image-1.4.0/hcloudimages/client.go 2026-05-14
20:52:38.000000000 +0200
@@ -91,7 +91,7 @@
// Labels will be added to the resulting image (snapshot). Use these to
filter the image list if you
// need to identify the image later on.
//
- // We also always add a label
`apricote.de/created-by=hcloud-image-upload` ([CreatedByLabel],
[CreatedByValue]).
+ // We also always add a label
`apricote.de/created-by=hcloud-upload-image` ([CreatedByLabel],
[CreatedByValue]).
Labels map[string]string
// Location is the datacenter location for the temporary server.
@@ -543,7 +543,10 @@
switch options.ImageFormat {
case FormatRaw:
- cmd += "dd of=/dev/sda bs=4M"
+ // With conv=sparse dd will skip any zero blocks and not write
them to the disk, this makes it faster if you
+ // have a large raw image with multiple (nearly) empty but
large partitions.
+ // For example Flatcar has ~12 GB, with ~90% being zero blocks.
+ cmd += "dd of=/dev/sda bs=4M conv=sparse"
case FormatQCOW2:
cmd += "tee image.qcow2 > /dev/null && qemu-img dd -f qcow2 -O
raw if=image.qcow2 of=/dev/sda bs=4M"
default:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/hcloud-upload-image-1.3.0/hcloudimages/client_test.go
new/hcloud-upload-image-1.4.0/hcloudimages/client_test.go
--- old/hcloud-upload-image-1.3.0/hcloudimages/client_test.go 2025-12-22
15:20:32.000000000 +0100
+++ new/hcloud-upload-image-1.4.0/hcloudimages/client_test.go 2026-05-14
20:52:38.000000000 +0200
@@ -24,21 +24,21 @@
{
name: "local raw",
options: UploadOptions{},
- want: "bash -c 'set -euo pipefail && dd of=/dev/sda
bs=4M && sync'",
+ want: "bash -c 'set -euo pipefail && dd of=/dev/sda
bs=4M conv=sparse && sync'",
},
{
name: "remote raw",
options: UploadOptions{
ImageURL:
mustParseURL("https://example.com/image.xz"),
},
- want: "bash -c 'set -euo pipefail && wget --no-verbose
-O - \"https://example.com/image.xz\" | dd of=/dev/sda bs=4M && sync'",
+ want: "bash -c 'set -euo pipefail && wget --no-verbose
-O - \"https://example.com/image.xz\" | dd of=/dev/sda bs=4M conv=sparse &&
sync'",
},
{
name: "local xz",
options: UploadOptions{
ImageCompression: CompressionXZ,
},
- want: "bash -c 'set -euo pipefail && xz -cd | dd
of=/dev/sda bs=4M && sync'",
+ want: "bash -c 'set -euo pipefail && xz -cd | dd
of=/dev/sda bs=4M conv=sparse && sync'",
},
{
name: "remote xz",
@@ -46,14 +46,14 @@
ImageURL:
mustParseURL("https://example.com/image.xz"),
ImageCompression: CompressionXZ,
},
- want: "bash -c 'set -euo pipefail && wget --no-verbose
-O - \"https://example.com/image.xz\" | xz -cd | dd of=/dev/sda bs=4M && sync'",
+ want: "bash -c 'set -euo pipefail && wget --no-verbose
-O - \"https://example.com/image.xz\" | xz -cd | dd of=/dev/sda bs=4M
conv=sparse && sync'",
},
{
name: "local zstd",
options: UploadOptions{
ImageCompression: CompressionZSTD,
},
- want: "bash -c 'set -euo pipefail && zstd -cd | dd
of=/dev/sda bs=4M && sync'",
+ want: "bash -c 'set -euo pipefail && zstd -cd | dd
of=/dev/sda bs=4M conv=sparse && sync'",
},
{
name: "remote zstd",
@@ -61,14 +61,14 @@
ImageURL:
mustParseURL("https://example.com/image.zst"),
ImageCompression: CompressionZSTD,
},
- want: "bash -c 'set -euo pipefail && wget --no-verbose
-O - \"https://example.com/image.zst\" | zstd -cd | dd of=/dev/sda bs=4M &&
sync'",
+ want: "bash -c 'set -euo pipefail && wget --no-verbose
-O - \"https://example.com/image.zst\" | zstd -cd | dd of=/dev/sda bs=4M
conv=sparse && sync'",
},
{
name: "local bz2",
options: UploadOptions{
ImageCompression: CompressionBZ2,
},
- want: "bash -c 'set -euo pipefail && bzip2 -cd | dd
of=/dev/sda bs=4M && sync'",
+ want: "bash -c 'set -euo pipefail && bzip2 -cd | dd
of=/dev/sda bs=4M conv=sparse && sync'",
},
{
name: "remote bz2",
@@ -76,7 +76,7 @@
ImageURL:
mustParseURL("https://example.com/image.bz2"),
ImageCompression: CompressionBZ2,
},
- want: "bash -c 'set -euo pipefail && wget --no-verbose
-O - \"https://example.com/image.bz2\" | bzip2 -cd | dd of=/dev/sda bs=4M &&
sync'",
+ want: "bash -c 'set -euo pipefail && wget --no-verbose
-O - \"https://example.com/image.bz2\" | bzip2 -cd | dd of=/dev/sda bs=4M
conv=sparse && sync'",
},
{
name: "local qcow2",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/hcloudimages/go.mod
new/hcloud-upload-image-1.4.0/hcloudimages/go.mod
--- old/hcloud-upload-image-1.3.0/hcloudimages/go.mod 2025-12-22
15:20:32.000000000 +0100
+++ new/hcloud-upload-image-1.4.0/hcloudimages/go.mod 2026-05-14
20:52:38.000000000 +0200
@@ -1,13 +1,13 @@
module github.com/apricote/hcloud-upload-image/hcloudimages
-go 1.24.0
+go 1.25.0
-toolchain go1.25.5
+toolchain go1.26.3
require (
- github.com/hetznercloud/hcloud-go/v2 v2.33.0
+ github.com/hetznercloud/hcloud-go/v2 v2.40.0
github.com/stretchr/testify v1.11.1
- golang.org/x/crypto v0.46.0
+ golang.org/x/crypto v0.51.0
)
require (
@@ -21,9 +21,9 @@
github.com/prometheus/common v0.66.1 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
- golang.org/x/net v0.48.0 // indirect
- golang.org/x/sys v0.39.0 // indirect
- golang.org/x/text v0.32.0 // indirect
+ golang.org/x/net v0.53.0 // indirect
+ golang.org/x/sys v0.44.0 // indirect
+ golang.org/x/text v0.37.0 // indirect
google.golang.org/protobuf v1.36.8 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/hcloudimages/go.sum
new/hcloud-upload-image-1.4.0/hcloudimages/go.sum
--- old/hcloud-upload-image-1.3.0/hcloudimages/go.sum 2025-12-22
15:20:32.000000000 +0100
+++ new/hcloud-upload-image-1.4.0/hcloudimages/go.sum 2026-05-14
20:52:38.000000000 +0200
@@ -6,8 +6,8 @@
github.com/davecgh/go-spew v1.1.1/go.mod
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod
h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
-github.com/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/hetznercloud/hcloud-go/v2 v2.40.0
h1:fuP7khfiDQAIXdKyQq7f3LnnOjyZg0PXTafXjUKkqIA=
+github.com/hetznercloud/hcloud-go/v2 v2.40.0/go.mod
h1:ANz38eerXjPv00dm9dckKhttOGtYeeGmjjvwL5e6c5E=
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.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -36,16 +36,16 @@
go.uber.org/goleak v1.3.0/go.mod
h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod
h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
-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/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
-golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
-golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
-golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
-golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q=
-golang.org/x/term v0.38.0/go.mod
h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg=
-golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
-golang.org/x/text v0.32.0/go.mod
h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
+golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=
+golang.org/x/crypto v0.51.0/go.mod
h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8=
+golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
+golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
+golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
+golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4=
+golang.org/x/term v0.43.0/go.mod
h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk=
+golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
+golang.org/x/text v0.37.0/go.mod
h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
google.golang.org/protobuf v1.36.8
h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
google.golang.org/protobuf v1.36.8/go.mod
h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/hcloud-upload-image-1.3.0/hcloudimages/internal/control/retry.go
new/hcloud-upload-image-1.4.0/hcloudimages/internal/control/retry.go
--- old/hcloud-upload-image-1.3.0/hcloudimages/internal/control/retry.go
2025-12-22 15:20:32.000000000 +0100
+++ new/hcloud-upload-image-1.4.0/hcloudimages/internal/control/retry.go
2026-05-14 20:52:38.000000000 +0200
@@ -9,7 +9,7 @@
"time"
"github.com/hetznercloud/hcloud-go/v2/hcloud"
-
+
"github.com/apricote/hcloud-upload-image/hcloudimages/contextlogger"
)
@@ -21,7 +21,7 @@
backoffFunc :=
hcloud.ExponentialBackoffWithOpts(hcloud.ExponentialBackoffOpts{Multiplier: 2,
Base: 200 * time.Millisecond, Cap: 2 * time.Second})
- for try := 0; try < maxTries; try++ {
+ for try := range maxTries {
if ctx.Err() != nil {
return ctx.Err()
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/hcloud-upload-image-1.3.0/hcloudimages/internal/labelutil/labels.go
new/hcloud-upload-image-1.4.0/hcloudimages/internal/labelutil/labels.go
--- old/hcloud-upload-image-1.3.0/hcloudimages/internal/labelutil/labels.go
2025-12-22 15:20:32.000000000 +0100
+++ new/hcloud-upload-image-1.4.0/hcloudimages/internal/labelutil/labels.go
2026-05-14 20:52:38.000000000 +0200
@@ -1,16 +1,14 @@
package labelutil
+import "maps"
+
import "fmt"
func Merge(a, b map[string]string) map[string]string {
result := make(map[string]string, len(a)+len(b))
- for k, v := range a {
- result[k] = v
- }
- for k, v := range b {
- result[k] = v
- }
+ maps.Copy(result, a)
+ maps.Copy(result, b)
return result
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/hcloud-upload-image-1.3.0/internal/version/version.go
new/hcloud-upload-image-1.4.0/internal/version/version.go
--- old/hcloud-upload-image-1.3.0/internal/version/version.go 2025-12-22
15:20:32.000000000 +0100
+++ new/hcloud-upload-image-1.4.0/internal/version/version.go 2026-05-14
20:52:38.000000000 +0200
@@ -2,7 +2,7 @@
var (
// version is a semver version (https://semver.org).
- version = "1.3.0" // x-release-please-version
+ version = "1.4.0" // x-release-please-version
// versionPrerelease is a semver version pre-release identifier
(https://semver.org).
//
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/hcloud-upload-image-1.3.0/shell.nix
new/hcloud-upload-image-1.4.0/shell.nix
--- old/hcloud-upload-image-1.3.0/shell.nix 1970-01-01 01:00:00.000000000
+0100
+++ new/hcloud-upload-image-1.4.0/shell.nix 2026-05-14 20:52:38.000000000
+0200
@@ -0,0 +1,9 @@
+{pkgs ? import <nixpkgs> {}}:
+pkgs.mkShell {
+ buildInputs = with pkgs; [
+ go
+ gopls
+ gotools
+ go-tools
+ ];
+}
++++++ hcloud-upload-image.obsinfo ++++++
--- /var/tmp/diff_new_pack.Snjcrc/_old 2026-05-15 23:54:48.680322655 +0200
+++ /var/tmp/diff_new_pack.Snjcrc/_new 2026-05-15 23:54:48.688322984 +0200
@@ -1,5 +1,5 @@
name: hcloud-upload-image
-version: 1.3.0
-mtime: 1766413232
-commit: b440f8d7f6d465e706a86fd2edfe20ad3e1982bc
+version: 1.4.0
+mtime: 1778784758
+commit: 73af6a8a750a37d062bbb8e8dd4d09f17274f5a3
++++++ vendor.tar.gz ++++++
++++ 73645 lines of diff (skipped)