From 686b0b2a3e095c6bebcfa7edbc06e35864cf1117 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 26 Nov 2022 11:51:56 +0100 Subject: [PATCH 1/5] update the minimum required go version to 1.18 --- .github/workflows/tests.yml | 18 ----------- CONTRIBUTING.md | 2 +- build.go | 2 +- changelog/unreleased/pull-4041 | 7 +++++ doc/020_installation.rst | 2 +- go.mod | 56 +++++++++++++++++++++++++--------- go.sum | 12 -------- 7 files changed, 52 insertions(+), 47 deletions(-) create mode 100644 changelog/unreleased/pull-4041 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index eb16c00b5..ffa970f9b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -50,24 +50,6 @@ jobs: test_fuse: true install_verb: install - - job_name: Linux - go: 1.17.x - os: ubuntu-latest - test_fuse: true - install_verb: install - - - job_name: Linux - go: 1.16.x - os: ubuntu-latest - test_fuse: true - install_verb: get - - - job_name: Linux - go: 1.15.x - os: ubuntu-latest - test_fuse: true - install_verb: get - name: ${{ matrix.job_name }} Go ${{ matrix.go }} runs-on: ${{ matrix.os }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cf1f1e739..4b4be0757 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -76,7 +76,7 @@ Then use the `go` tool to build restic: $ go build ./cmd/restic $ ./restic version - restic 0.10.0-dev (compiled manually) compiled with go1.15.2 on linux/amd64 + restic 0.14.0-dev (compiled manually) compiled with go1.19 on linux/amd64 You can run all tests with the following command: diff --git a/build.go b/build.go index 0f02f6500..29e6c0cbf 100644 --- a/build.go +++ b/build.go @@ -59,7 +59,7 @@ var config = Config{ Main: "./cmd/restic", // package name for the main package DefaultBuildTags: []string{"selfupdate"}, // specify build tags which are always used Tests: []string{"./..."}, // tests to run - MinVersion: GoVersion{Major: 1, Minor: 15, Patch: 0}, // minimum Go version supported + MinVersion: GoVersion{Major: 1, Minor: 18, Patch: 0}, // minimum Go version supported } // Config configures the build. diff --git a/changelog/unreleased/pull-4041 b/changelog/unreleased/pull-4041 new file mode 100644 index 000000000..35c7086ae --- /dev/null +++ b/changelog/unreleased/pull-4041 @@ -0,0 +1,7 @@ +Change: Update dependencies and require Go 1.18 or newer + +We've updated most dependencies. Since some libraries require newer language +features we're dropping support for Go 1.15 - 1.17, which means that restic now +requires at least Go 1.18 to build. + +https://github.com/restic/restic/pull/4041 diff --git a/doc/020_installation.rst b/doc/020_installation.rst index 3e98625f9..b27c5f900 100644 --- a/doc/020_installation.rst +++ b/doc/020_installation.rst @@ -274,7 +274,7 @@ From Source *********** restic is written in the Go programming language and you need at least -Go version 1.15. Building restic may also work with older versions of Go, +Go version 1.18. Building restic may also work with older versions of Go, but that's not supported. See the `Getting started `__ guide of the Go project for instructions how to install Go. diff --git a/go.mod b/go.mod index 388937b37..02a422653 100644 --- a/go.mod +++ b/go.mod @@ -1,26 +1,15 @@ module github.com/restic/restic require ( - cloud.google.com/go v0.103.0 // indirect - cloud.google.com/go/compute v1.9.0 // indirect cloud.google.com/go/storage v1.25.0 github.com/Azure/azure-sdk-for-go v66.0.0+incompatible - github.com/Azure/go-autorest/autorest v0.11.28 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.21 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect github.com/anacrolix/fuse v0.2.0 github.com/cenkalti/backoff/v4 v4.1.3 github.com/cespare/xxhash/v2 v2.1.2 - github.com/dnaeon/go-vcr v1.2.0 // indirect github.com/elithrar/simple-scrypt v1.3.0 github.com/go-ole/go-ole v1.2.6 - github.com/gofrs/uuid v4.2.0+incompatible // indirect - github.com/golang-jwt/jwt/v4 v4.4.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.5.9 - github.com/googleapis/gax-go/v2 v2.5.1 // indirect github.com/hashicorp/golang-lru v0.5.4 - github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/juju/ratelimit v1.0.2 github.com/klauspost/compress v1.15.9 github.com/kurin/blazer v0.5.4-0.20211030221322-ba894c124ac6 @@ -42,8 +31,47 @@ require ( golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 golang.org/x/text v0.3.7 google.golang.org/api v0.93.0 - google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc // indirect - gopkg.in/ini.v1 v1.67.0 // indirect ) -go 1.15 +require ( + cloud.google.com/go v0.103.0 // indirect + cloud.google.com/go/compute v1.9.0 // indirect + cloud.google.com/go/iam v0.3.0 // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest v0.11.28 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.21 // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/dnaeon/go-vcr v1.2.0 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/gofrs/uuid v4.2.0+incompatible // indirect + github.com/golang-jwt/jwt/v4 v4.4.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.1.0 // indirect + github.com/googleapis/gax-go/v2 v2.5.1 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.1.0 // indirect + github.com/kr/fs v0.1.0 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/rs/xid v1.4.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + go.opencensus.io v0.23.0 // indirect + golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc // indirect + google.golang.org/grpc v1.48.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) + +go 1.18 diff --git a/go.sum b/go.sum index af9eec855..d1d33fd36 100644 --- a/go.sum +++ b/go.sum @@ -93,7 +93,6 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= @@ -179,7 +178,6 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -423,7 +421,6 @@ golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c h1:JVAXQ10yGGVbSyoer5VILysz6YKjdNT2bsvlayjqhes= golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -527,8 +524,6 @@ golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 h1:Sx/u41w+OwrInGdEckYmEuU5gHoGSL4QbDz3S9s6j4U= golang.org/x/sys v0.0.0-20220818161305-2296e01440c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -649,9 +644,6 @@ google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3 google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= google.golang.org/api v0.86.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.88.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.91.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= google.golang.org/api v0.93.0 h1:T2xt9gi0gHdxdnRkVQhT8mIvPaXKNsDNWz+L696M66M= google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -743,9 +735,6 @@ google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljW google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220720214146-176da50484ac/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220804142021-4e6b2dfa6612/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc h1:Nf+EdcTLHR8qDNN/KfkQL0u0ssxt9OhbaWCl5C0ucEI= google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -802,7 +791,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From bcdfc2a8ea4dddc96043781dc035a12e466e2e36 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 26 Nov 2022 12:06:09 +0100 Subject: [PATCH 2/5] CI: allow dependabot update of oauth2 Our minimum go version is new enough to allow updating the library. --- .github/dependabot.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 2118a67c3..c311a3cb0 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,7 +7,6 @@ updates: interval: "monthly" ignore: - dependency-name: "bazil.org/fuse" - - dependency-name: "golang.org/x/oauth2" # Dependencies listed in .github/workflows/*.yml - package-ecosystem: "github-actions" From a1eb923876b34eba70db319c16928bf6a3d392a5 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 26 Nov 2022 12:07:57 +0100 Subject: [PATCH 3/5] remove no longer necessary conditional compiles --- cmd/restic/integration_filter_pattern_test.go | 7 ------- internal/filter/filter_patterns_test.go | 7 ------- internal/repository/fuzz_test.go | 3 --- 3 files changed, 17 deletions(-) diff --git a/cmd/restic/integration_filter_pattern_test.go b/cmd/restic/integration_filter_pattern_test.go index 962158d94..c8225284d 100644 --- a/cmd/restic/integration_filter_pattern_test.go +++ b/cmd/restic/integration_filter_pattern_test.go @@ -1,10 +1,3 @@ -//go:build go1.16 -// +build go1.16 - -// Before Go 1.16 filepath.Match returned early on a failed match, -// and thus did not report any later syntax error in the pattern. -// https://go.dev/doc/go1.16#path/filepath - package main import ( diff --git a/internal/filter/filter_patterns_test.go b/internal/filter/filter_patterns_test.go index 64599d698..5971a4e1e 100644 --- a/internal/filter/filter_patterns_test.go +++ b/internal/filter/filter_patterns_test.go @@ -1,10 +1,3 @@ -//go:build go1.16 -// +build go1.16 - -// Before Go 1.16 filepath.Match returned early on a failed match, -// and thus did not report any later syntax error in the pattern. -// https://go.dev/doc/go1.16#path/filepath - package filter_test import ( diff --git a/internal/repository/fuzz_test.go b/internal/repository/fuzz_test.go index 7a98477b6..e316c3443 100644 --- a/internal/repository/fuzz_test.go +++ b/internal/repository/fuzz_test.go @@ -1,6 +1,3 @@ -//go:build go1.18 -// +build go1.18 - package repository import ( From 8ad231bcad06512339c6ccfccedacb10b3c3a929 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 26 Nov 2022 12:08:31 +0100 Subject: [PATCH 4/5] bump version numbers in instructions to reproduce binaries --- doc/developer_information.rst | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/developer_information.rst b/doc/developer_information.rst index f2d410577..c05edc9d2 100644 --- a/doc/developer_information.rst +++ b/doc/developer_information.rst @@ -23,17 +23,17 @@ timestamp and filename of the binary contained in it. In order to reproduce the exact same ZIP file every time, we update the timestamp of the file ``VERSION`` in the source code archive and set the timezone to Europe/Berlin. -In the following example, we'll use the file ``restic-0.12.1.tar.gz`` and Go -1.16.6 to reproduce the released binaries. +In the following example, we'll use the file ``restic-0.14.0.tar.gz`` and Go +1.19 to reproduce the released binaries. 1. Determine the Go compiler version used to build the released binaries, then download and extract the Go compiler into ``/usr/local/go``: .. code:: $ restic version - restic 0.12.1 compiled with go1.16.6 on linux/amd64 + restic 0.14.0 compiled with go1.19 on linux/amd64 $ cd /usr/local - $ curl -L https://dl.google.com/go/go1.16.6.linux-amd64.tar.gz | tar xz + $ curl -L https://dl.google.com/go/go1.19.linux-amd64.tar.gz | tar xz 2. Extract the restic source code into ``/restic`` @@ -41,7 +41,7 @@ In the following example, we'll use the file ``restic-0.12.1.tar.gz`` and Go $ mkdir /restic $ cd /restic - $ TZ=Europe/Berlin curl -L https://github.com/restic/restic/releases/download/v0.12.1/restic-0.12.1.tar.gz | tar xz --strip-components=1 + $ TZ=Europe/Berlin curl -L https://github.com/restic/restic/releases/download/v0.14.0/restic-0.14.0.tar.gz | tar xz --strip-components=1 3. Build the binaries for Windows and Linux: @@ -50,14 +50,14 @@ In the following example, we'll use the file ``restic-0.12.1.tar.gz`` and Go $ export PATH=/usr/local/go/bin:$PATH $ export GOPATH=/home/build/go $ go version - go version go1.16.6 linux/amd64 + go version go1.19 linux/amd64 $ GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-s -w" -tags selfupdate -o restic_linux_amd64 ./cmd/restic $ bzip2 restic_linux_amd64 - $ GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-s -w" -tags selfupdate -o restic_0.12.1_windows_amd64.exe ./cmd/restic - $ touch --reference VERSION restic_0.12.1_windows_amd64.exe - $ TZ=Europe/Berlin zip -q -X restic_0.12.1_windows_amd64.zip restic_0.12.1_windows_amd64.exe + $ GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-s -w" -tags selfupdate -o restic_0.14.0_windows_amd64.exe ./cmd/restic + $ touch --reference VERSION restic_0.14.0_windows_amd64.exe + $ TZ=Europe/Berlin zip -q -X restic_0.14.0_windows_amd64.zip restic_0.14.0_windows_amd64.exe Building the Official Binaries ****************************** @@ -85,7 +85,7 @@ The following steps are necessary to build the binaries: .. code:: - tar xvzf restic-0.12.1.tar.gz + tar xvzf restic-0.14.0.tar.gz 3. Create a directory to place the resulting binaries in: @@ -98,20 +98,20 @@ The following steps are necessary to build the binaries: .. code:: docker run --rm \ - --volume "$PWD/restic-0.12.1:/restic" \ + --volume "$PWD/restic-0.14.0:/restic" \ --volume "$PWD/output:/output" \ restic/builder \ - go run helpers/build-release-binaries/main.go --version 0.12.1 + go run helpers/build-release-binaries/main.go --version 0.14.0 4. If anything goes wrong, you can enable debug output like this: .. code:: docker run --rm \ - --volume "$PWD/restic-0.12.1:/restic" \ + --volume "$PWD/restic-0.14.0:/restic" \ --volume "$PWD/output:/output" \ restic/builder \ - go run helpers/build-release-binaries/main.go --version 0.12.1 --verbose + go run helpers/build-release-binaries/main.go --version 0.14.0 --verbose Prepare a New Release ********************* @@ -124,6 +124,6 @@ required argument is the new version number (in `Semantic Versioning .. code:: - go run helpers/prepare-release/main.go 0.12.1 + go run helpers/prepare-release/main.go 0.14.0 Checks can be skipped on demand via flags, please see ``--help`` for details. From 530f129a39ba432541e0b47c05057d65b21df8d1 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sat, 26 Nov 2022 12:09:01 +0100 Subject: [PATCH 5/5] rest: remove workaround for content-length handling bug --- changelog/unreleased/pull-4041 | 2 +- internal/backend/rest/rest.go | 48 ------------- internal/backend/rest/rest_int_go114_test.go | 72 -------------------- 3 files changed, 1 insertion(+), 121 deletions(-) delete mode 100644 internal/backend/rest/rest_int_go114_test.go diff --git a/changelog/unreleased/pull-4041 b/changelog/unreleased/pull-4041 index 35c7086ae..2e4a8de9d 100644 --- a/changelog/unreleased/pull-4041 +++ b/changelog/unreleased/pull-4041 @@ -1,7 +1,7 @@ Change: Update dependencies and require Go 1.18 or newer We've updated most dependencies. Since some libraries require newer language -features we're dropping support for Go 1.15 - 1.17, which means that restic now +features, we're dropping support for Go 1.15 - 1.17, which means that restic now requires at least Go 1.18 to build. https://github.com/restic/restic/pull/4041 diff --git a/internal/backend/rest/rest.go b/internal/backend/rest/rest.go index 3431fd681..be8b33363 100644 --- a/internal/backend/rest/rest.go +++ b/internal/backend/rest/rest.go @@ -8,10 +8,8 @@ import ( "io" "io/ioutil" "net/http" - "net/textproto" "net/url" "path" - "strconv" "strings" "github.com/restic/restic/internal/backend/layout" @@ -214,44 +212,6 @@ func (b *Backend) Load(ctx context.Context, h restic.Handle, length int, offset return err } -// checkContentLength returns an error if the server returned a value in the -// Content-Length header in an HTTP2 connection, but closed the connection -// before any data was sent. -// -// This is a workaround for https://github.com/golang/go/issues/46071 -// -// See also https://forum.restic.net/t/http2-stream-closed-connection-reset-context-canceled/3743/10 -func checkContentLength(resp *http.Response) error { - // the following code is based on - // https://github.com/golang/go/blob/b7a85e0003cedb1b48a1fd3ae5b746ec6330102e/src/net/http/h2_bundle.go#L8646 - - if resp.ContentLength != 0 { - return nil - } - - if resp.ProtoMajor != 2 && resp.ProtoMinor != 0 { - return nil - } - - if len(resp.Header[textproto.CanonicalMIMEHeaderKey("Content-Length")]) != 1 { - return nil - } - - // make sure that if the server returned a content length and we can - // parse it, it is really zero, otherwise return an error - contentLength := resp.Header.Get("Content-Length") - cl, err := strconv.ParseUint(contentLength, 10, 63) - if err != nil { - return fmt.Errorf("unable to parse Content-Length %q: %w", contentLength, err) - } - - if cl != 0 { - return errors.Errorf("unexpected EOF: got 0 instead of %v bytes", cl) - } - - return nil -} - func (b *Backend) openReader(ctx context.Context, h restic.Handle, length int, offset int64) (io.ReadCloser, error) { debug.Log("Load %v, length %v, offset %v", h, length, offset) if err := h.Valid(); err != nil { @@ -301,14 +261,6 @@ func (b *Backend) openReader(ctx context.Context, h restic.Handle, length int, o return nil, errors.Errorf("unexpected HTTP response (%v): %v", resp.StatusCode, resp.Status) } - // workaround https://github.com/golang/go/issues/46071 - // see also https://forum.restic.net/t/http2-stream-closed-connection-reset-context-canceled/3743/10 - err = checkContentLength(resp) - if err != nil { - _ = resp.Body.Close() - return nil, err - } - return resp.Body, nil } diff --git a/internal/backend/rest/rest_int_go114_test.go b/internal/backend/rest/rest_int_go114_test.go deleted file mode 100644 index 7c040bf51..000000000 --- a/internal/backend/rest/rest_int_go114_test.go +++ /dev/null @@ -1,72 +0,0 @@ -//go:build go1.14 && !go1.18 -// +build go1.14,!go1.18 - -// missing eof error is fixed in golang >= 1.17.3 or >= 1.16.10 -// remove the workaround from rest.go when the minimum golang version -// supported by restic reaches 1.18. - -package rest_test - -import ( - "context" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "testing" - - "github.com/restic/restic/internal/backend/rest" - "github.com/restic/restic/internal/restic" -) - -func TestZeroLengthRead(t *testing.T) { - // Test workaround for https://github.com/golang/go/issues/46071. Can be removed once this is fixed in Go - // and the minimum golang version supported by restic includes the fix. - numRequests := 0 - srv := httptest.NewUnstartedServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { - numRequests++ - t.Logf("req %v %v", req.Method, req.URL.Path) - if req.Method == "GET" { - res.Header().Set("Content-Length", "42") - // Now the handler fails for some reason and is unable to send data - return - } - - t.Errorf("unhandled request %v %v", req.Method, req.URL.Path) - })) - srv.EnableHTTP2 = true - srv.StartTLS() - defer srv.Close() - - srvURL, err := url.Parse(srv.URL) - if err != nil { - t.Fatal(err) - } - - cfg := rest.Config{ - Connections: 5, - URL: srvURL, - } - be, err := rest.Open(cfg, srv.Client().Transport) - if err != nil { - t.Fatal(err) - } - defer func() { - err = be.Close() - if err != nil { - t.Fatal(err) - } - }() - - err = be.Load(context.TODO(), restic.Handle{Type: restic.ConfigFile}, 0, 0, func(rd io.Reader) error { - _, err := ioutil.ReadAll(rd) - if err == nil { - t.Fatal("ReadAll should have returned an 'Unexpected EOF' error") - } - return nil - }) - if err == nil { - t.Fatal("Got no unexpected EOF error") - } -}