From b8fec3852d0823c88d6322affa512b8c8d85ced4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Thu, 23 Jan 2025 19:41:53 -0800 Subject: [PATCH 001/206] build(deps): bump the github-actions group across 1 directory with 4 updates (#4364) Bumps the github-actions group with 4 updates in the / directory: [actions/setup-go](https://github.com/actions/setup-go), [actions/upload-artifact](https://github.com/actions/upload-artifact), [github/codeql-action](https://github.com/github/codeql-action) and [actions/stale](https://github.com/actions/stale). Updates `actions/setup-go` from 5.2.0 to 5.3.0 - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v5.2.0...f111f3307d8850f501ac008e886eec1fd1932a34) Updates `actions/upload-artifact` from 4.5.0 to 4.6.0 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4.5.0...65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08) Updates `actions/stale` from 9.0.0 to 9.1.0 - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/28ca1036281a5e5922ead5184a1bbf96e5fc984e...5bef64f19d7facfb25b37b414482c7164d639639) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/code-coverage.yml | 4 ++-- .github/workflows/compat-test.yml | 4 ++-- .github/workflows/endurance-test.yml | 4 ++-- .github/workflows/htmlui-tests.yml | 4 ++-- .github/workflows/license-check.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/make.yml | 6 +++--- .github/workflows/ossf-scorecard.yml | 4 ++-- .github/workflows/providers-core.yml | 2 +- .github/workflows/providers-extra.yml | 2 +- .github/workflows/race-detector.yml | 2 +- .github/workflows/stale.yml | 2 +- .github/workflows/stress-test.yml | 4 ++-- .github/workflows/tests.yml | 4 ++-- .github/workflows/volume-shadow-copy-test.yml | 4 ++-- 15 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index fff04b0e2ae..450b95a67d4 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -16,7 +16,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true @@ -28,7 +28,7 @@ jobs: with: files: coverage.txt - name: Upload Logs - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/compat-test.yml b/.github/workflows/compat-test.yml index ae7f13a5eae..4318c9943d6 100644 --- a/.github/workflows/compat-test.yml +++ b/.github/workflows/compat-test.yml @@ -18,7 +18,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true @@ -26,7 +26,7 @@ jobs: - name: Compat Test run: make compat-tests - name: Upload Logs - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/endurance-test.yml b/.github/workflows/endurance-test.yml index 6280079fb31..7445aa16978 100644 --- a/.github/workflows/endurance-test.yml +++ b/.github/workflows/endurance-test.yml @@ -23,7 +23,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true @@ -31,7 +31,7 @@ jobs: - name: Endurance Tests run: make endurance-tests - name: Upload Logs - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/htmlui-tests.yml b/.github/workflows/htmlui-tests.yml index 8e46bc9154a..c97540233e4 100644 --- a/.github/workflows/htmlui-tests.yml +++ b/.github/workflows/htmlui-tests.yml @@ -31,7 +31,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true @@ -39,7 +39,7 @@ jobs: - name: Run Tests run: make htmlui-e2e-test - name: Upload Screenshots - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: path: .screenshots/**/*.png if-no-files-found: ignore diff --git a/.github/workflows/license-check.yml b/.github/workflows/license-check.yml index bef3cafda09..978ebafb82f 100644 --- a/.github/workflows/license-check.yml +++ b/.github/workflows/license-check.yml @@ -16,7 +16,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d13b6a1e2f7..49fe6117370 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -30,7 +30,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true diff --git a/.github/workflows/make.yml b/.github/workflows/make.yml index dc40f185a57..992ca501a8d 100644 --- a/.github/workflows/make.yml +++ b/.github/workflows/make.yml @@ -44,7 +44,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true @@ -101,7 +101,7 @@ jobs: # macOS signing certificate (base64-encoded), used by Electron Builder MACOS_SIGNING_IDENTITY: ${{ secrets.MACOS_SIGNING_IDENTITY }} - name: Upload Kopia Artifacts - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: kopia-${{ matrix.os }} path: | @@ -123,7 +123,7 @@ jobs: if-no-files-found: ignore if: ${{ !contains(matrix.os, 'self-hosted') }} - name: Upload Kopia Binary - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: kopia_binaries-${{ matrix.os }} path: | diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index dafb545b084..d6fef40735e 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -39,12 +39,12 @@ jobs: - # Upload the results to GitHub's code scanning dashboard. name: "Upload to results to dashboard" - uses: github/codeql-action/upload-sarif@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3.28.0 + uses: github/codeql-action/upload-sarif@ee117c905ab18f32fa0f66c2fe40ecc8013f3e04 # v3.28.4 with: sarif_file: results.sarif - name: "Upload analysis results as 'Job Artifact'" - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: SARIF file path: results.sarif diff --git a/.github/workflows/providers-core.yml b/.github/workflows/providers-core.yml index e81e3140c15..b2e4ffcd878 100644 --- a/.github/workflows/providers-core.yml +++ b/.github/workflows/providers-core.yml @@ -29,7 +29,7 @@ jobs: fetch-depth: 0 ref: ${{ github.event.inputs.ref_name || github.ref }} - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true diff --git a/.github/workflows/providers-extra.yml b/.github/workflows/providers-extra.yml index 5f3890d03c3..8f865ae7641 100644 --- a/.github/workflows/providers-extra.yml +++ b/.github/workflows/providers-extra.yml @@ -29,7 +29,7 @@ jobs: fetch-depth: 0 ref: ${{ github.event.inputs.ref_name || github.ref }} - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true diff --git a/.github/workflows/race-detector.yml b/.github/workflows/race-detector.yml index 15abc258e8c..75e7bd1e873 100644 --- a/.github/workflows/race-detector.yml +++ b/.github/workflows/race-detector.yml @@ -16,7 +16,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 84b20142ce4..b0a88ee4483 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -14,7 +14,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0 + - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 with: # process older PRs first ascending: true diff --git a/.github/workflows/stress-test.yml b/.github/workflows/stress-test.yml index 100d190e457..5585859290d 100644 --- a/.github/workflows/stress-test.yml +++ b/.github/workflows/stress-test.yml @@ -22,7 +22,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true @@ -30,7 +30,7 @@ jobs: - name: Stress Test run: make stress-test - name: Upload Logs - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d80b4d52a8d..bae20f9195f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -42,7 +42,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true @@ -66,7 +66,7 @@ jobs: - name: Integration Tests run: make -j2 ci-integration-tests - name: Upload Logs - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: logs-${{ matrix.os }} path: .logs/**/*.log diff --git a/.github/workflows/volume-shadow-copy-test.yml b/.github/workflows/volume-shadow-copy-test.yml index eaea4db53ee..88a1b5d672b 100644 --- a/.github/workflows/volume-shadow-copy-test.yml +++ b/.github/workflows/volume-shadow-copy-test.yml @@ -19,7 +19,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: 'go.mod' check-latest: true @@ -34,7 +34,7 @@ jobs: - name: Non-Admin Test run: gsudo -i Medium make os-snapshot-tests - name: Upload Logs - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: logs path: .logs/**/*.log From 1f3ef517de4fe2cfc5ab2f64d10fb77172839941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Thu, 23 Jan 2025 21:18:18 -0800 Subject: [PATCH 002/206] build(deps): bump codecov/codecov-action from 5.2.0 to 5.3.0 (#4366) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.2.0 to 5.3.0. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/5a605bd92782ce0810fa3b8acc235c921b497052...0da7aa657d958d32c117fc47e1f977e7524753c7) --- ``` updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-minor ``` ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/code-coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index 450b95a67d4..46aa889e5f2 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -24,7 +24,7 @@ jobs: - name: Run Tests run: make test-with-coverage - name: Upload Coverage - uses: codecov/codecov-action@5a605bd92782ce0810fa3b8acc235c921b497052 # v5.2.0 + uses: codecov/codecov-action@0da7aa657d958d32c117fc47e1f977e7524753c7 # v5.3.0 with: files: coverage.txt - name: Upload Logs From 83c8d0b99c4de3e950bb66c27eddf3a0dd3b36fd Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Thu, 23 Jan 2025 21:21:30 -0800 Subject: [PATCH 003/206] chore(ci): upgrade Go to 1.23 (#4248) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(ci): upgrade Go to 1.23.3 * also upgrade checklocks * specify Go toolchain version in go.mod --------- Co-authored-by: Julio López <1953782+julio-lopez@users.noreply.github.com> --- go.mod | 4 ++-- site/.go-version | 2 +- tools/tools.mk | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 771f4bf7669..95103f7b3d6 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/kopia/kopia -go 1.22.0 +go 1.23.0 -toolchain go1.22.11 +toolchain go1.23.5 require ( cloud.google.com/go/storage v1.50.0 diff --git a/site/.go-version b/site/.go-version index d71259759d5..4ceb49d6153 100644 --- a/site/.go-version +++ b/site/.go-version @@ -1 +1 @@ -1.22.x +1.23.x diff --git a/tools/tools.mk b/tools/tools.mk index 9685d11b4e7..e5845149f33 100644 --- a/tools/tools.mk +++ b/tools/tools.mk @@ -103,7 +103,7 @@ endif # tool versions GOLANGCI_LINT_VERSION=1.62.0 -CHECKLOCKS_VERSION=e8c1fff214d0ecf02cfe5aa9c62d11174130c339 +CHECKLOCKS_VERSION=release-20241104.0 NODE_VERSION=20.15.1 HUGO_VERSION=0.113.0 GOTESTSUM_VERSION=1.11.0 From 291525f35421312cd2a3915fd4caa721ab51aad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Thu, 23 Jan 2025 21:23:17 -0800 Subject: [PATCH 004/206] build(deps): bump google.golang.org/grpc (#4365) Bumps the common-golang-dependencies group with 1 update: [google.golang.org/grpc](https://github.com/grpc/grpc-go). Updates `google.golang.org/grpc` from 1.69.4 to 1.70.0 - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.69.4...v1.70.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 95103f7b3d6..451af053597 100644 --- a/go.mod +++ b/go.mod @@ -69,14 +69,14 @@ require ( golang.org/x/term v0.28.0 golang.org/x/text v0.21.0 google.golang.org/api v0.218.0 - google.golang.org/grpc v1.69.4 + google.golang.org/grpc v1.70.0 google.golang.org/protobuf v1.36.3 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 ) require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect - cel.dev/expr v0.16.2 // indirect + cel.dev/expr v0.19.0 // indirect cloud.google.com/go v0.116.0 // indirect cloud.google.com/go/auth v0.14.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect @@ -113,7 +113,7 @@ require ( github.com/goccy/go-json v0.10.4 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/glog v1.2.2 // indirect + github.com/golang/glog v1.2.3 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect github.com/google/readahead v0.0.0-20161222183148-eaceba169032 // indirect diff --git a/go.sum b/go.sum index c48728278db..6cfc6bd739b 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho= al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= -cel.dev/expr v0.16.2 h1:RwRhoH17VhAu9U5CMvMhH1PDVgf0tuz9FT+24AfMLfU= -cel.dev/expr v0.16.2/go.mod h1:gXngZQMkWJoSbE8mOzehJlXQyubn/Vg0vR9/F3W7iw8= +cel.dev/expr v0.19.0 h1:lXuo+nDhpyJSpWxpPVi5cPUwzKb+dsdOiw6IreM5yt0= +cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= @@ -141,8 +141,8 @@ github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= +github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -451,8 +451,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= -google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 009f83eebc109a8045ea5f3c41e42eb9052ce95e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2025 05:48:20 +0000 Subject: [PATCH 005/206] build(deps): bump github.com/chromedp/chromedp from 0.11.0 to 0.12.1 (#4363) --- go.mod | 8 ++++---- go.sum | 17 ++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 451af053597..a3974cf1a2e 100644 --- a/go.mod +++ b/go.mod @@ -12,8 +12,8 @@ require ( github.com/alecthomas/kingpin/v2 v2.4.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 github.com/chmduquesne/rollinghash v4.0.0+incompatible - github.com/chromedp/cdproto v0.0.0-20241003230502-a4a8f7c660df - github.com/chromedp/chromedp v0.11.0 + github.com/chromedp/cdproto v0.0.0-20250120090109-d38428e4d9c8 + github.com/chromedp/chromedp v0.12.1 github.com/coreos/go-systemd/v22 v22.5.0 github.com/dustinkirkland/golang-petname v0.0.0-20191129215211-8e5a1ed0cff0 github.com/edsrzf/mmap-go v1.2.0 @@ -93,7 +93,7 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/chromedp/sysutil v1.0.0 // indirect + github.com/chromedp/sysutil v1.1.0 // indirect github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect github.com/danieljoos/wincred v1.2.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -124,7 +124,7 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/kr/fs v0.1.0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect diff --git a/go.sum b/go.sum index 6cfc6bd739b..760ad427c0a 100644 --- a/go.sum +++ b/go.sum @@ -66,12 +66,12 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chmduquesne/rollinghash v4.0.0+incompatible h1:hnREQO+DXjqIw3rUTzWN7/+Dpw+N5Um8zpKV0JOEgbo= github.com/chmduquesne/rollinghash v4.0.0+incompatible/go.mod h1:Uc2I36RRfTAf7Dge82bi3RU0OQUmXT9iweIcPqvr8A0= -github.com/chromedp/cdproto v0.0.0-20241003230502-a4a8f7c660df h1:cbtSn19AtqQha1cxmP2Qvgd3fFMz51AeAEKLJMyEUhc= -github.com/chromedp/cdproto v0.0.0-20241003230502-a4a8f7c660df/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= -github.com/chromedp/chromedp v0.11.0 h1:1PT6O4g39sBAFjlljIHTpxmCSk8meeYL6+R+oXH4bWA= -github.com/chromedp/chromedp v0.11.0/go.mod h1:jsD7OHrX0Qmskqb5Y4fn4jHnqquqW22rkMFgKbECsqg= -github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= -github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= +github.com/chromedp/cdproto v0.0.0-20250120090109-d38428e4d9c8 h1:Q2byC+xLgH/Z7hExJ8G/jVqsvCfGhMmNgM1ysZARA3o= +github.com/chromedp/cdproto v0.0.0-20250120090109-d38428e4d9c8/go.mod h1:RTGuBeCeabAJGi3OZf71a6cGa7oYBfBP75VJZFLv6SU= +github.com/chromedp/chromedp v0.12.1 h1:kBMblXk7xH5/6j3K9uk8d7/c+fzXWiUsCsPte0VMwOA= +github.com/chromedp/chromedp v0.12.1/go.mod h1:F6+wdq9LKFDMoyxhq46ZLz4VLXrsrCAR3sFqJz4Nqc0= +github.com/chromedp/sysutil v1.1.0 h1:PUFNv5EcprjqXZD9nJb9b/c9ibAbxiYo4exNWZyipwM= +github.com/chromedp/sysutil v1.1.0/go.mod h1:WiThHUdltqCNKGc4gaU50XgYjwjYIhKWoHGPTUfWTJ8= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -225,8 +225,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -403,7 +403,6 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= From 3e9103417ee0e73c1816a7dd4539aa2a71ed99e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Fri, 24 Jan 2025 15:20:09 -0800 Subject: [PATCH 006/206] chore(ci): use GH Linux ARM runners (#4367) * chore(ci): use GH Linux ARM runners * cleanup: remove unnecessary condition for ARMHF * remove ARMHF support in GHA workflows * cleanup: remove unnecessary condition for self-hosted --- .github/workflows/lint.yml | 1 - .github/workflows/make.yml | 12 +----------- .github/workflows/tests.yml | 10 +--------- 3 files changed, 2 insertions(+), 21 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 49fe6117370..dfefa94d98b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -35,7 +35,6 @@ jobs: go-version-file: 'go.mod' check-latest: true id: go - if: ${{ !contains(matrix.os, 'ARMHF') }} - id: govulncheck uses: golang/govulncheck-action@b625fbe08f3bccbe446d94fbf87fcc875a4f50ee # v1.0.4 with: diff --git a/.github/workflows/make.yml b/.github/workflows/make.yml index 992ca501a8d..dc78795e436 100644 --- a/.github/workflows/make.yml +++ b/.github/workflows/make.yml @@ -31,13 +31,9 @@ jobs: strategy: fail-fast: false matrix: - os: [windows-latest, ubuntu-latest, macos-latest] - include: - - os: [self-hosted, ARM64] - # - os: [self-hosted, ARMHF] + os: [windows-latest, ubuntu-latest, macos-latest, ubuntu-24.04-arm ] name: Make runs-on: ${{ matrix.os }} - continue-on-error: ${{ contains(matrix.os, 'self-hosted') }} steps: - name: Check out repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -49,10 +45,6 @@ jobs: go-version-file: 'go.mod' check-latest: true id: go - if: ${{ !contains(matrix.os, 'ARMHF') }} - - name: Install GoLang for ARMHF - run: "echo /usr/local/go/bin >> $GITHUB_PATH; rm -rf /usr/local/go && mkdir -p /usr/local/go && curl -s -L https://go.dev/dl/go1.19.2.linux-armv6l.tar.gz | tar -C /usr/local -xz" - if: ${{ contains(matrix.os, 'ARMHF') }} - name: Install Windows-specific packages run: "choco install --no-progress -y make zip unzip curl" if: ${{ contains(matrix.os, 'windows') }} @@ -121,7 +113,6 @@ jobs: dist/kopia-ui/*.AppImage dist/kopia-ui/*.yml if-no-files-found: ignore - if: ${{ !contains(matrix.os, 'self-hosted') }} - name: Upload Kopia Binary uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: @@ -132,7 +123,6 @@ jobs: dist/*/rclone dist/*/rclone.exe if-no-files-found: ignore - if: ${{ !contains(matrix.os, 'self-hosted') }} publish: name: Stage And Publish Artifacts runs-on: ubuntu-latest diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index bae20f9195f..523f82ced9e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -29,13 +29,9 @@ jobs: strategy: fail-fast: false matrix: - os: [windows-latest, ubuntu-latest, macos-latest] - include: - - os: [self-hosted, ARM64] - #- os: [self-hosted, ARMHF] + os: [windows-latest, ubuntu-latest, macos-latest, ubuntu-24.04-arm ] name: Tests runs-on: ${{ matrix.os }} - continue-on-error: ${{ contains(matrix.os, 'self-hosted') }} steps: - name: Check out repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -47,10 +43,6 @@ jobs: go-version-file: 'go.mod' check-latest: true id: go - if: ${{ !contains(matrix.os, 'ARMHF') }} - - name: Install GoLang for ARMHF - run: "echo /usr/local/go/bin >> $GITHUB_PATH; rm -rf /usr/local/go && mkdir -p /usr/local/go && curl -s -L https://go.dev/dl/go1.19.2.linux-armv6l.tar.gz | tar -C /usr/local -xz" - if: ${{ contains(matrix.os, 'ARMHF') }} - name: Install Windows-specific packages run: "choco install --no-progress -y make zip unzip curl" if: ${{ contains(matrix.os, 'windows') }} From bed5cdff47a29297ed2de95c9d1ccef6dc9fa444 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 23:44:39 +0000 Subject: [PATCH 007/206] build(deps): bump google.golang.org/protobuf (#4379) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a3974cf1a2e..22582634e39 100644 --- a/go.mod +++ b/go.mod @@ -70,7 +70,7 @@ require ( golang.org/x/text v0.21.0 google.golang.org/api v0.218.0 google.golang.org/grpc v1.70.0 - google.golang.org/protobuf v1.36.3 + google.golang.org/protobuf v1.36.4 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 ) diff --git a/go.sum b/go.sum index 760ad427c0a..36a1a108f52 100644 --- a/go.sum +++ b/go.sum @@ -461,8 +461,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= -google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= +google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= From 12c9dbc83cd7af938cc027a5a7840d1acc41bc8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:37:16 +0000 Subject: [PATCH 008/206] build(deps): bump github.com/golang/glog from 1.2.3 to 1.2.4 (#4380) Bumps [github.com/golang/glog](https://github.com/golang/glog) from 1.2.3 to 1.2.4. - [Release notes](https://github.com/golang/glog/releases) - [Commits](https://github.com/golang/glog/compare/v1.2.3...v1.2.4) --- updated-dependencies: - dependency-name: github.com/golang/glog dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 22582634e39..435c4e684c9 100644 --- a/go.mod +++ b/go.mod @@ -113,7 +113,7 @@ require ( github.com/goccy/go-json v0.10.4 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/glog v1.2.3 // indirect + github.com/golang/glog v1.2.4 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect github.com/google/readahead v0.0.0-20161222183148-eaceba169032 // indirect diff --git a/go.sum b/go.sum index 36a1a108f52..2ab12fabe89 100644 --- a/go.sum +++ b/go.sum @@ -141,8 +141,8 @@ github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= -github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= +github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= From e2dd35dcc4b6f9f521cccadefe6c2260624f8df6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 15:37:26 -0800 Subject: [PATCH 009/206] build(deps): bump github/codeql-action in the github-actions group (#4386) Bumps the github-actions group with 1 update: [github/codeql-action](https://github.com/github/codeql-action). Updates `github/codeql-action` from 3.28.4 to 3.28.8 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/ee117c905ab18f32fa0f66c2fe40ecc8013f3e04...dd746615b3b9d728a6a37ca2045b68ca76d4841a) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ossf-scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index d6fef40735e..a2379c0b10b 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -39,7 +39,7 @@ jobs: - # Upload the results to GitHub's code scanning dashboard. name: "Upload to results to dashboard" - uses: github/codeql-action/upload-sarif@ee117c905ab18f32fa0f66c2fe40ecc8013f3e04 # v3.28.4 + uses: github/codeql-action/upload-sarif@dd746615b3b9d728a6a37ca2045b68ca76d4841a # v3.28.8 with: sarif_file: results.sarif - From d56932f7caa6747931b893f2370f510dc46d40f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 15:38:17 -0800 Subject: [PATCH 010/206] build(deps): bump codecov/codecov-action from 5.3.0 to 5.3.1 (#4387) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.3.0 to 5.3.1. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/0da7aa657d958d32c117fc47e1f977e7524753c7...13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/code-coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index 46aa889e5f2..28d8c7e5211 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -24,7 +24,7 @@ jobs: - name: Run Tests run: make test-with-coverage - name: Upload Coverage - uses: codecov/codecov-action@0da7aa657d958d32c117fc47e1f977e7524753c7 # v5.3.0 + uses: codecov/codecov-action@13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3 # v5.3.1 with: files: coverage.txt - name: Upload Logs From 84053a57d578858f36bc6502e6fb5ac7cd60d372 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2025 00:12:10 +0000 Subject: [PATCH 011/206] build(deps): bump google.golang.org/api (#4393) --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 435c4e684c9..8597b98397d 100644 --- a/go.mod +++ b/go.mod @@ -68,7 +68,7 @@ require ( golang.org/x/sys v0.29.0 golang.org/x/term v0.28.0 golang.org/x/text v0.21.0 - google.golang.org/api v0.218.0 + google.golang.org/api v0.219.0 google.golang.org/grpc v1.70.0 google.golang.org/protobuf v1.36.4 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 @@ -146,6 +146,6 @@ require ( golang.org/x/time v0.9.0 // indirect google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 2ab12fabe89..b93bef7961b 100644 --- a/go.sum +++ b/go.sum @@ -432,8 +432,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.218.0 h1:x6JCjEWeZ9PFCRe9z0FBrNwj7pB7DOAqT35N+IPnAUA= -google.golang.org/api v0.218.0/go.mod h1:5VGHBAkxrA/8EFjLVEYmMUJ8/8+gWWQ3s4cFH0FxG2M= +google.golang.org/api v0.219.0 h1:nnKIvxKs/06jWawp2liznTBnMRQBEPpGo7I+oEypTX0= +google.golang.org/api v0.219.0/go.mod h1:K6OmjGm+NtLrIkHxv1U3a0qIf/0JOvAHd5O/6AoyKYE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -443,8 +443,8 @@ google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 h1:91mG8dNTpkC0uChJUQ9zCiRqx3GEEFOWaRZ0mI6Oj2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= From b192b9533fe3ca0223a070d66712d9e3630d2b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Tue, 11 Feb 2025 19:39:53 -0800 Subject: [PATCH 012/206] deps(go): update Go's toolchain to 1.23.6 (#4404) This addresses a govuln reported issue present [crypto/internal/nistec](https://pkg.go.dev/crypto/internal/nistec) on `ppc64le` --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 8597b98397d..debc750a907 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/kopia/kopia go 1.23.0 -toolchain go1.23.5 +toolchain go1.23.6 require ( cloud.google.com/go/storage v1.50.0 From 51bc5a4cd948fd5adb9124cd68e8a917272cec3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 19:41:18 -0800 Subject: [PATCH 013/206] build(deps): bump the common-golang-dependencies group with 11 updates (#4400) Bumps the common-golang-dependencies group with 11 updates: | Package | From | To | | --- | --- | --- | | [github.com/minio/minio-go/v7](https://github.com/minio/minio-go) | `7.0.84` | `7.0.85` | | [golang.org/x/crypto](https://github.com/golang/crypto) | `0.32.0` | `0.33.0` | | [golang.org/x/mod](https://github.com/golang/mod) | `0.22.0` | `0.23.0` | | [golang.org/x/net](https://github.com/golang/net) | `0.34.0` | `0.35.0` | | [golang.org/x/oauth2](https://github.com/golang/oauth2) | `0.25.0` | `0.26.0` | | [golang.org/x/sync](https://github.com/golang/sync) | `0.10.0` | `0.11.0` | | [golang.org/x/sys](https://github.com/golang/sys) | `0.29.0` | `0.30.0` | | [golang.org/x/term](https://github.com/golang/term) | `0.28.0` | `0.29.0` | | [golang.org/x/text](https://github.com/golang/text) | `0.21.0` | `0.22.0` | | [google.golang.org/api](https://github.com/googleapis/google-api-go-client) | `0.219.0` | `0.220.0` | | google.golang.org/protobuf | `1.36.4` | `1.36.5` | Updates `github.com/minio/minio-go/v7` from 7.0.84 to 7.0.85 - [Release notes](https://github.com/minio/minio-go/releases) - [Commits](https://github.com/minio/minio-go/compare/v7.0.84...v7.0.85) Updates `golang.org/x/crypto` from 0.32.0 to 0.33.0 - [Commits](https://github.com/golang/crypto/compare/v0.32.0...v0.33.0) Updates `golang.org/x/mod` from 0.22.0 to 0.23.0 - [Commits](https://github.com/golang/mod/compare/v0.22.0...v0.23.0) Updates `golang.org/x/net` from 0.34.0 to 0.35.0 - [Commits](https://github.com/golang/net/compare/v0.34.0...v0.35.0) Updates `golang.org/x/oauth2` from 0.25.0 to 0.26.0 - [Commits](https://github.com/golang/oauth2/compare/v0.25.0...v0.26.0) Updates `golang.org/x/sync` from 0.10.0 to 0.11.0 - [Commits](https://github.com/golang/sync/compare/v0.10.0...v0.11.0) Updates `golang.org/x/sys` from 0.29.0 to 0.30.0 - [Commits](https://github.com/golang/sys/compare/v0.29.0...v0.30.0) Updates `golang.org/x/term` from 0.28.0 to 0.29.0 - [Commits](https://github.com/golang/term/compare/v0.28.0...v0.29.0) Updates `golang.org/x/text` from 0.21.0 to 0.22.0 - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.21.0...v0.22.0) Updates `google.golang.org/api` from 0.219.0 to 0.220.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.219.0...v0.220.0) Updates `google.golang.org/protobuf` from 1.36.4 to 1.36.5 --- updated-dependencies: - dependency-name: github.com/minio/minio-go/v7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/mod dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/sync dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/term dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/text dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 28 ++++++++++++++-------------- go.sum | 56 ++++++++++++++++++++++++++++---------------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/go.mod b/go.mod index debc750a907..06d0cd78e0b 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 - github.com/minio/minio-go/v7 v7.0.84 + github.com/minio/minio-go/v7 v7.0.85 github.com/mocktools/go-smtp-mock/v2 v2.4.0 github.com/mxk/go-vss v1.2.0 github.com/natefinch/atomic v1.0.1 @@ -59,18 +59,18 @@ require ( go.opentelemetry.io/otel/trace v1.34.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.32.0 + golang.org/x/crypto v0.33.0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 - golang.org/x/mod v0.22.0 - golang.org/x/net v0.34.0 - golang.org/x/oauth2 v0.25.0 - golang.org/x/sync v0.10.0 - golang.org/x/sys v0.29.0 - golang.org/x/term v0.28.0 - golang.org/x/text v0.21.0 - google.golang.org/api v0.219.0 + golang.org/x/mod v0.23.0 + golang.org/x/net v0.35.0 + golang.org/x/oauth2 v0.26.0 + golang.org/x/sync v0.11.0 + golang.org/x/sys v0.30.0 + golang.org/x/term v0.29.0 + golang.org/x/text v0.22.0 + google.golang.org/api v0.220.0 google.golang.org/grpc v1.70.0 - google.golang.org/protobuf v1.36.4 + google.golang.org/protobuf v1.36.5 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 ) @@ -78,7 +78,7 @@ require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect cel.dev/expr v0.19.0 // indirect cloud.google.com/go v0.116.0 // indirect - cloud.google.com/go/auth v0.14.0 // indirect + cloud.google.com/go/auth v0.14.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect cloud.google.com/go/iam v1.2.2 // indirect @@ -137,7 +137,7 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect go.opentelemetry.io/otel/metric v1.34.0 // indirect @@ -146,6 +146,6 @@ require ( golang.org/x/time v0.9.0 // indirect google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index b93bef7961b..70d49c0fbd7 100644 --- a/go.sum +++ b/go.sum @@ -5,8 +5,8 @@ cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= -cloud.google.com/go/auth v0.14.0 h1:A5C4dKV/Spdvxcl0ggWwWEzzP7AZMJSEIgrkngwhGYM= -cloud.google.com/go/auth v0.14.0/go.mod h1:CYsoRL1PdiDuqeQpZE0bP2pnPrGqFcOkI0nldEQis+A= +cloud.google.com/go/auth v0.14.1 h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0= +cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM= cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= @@ -233,8 +233,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.84 h1:D1HVmAF8JF8Bpi6IU4V9vIEj+8pc+xU88EWMs2yed0E= -github.com/minio/minio-go/v7 v7.0.84/go.mod h1:57YXpvc5l3rjPdhqNrDsvVlY0qPI6UTk1bflAe+9doY= +github.com/minio/minio-go/v7 v7.0.85 h1:9psTLS/NTvC3MWoyjhjXpwcKoNbkongaCSF3PNpSuXo= +github.com/minio/minio-go/v7 v7.0.85/go.mod h1:57YXpvc5l3rjPdhqNrDsvVlY0qPI6UTk1bflAe+9doY= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/mocktools/go-smtp-mock/v2 v2.4.0 h1:u0ky0iyNW/LEMKAFRTsDivHyP8dHYxe/cV3FZC3rRjo= @@ -321,8 +321,8 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/detectors/gcp v1.34.0 h1:JRxssobiPg23otYU5SbWtQC//snGVIM3Tx6QRzlQBao= go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= @@ -354,8 +354,8 @@ golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= @@ -364,8 +364,8 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -377,18 +377,18 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70= -golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= +golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -403,23 +403,23 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -432,8 +432,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.219.0 h1:nnKIvxKs/06jWawp2liznTBnMRQBEPpGo7I+oEypTX0= -google.golang.org/api v0.219.0/go.mod h1:K6OmjGm+NtLrIkHxv1U3a0qIf/0JOvAHd5O/6AoyKYE= +google.golang.org/api v0.220.0 h1:3oMI4gdBgB72WFVwE1nerDD8W3HUOS4kypK6rRLbGns= +google.golang.org/api v0.220.0/go.mod h1:26ZAlY6aN/8WgpCzjPNy18QpYaz7Zgg1h0qe1GkZEmY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -443,8 +443,8 @@ google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 h1:91mG8dNTpkC0uChJUQ9zCiRqx3GEEFOWaRZ0mI6Oj2I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 h1:J1H9f+LEdWAfHcez/4cvaVBox7cOYT+IU6rgqj5x++8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -461,8 +461,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= From 3fbe0bd424f74d8f5d7c271651ddaaa4478c5f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Thu, 13 Feb 2025 20:13:22 -0800 Subject: [PATCH 014/206] fix(server): prevent maintenance task on read-only repos (#4408) Avoid starting a maintenance task on the server when the repository connection (configuration) is read-only. Also: * Check for read-only repo before running maintenance. * Move direct repo check to startMaintenanceManager. * Rename function as maybeStartMaintenanceManager. The name reflects that the function may not start a maintenance task manager. * Add connect options to repotesting. * Add test for maintenance on read-only repo. - Fixes: #4373 --- internal/repotesting/repotesting.go | 8 +++- internal/server/server.go | 6 +-- internal/server/server_maintenance.go | 27 +++++++++++-- internal/server/server_maintenance_test.go | 38 ++++++++++++++++++- .../snapshotmaintenance.go | 7 ++++ .../snapshotmaintenance_test.go | 12 ++++++ 6 files changed, 87 insertions(+), 11 deletions(-) diff --git a/internal/repotesting/repotesting.go b/internal/repotesting/repotesting.go index de3acce58f8..095ffde4126 100644 --- a/internal/repotesting/repotesting.go +++ b/internal/repotesting/repotesting.go @@ -38,6 +38,7 @@ type Environment struct { // Options used during Environment Setup. type Options struct { + ConnectOptions func(*repo.ConnectOptions) NewRepositoryOptions func(*repo.NewRepositoryOptions) OpenOptions func(*repo.Options) } @@ -62,6 +63,7 @@ func (e *Environment) setup(tb testing.TB, version format.Version, opts ...Optio ctx := testlogging.Context(tb) e.configDir = testutil.TempDirectory(tb) openOpt := &repo.Options{} + connectOpt := &repo.ConnectOptions{} opt := &repo.NewRepositoryOptions{ BlockFormat: format.ContentFormat{ @@ -86,6 +88,10 @@ func (e *Environment) setup(tb testing.TB, version format.Version, opts ...Optio if mod.OpenOptions != nil { mod.OpenOptions(openOpt) } + + if mod.ConnectOptions != nil { + mod.ConnectOptions(connectOpt) + } } var st blob.Storage @@ -106,7 +112,7 @@ func (e *Environment) setup(tb testing.TB, version format.Version, opts ...Optio err := repo.Initialize(ctx, st, opt, e.Password) require.NoError(tb, err) - err = repo.Connect(ctx, e.ConfigFile(), st, e.Password, nil) + err = repo.Connect(ctx, e.ConfigFile(), st, e.Password, connectOpt) require.NoError(tb, err, "can't connect") e.connected = true diff --git a/internal/server/server.go b/internal/server/server.go index 8760c22976f..e49867f5ed2 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -632,11 +632,7 @@ func (s *Server) SetRepository(ctx context.Context, rep repo.Repository) error { return err } - if dr, ok := s.rep.(repo.DirectRepository); ok { - s.maint = startMaintenanceManager(ctx, dr, s, s.options.MinMaintenanceInterval) - } else { - s.maint = nil - } + s.maint = maybeStartMaintenanceManager(ctx, s.rep, s, s.options.MinMaintenanceInterval) s.sched = scheduler.Start(context.WithoutCancel(ctx), s.getSchedulerItems, scheduler.Options{ TimeNow: clock.Now, diff --git a/internal/server/server_maintenance.go b/internal/server/server_maintenance.go index 1703d1e8ef1..68a0df4e6b8 100644 --- a/internal/server/server_maintenance.go +++ b/internal/server/server_maintenance.go @@ -110,12 +110,31 @@ func (s *srvMaintenance) nextMaintenanceTime() time.Time { return s.cachedNextMaintenanceTime } -func startMaintenanceManager( +// Starts a periodic, background srvMaintenance task. Returns nil if no task was created. +func maybeStartMaintenanceManager( ctx context.Context, - rep repo.DirectRepository, + rep repo.Repository, srv maintenanceManagerServerInterface, minMaintenanceInterval time.Duration, ) *srvMaintenance { + // Check whether maintenance can be run and avoid unnecessarily starting a task that + // would fail later. Don't start a task when the repo is either: + // - not direct; or + // - read only. + // Note: the repo owner is not checked here since the repo owner can be externally + // changed while the server is running. The server would pick up the new onwer + // the next time a maintenance task executes. + dr, ok := rep.(repo.DirectRepository) + if !ok { + return nil + } + + if rep.ClientOptions().ReadOnly { + log(ctx).Warnln("the repository connection is read-only, maintenance tasks will not be performed on this repository") + + return nil + } + mctx, cancel := context.WithCancel(ctx) m := srvMaintenance{ @@ -124,7 +143,7 @@ func startMaintenanceManager( srv: srv, cancelCtx: cancel, minMaintenanceInterval: minMaintenanceInterval, - dr: rep, + dr: dr, } m.wg.Add(1) @@ -145,7 +164,7 @@ func startMaintenanceManager( t0 := clock.Now() - if err := srv.runMaintenanceTask(mctx, rep); err != nil { + if err := srv.runMaintenanceTask(mctx, dr); err != nil { log(ctx).Debugw("maintenance task failed", "err", err) m.afterFailedRun() diff --git a/internal/server/server_maintenance_test.go b/internal/server/server_maintenance_test.go index 1d4785493cc..e2c8ff8531d 100644 --- a/internal/server/server_maintenance_test.go +++ b/internal/server/server_maintenance_test.go @@ -75,7 +75,7 @@ func TestServerMaintenance(t *testing.T) { ts := &testServer{log: t.Logf} - mm := startMaintenanceManager(ctx, env.RepositoryWriter, ts, time.Minute) + mm := maybeStartMaintenanceManager(ctx, env.RepositoryWriter, ts, time.Minute) require.Equal(t, time.Time{}, mm.nextMaintenanceNoEarlierThan) defer mm.stop(ctx) @@ -102,3 +102,39 @@ func TestServerMaintenance(t *testing.T) { // after a failure next maintenance time should be deferred by a minute. require.Greater(t, mm.nextMaintenanceTime().Sub(clock.Now()), 50*time.Second) } + +func TestServerMaintenanceReadOnlyRepoConnection(t *testing.T) { + ctx, env := repotesting.NewEnvironment(t, repotesting.FormatNotImportant) + + require.NoError(t, repo.DirectWriteSession(ctx, env.RepositoryWriter, repo.WriteSessionOptions{}, func(ctx context.Context, dw repo.DirectRepositoryWriter) error { + return maintenance.SetParams(ctx, dw, &maintenance.Params{ + Owner: env.Repository.ClientOptions().UsernameAtHost(), + QuickCycle: maintenance.CycleParams{ + Enabled: true, + Interval: 5 * time.Second, + }, + FullCycle: maintenance.CycleParams{ + Enabled: true, + Interval: 10 * time.Second, + }, + }) + })) + + dr, ok := env.Repository.(repo.DirectRepository) + require.True(t, ok, "not a direct repository connection") + + dr.Refresh(ctx) + + // make repo read-only + co := env.Repository.ClientOptions() + co.ReadOnly = true + + repo.SetClientOptions(ctx, env.ConfigFile(), co) + + env.MustReopen(t) + + ts := &testServer{log: t.Logf} + mm := maybeStartMaintenanceManager(ctx, env.RepositoryWriter, ts, time.Minute) + + require.Nil(t, mm, "maintenance task should not be created on read-only repo") +} diff --git a/snapshot/snapshotmaintenance/snapshotmaintenance.go b/snapshot/snapshotmaintenance/snapshotmaintenance.go index 35d1ea13683..eee65d5953a 100644 --- a/snapshot/snapshotmaintenance/snapshotmaintenance.go +++ b/snapshot/snapshotmaintenance/snapshotmaintenance.go @@ -11,8 +11,15 @@ import ( "github.com/kopia/kopia/snapshot/snapshotgc" ) +// ErrReadonly indicates a failure when attempting to run maintenance on a read-only repository. +var ErrReadonly = errors.New("not running maintenance on read-only repository connection") + // Run runs the complete snapshot and repository maintenance. func Run(ctx context.Context, dr repo.DirectRepositoryWriter, mode maintenance.Mode, force bool, safety maintenance.SafetyParameters) error { + if dr.ClientOptions().ReadOnly { + return ErrReadonly + } + //nolint:wrapcheck return maintenance.RunExclusive(ctx, dr, mode, force, func(ctx context.Context, runParams maintenance.RunParameters) error { diff --git a/snapshot/snapshotmaintenance/snapshotmaintenance_test.go b/snapshot/snapshotmaintenance/snapshotmaintenance_test.go index bb787fb5888..68eee9f39fa 100644 --- a/snapshot/snapshotmaintenance/snapshotmaintenance_test.go +++ b/snapshot/snapshotmaintenance/snapshotmaintenance_test.go @@ -322,6 +322,18 @@ func (s *formatSpecificTestSuite) TestMaintenanceAutoLiveness(t *testing.T) { require.NotEmpty(t, sched.Runs[maintenance.TaskSnapshotGarbageCollection], maintenance.TaskSnapshotGarbageCollection) } +func TestNoMaintenanceReadOnly(t *testing.T) { + ctx, env := repotesting.NewEnvironment(t, repotesting.FormatNotImportant, repotesting.Options{ + ConnectOptions: func(o *repo.ConnectOptions) { + o.ReadOnly = true + }, + }) + + err := snapshotmaintenance.Run(ctx, env.RepositoryWriter, maintenance.ModeAuto, true, maintenance.SafetyFull) + + require.ErrorIs(t, err, snapshotmaintenance.ErrReadonly) +} + func (th *testHarness) fakeTimeOpenRepoOption(o *repo.Options) { o.TimeNowFunc = th.fakeTime.NowFunc() } From 07417a5ee4aad115ede218cf292e7464c553bdf8 Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Thu, 13 Feb 2025 23:22:56 -0800 Subject: [PATCH 015/206] feat(ui): upgraded htmlui to the latest version (#4410) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 06d0cd78e0b..a1106ab5f00 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.17.11 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20241228091102-21c41d704c1b + github.com/kopia/htmluibuild v0.0.1-0.20250214062624-8902d5ca7c0e github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index 70d49c0fbd7..67686bd0d39 100644 --- a/go.sum +++ b/go.sum @@ -209,8 +209,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20241228091102-21c41d704c1b h1:pg4vjHBCUkPlsNyRQXPnJfeXw4l3AJ+B5RliA95OZNg= -github.com/kopia/htmluibuild v0.0.1-0.20241228091102-21c41d704c1b/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250214062624-8902d5ca7c0e h1:5zoBPFP+Y2uzeJh8wPMF9fxObeeatlPKIsdjVePAYGk= +github.com/kopia/htmluibuild v0.0.1-0.20250214062624-8902d5ca7c0e/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From 817a3d9780a75621b2cc9a9f33b19cd0e0de061c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Fri, 14 Feb 2025 00:00:48 -0800 Subject: [PATCH 016/206] build(deps): remove patch requirement in go.mod (#4411) --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index a1106ab5f00..049f813e8fc 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/kopia/kopia -go 1.23.0 +go 1.23 toolchain go1.23.6 From 73a70fcd6bbeec71b726c115f19ba194b26bc35b Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Fri, 14 Feb 2025 00:08:32 -0800 Subject: [PATCH 017/206] feat(ui): upgraded htmlui to the latest version (#4412) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 049f813e8fc..7db4458b3bb 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.17.11 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250214062624-8902d5ca7c0e + github.com/kopia/htmluibuild v0.0.1-0.20250214075053-af5935c9652b github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index 67686bd0d39..16a04e48a65 100644 --- a/go.sum +++ b/go.sum @@ -209,8 +209,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250214062624-8902d5ca7c0e h1:5zoBPFP+Y2uzeJh8wPMF9fxObeeatlPKIsdjVePAYGk= -github.com/kopia/htmluibuild v0.0.1-0.20250214062624-8902d5ca7c0e/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250214075053-af5935c9652b h1:JiINRjRb83kGroU/INrSvrpb5GDIZiV4bZe/Jg4geKQ= +github.com/kopia/htmluibuild v0.0.1-0.20250214075053-af5935c9652b/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From a394a5029feffd0c44aaefca96c624d18705149e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Fri, 14 Feb 2025 23:38:32 -0800 Subject: [PATCH 018/206] fix(general): prevent infinite loop while resolving ignore file symlinks (#4413) * test symlink infinite loop * remove spurious error wrap * cleanup error messages * remove unneeded intermediate vars * check error in loop in fs.GetAllEntries While cur is expected to be `nil` when there's an error, this makes the check explicit. Ref: - #2037 - #4190 --- fs/entry.go | 10 +++------- fs/ignorefs/ignorefs.go | 11 ++++++++--- fs/ignorefs/resolve_test.go | 31 +++++++++++++++++++++++++++++++ fs/localfs/local_fs.go | 6 ++---- 4 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 fs/ignorefs/resolve_test.go diff --git a/fs/entry.go b/fs/entry.go index f208166a7ea..74f9cdc9c75 100644 --- a/fs/entry.go +++ b/fs/entry.go @@ -72,19 +72,15 @@ type Directory interface { func IterateEntries(ctx context.Context, dir Directory, cb func(context.Context, Entry) error) error { iter, err := dir.Iterate(ctx) if err != nil { - return errors.Wrapf(err, "in fs.IterateEntries, creating iterator for directory %s", dir.Name()) + return errors.Wrapf(err, "cannot iterate directory '%q'", dir.Name()) } defer iter.Close() cur, err := iter.Next(ctx) - if err != nil { - err = errors.Wrapf(err, "in fs.IterateEntries, on first iteration") - } - for cur != nil { if err2 := cb(ctx, cur); err2 != nil { - return errors.Wrapf(err2, "in fs.IterateEntries, while calling callback on file %s", cur.Name()) + return errors.Wrapf(err2, "callback failed on '%q'", cur.Name()) } cur, err = iter.Next(ctx) @@ -136,7 +132,7 @@ func GetAllEntries(ctx context.Context, d Directory) ([]Entry, error) { defer iter.Close() cur, err := iter.Next(ctx) - for cur != nil { + for err == nil && cur != nil { entries = append(entries, cur) cur, err = iter.Next(ctx) } diff --git a/fs/ignorefs/ignorefs.go b/fs/ignorefs/ignorefs.go index 6c727791387..9fe7aa1d7f1 100644 --- a/fs/ignorefs/ignorefs.go +++ b/fs/ignorefs/ignorefs.go @@ -20,6 +20,7 @@ import ( var ( log = logging.Module("ignorefs") errSymlinkNotAFile = errors.New("Symlink does not link to a file") + errTooManySymlinks = errors.New("too many levels of symbolic links") ) // IgnoreCallback is a function called by ignorefs to report whenever a file or directory is being ignored while listing its parent. @@ -188,12 +189,12 @@ func (d *ignoreDirectory) Iterate(ctx context.Context) (fs.DirectoryIterator, er thisContext, err := d.buildContext(ctx) if err != nil { - return nil, errors.Wrapf(err, "in ignoreDirectory.Iterate, when building context") + return nil, err } inner, err := d.Directory.Iterate(ctx) if err != nil { - return nil, errors.Wrapf(err, "in ignoreDirectory.Iterate, when creating iterator") + return nil, errors.Wrap(err, "cannot create iterator") } it := ignoreDirIteratorPool.Get().(*ignoreDirIterator) //nolint:forcetypeassert @@ -275,7 +276,9 @@ func (d *ignoreDirectory) Child(ctx context.Context, name string) (fs.Entry, err } func resolveSymlink(ctx context.Context, entry fs.Symlink) (fs.File, error) { - for { + const maxSymlinkFollow = 30 + + for range maxSymlinkFollow { target, err := entry.Resolve(ctx) if err != nil { link, _ := entry.Readlink(ctx) @@ -292,6 +295,8 @@ func resolveSymlink(ctx context.Context, entry fs.Symlink) (fs.File, error) { return nil, errors.Wrapf(errSymlinkNotAFile, "%s does not eventually link to a file", entry.Name()) } } + + return nil, errors.Wrapf(errTooManySymlinks, "cannot resolve '%q'", entry.Name()) } func (d *ignoreDirectory) buildContext(ctx context.Context) (*ignoreContext, error) { diff --git a/fs/ignorefs/resolve_test.go b/fs/ignorefs/resolve_test.go new file mode 100644 index 00000000000..5e4d852b8a7 --- /dev/null +++ b/fs/ignorefs/resolve_test.go @@ -0,0 +1,31 @@ +package ignorefs + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/kopia/kopia/fs" + "github.com/kopia/kopia/internal/mockfs" + "github.com/kopia/kopia/internal/testlogging" +) + +func TestNoInfiniteResolveLink(t *testing.T) { + root := mockfs.NewDirectory() + + root.AddSymlink("a", "./b", 0) + root.AddSymlink("b", "./c", 0) + root.AddSymlink("c", "./a", 0) + + ctx := testlogging.Context(t) + e, err := root.Child(ctx, "b") + require.NoError(t, err) + + s, ok := e.(fs.Symlink) + require.True(t, ok) + + f, err := resolveSymlink(ctx, s) + + require.ErrorIs(t, err, errTooManySymlinks) + require.Nil(t, f) +} diff --git a/fs/localfs/local_fs.go b/fs/localfs/local_fs.go index b21ec972c72..f3caa11c0ce 100644 --- a/fs/localfs/local_fs.go +++ b/fs/localfs/local_fs.go @@ -120,12 +120,10 @@ func (fsl *filesystemSymlink) Readlink(ctx context.Context) (string, error) { func (fsl *filesystemSymlink) Resolve(ctx context.Context) (fs.Entry, error) { target, err := filepath.EvalSymlinks(fsl.fullPath()) if err != nil { - return nil, errors.Wrapf(err, "while reading symlink %s", fsl.fullPath()) + return nil, errors.Wrapf(err, "cannot resolve symlink for '%q'", fsl.fullPath()) } - entry, err := NewEntry(target) - - return entry, err + return NewEntry(target) } func (e *filesystemErrorEntry) ErrorInfo() error { From 54dc7b77a74e710d0aa3559a8192c3f4913d98d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Feb 2025 16:30:22 -0800 Subject: [PATCH 019/206] build(deps): bump github.com/sanity-io/litter from 1.5.6 to 1.5.8 (#4417) Bumps [github.com/sanity-io/litter](https://github.com/sanity-io/litter) from 1.5.6 to 1.5.8. - [Changelog](https://github.com/sanity-io/litter/blob/main/CHANGELOG.md) - [Commits](https://github.com/sanity-io/litter/compare/v1.5.6...v1.5.8) --- updated-dependencies: - dependency-name: github.com/sanity-io/litter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7db4458b3bb..f521aa544c7 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/prometheus/client_golang v1.20.5 github.com/prometheus/client_model v0.6.1 github.com/prometheus/common v0.62.0 - github.com/sanity-io/litter v1.5.6 + github.com/sanity-io/litter v1.5.8 github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/stretchr/testify v1.10.0 github.com/studio-b12/gowebdav v0.10.0 diff --git a/go.sum b/go.sum index 16a04e48a65..f297fcf8b06 100644 --- a/go.sum +++ b/go.sum @@ -282,8 +282,8 @@ github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= -github.com/sanity-io/litter v1.5.6 h1:hCFycYzhRnW4niFbbmR7QKdmds69PbVa/sNmEN5euSU= -github.com/sanity-io/litter v1.5.6/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= +github.com/sanity-io/litter v1.5.8 h1:uM/2lKrWdGbRXDrIq08Lh9XtVYoeGtcQxk9rtQ7+rYg= +github.com/sanity-io/litter v1.5.8/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From 8f47290e247dabc57f203afee1278f3ed54331b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2025 00:55:03 +0000 Subject: [PATCH 020/206] build(deps): bump the common-golang-dependencies group with 3 updates (#4416) * build(deps): bump the common-golang-dependencies group with 3 updates Bumps the common-golang-dependencies group with 3 updates: [github.com/Azure/azure-sdk-for-go/sdk/azidentity](https://github.com/Azure/azure-sdk-for-go), [github.com/minio/minio-go/v7](https://github.com/minio/minio-go) and [google.golang.org/api](https://github.com/googleapis/google-api-go-client). Updates `github.com/Azure/azure-sdk-for-go/sdk/azidentity` from 1.8.1 to 1.8.2 - [Release notes](https://github.com/Azure/azure-sdk-for-go/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md) - [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azidentity/v1.8.1...sdk/azidentity/v1.8.2) Updates `github.com/minio/minio-go/v7` from 7.0.85 to 7.0.86 - [Release notes](https://github.com/minio/minio-go/releases) - [Commits](https://github.com/minio/minio-go/compare/v7.0.85...v7.0.86) Updates `google.golang.org/api` from 0.220.0 to 0.221.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.220.0...v0.221.0) --- updated-dependencies: - dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azidentity dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies - dependency-name: github.com/minio/minio-go/v7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] * update github.com/minio/crc64nvme to v1.0.1 To consume fix in minio/crc64nvme#1 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: J <1953782+julio-lopez@users.noreply.github.com> --- go.mod | 15 ++++++++------- go.sum | 34 ++++++++++++++++++---------------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index f521aa544c7..fdfe6a0a33f 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.23.6 require ( cloud.google.com/go/storage v1.50.0 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 github.com/alecthomas/kingpin/v2 v2.4.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 @@ -34,7 +34,7 @@ require ( github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 - github.com/minio/minio-go/v7 v7.0.85 + github.com/minio/minio-go/v7 v7.0.86 github.com/mocktools/go-smtp-mock/v2 v2.4.0 github.com/mxk/go-vss v1.2.0 github.com/natefinch/atomic v1.0.1 @@ -68,7 +68,7 @@ require ( golang.org/x/sys v0.30.0 golang.org/x/term v0.29.0 golang.org/x/text v0.22.0 - google.golang.org/api v0.220.0 + google.golang.org/api v0.221.0 google.golang.org/grpc v1.70.0 google.golang.org/protobuf v1.36.5 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 @@ -84,7 +84,7 @@ require ( cloud.google.com/go/iam v1.2.2 // indirect cloud.google.com/go/monitoring v1.21.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 // indirect github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect @@ -110,7 +110,7 @@ require ( github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect github.com/gobwas/ws v1.4.0 // indirect - github.com/goccy/go-json v0.10.4 // indirect + github.com/goccy/go-json v0.10.5 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/glog v1.2.4 // indirect @@ -125,6 +125,7 @@ require ( github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/kr/fs v0.1.0 // indirect github.com/mailru/easyjson v0.9.0 // indirect + github.com/minio/crc64nvme v1.0.1 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect @@ -143,9 +144,9 @@ require ( go.opentelemetry.io/otel/metric v1.34.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect - golang.org/x/time v0.9.0 // indirect + golang.org/x/time v0.10.0 // indirect google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index f297fcf8b06..0e67563c560 100644 --- a/go.sum +++ b/go.sum @@ -25,10 +25,10 @@ cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 h1:1mvYtZfWQAnwNah/C+Z+Jb9rQH95LPE2vlmMuWAHJk8= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1/go.mod h1:75I/mXtme1JyWFtz8GocPHVFyH421IBoZErnO16dd0k= -github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1 h1:Bk5uOhSAenHyR5P61D/NzeQCv+4fEVV8mOkJ82NqpWw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1/go.mod h1:QZ4pw3or1WPmRBxf0cHd1tknzrT54WPBOQoGutCPvSU= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c= @@ -37,8 +37,8 @@ github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 h1:UXT0o77lXQrikd1kg github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0/go.mod h1:cTvi54pg19DoT07ekoeMgE/taAwNtCShVeZqA+Iv2xI= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= -github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 h1:kYRSnvJju5gYVyhkij+RTJ/VR6QIUaCfWeaFm2ycsjQ= -github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 h1:H5xDQaE3XowWfhZRUpnfC+rGZMEVoSiji+b+/HFAPU4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/GehirnInc/crypt v0.0.0-20190301055215-6c0105aabd46/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo= github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 h1:IEjq88XO4PuBDcvmjQJcQGg+w+UaafSy8G5Kcb5tBhI= @@ -129,8 +129,8 @@ github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs= github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc= -github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= -github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -231,10 +231,12 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY= +github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.85 h1:9psTLS/NTvC3MWoyjhjXpwcKoNbkongaCSF3PNpSuXo= -github.com/minio/minio-go/v7 v7.0.85/go.mod h1:57YXpvc5l3rjPdhqNrDsvVlY0qPI6UTk1bflAe+9doY= +github.com/minio/minio-go/v7 v7.0.86 h1:DcgQ0AUjLJzRH6y/HrxiZ8CXarA70PAIufXHodP4s+k= +github.com/minio/minio-go/v7 v7.0.86/go.mod h1:VbfO4hYwUu3Of9WqGLBZ8vl3Hxnxo4ngxK4hzQDf4x4= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/mocktools/go-smtp-mock/v2 v2.4.0 h1:u0ky0iyNW/LEMKAFRTsDivHyP8dHYxe/cV3FZC3rRjo= @@ -420,8 +422,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= -golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= -golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= +golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -432,8 +434,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.220.0 h1:3oMI4gdBgB72WFVwE1nerDD8W3HUOS4kypK6rRLbGns= -google.golang.org/api v0.220.0/go.mod h1:26ZAlY6aN/8WgpCzjPNy18QpYaz7Zgg1h0qe1GkZEmY= +google.golang.org/api v0.221.0 h1:qzaJfLhDsbMeFee8zBRdt/Nc+xmOuafD/dbdgGfutOU= +google.golang.org/api v0.221.0/go.mod h1:7sOU2+TL4TxUTdbi0gWgAIg7tH5qBXxoyhtL+9x3biQ= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -443,8 +445,8 @@ google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 h1:J1H9f+LEdWAfHcez/4cvaVBox7cOYT+IU6rgqj5x++8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= From 77448b73794cdd3f7479f43a76b4a1dac031ab5c Mon Sep 17 00:00:00 2001 From: Nick Date: Thu, 20 Feb 2025 19:56:11 -0800 Subject: [PATCH 021/206] Account for symlinks in directory summary (#4421) Account for symlinks in directory summary --- snapshot/snapshotfs/dir_manifest_builder.go | 1 + .../snapshotfs/dir_manifest_builder_test.go | 94 +++++++++++++++++++ snapshot/snapshotfs/upload_test.go | 39 ++++++++ 3 files changed, 134 insertions(+) create mode 100644 snapshot/snapshotfs/dir_manifest_builder_test.go diff --git a/snapshot/snapshotfs/dir_manifest_builder.go b/snapshot/snapshotfs/dir_manifest_builder.go index 3f1163a885c..875e0c25c2b 100644 --- a/snapshot/snapshotfs/dir_manifest_builder.go +++ b/snapshot/snapshotfs/dir_manifest_builder.go @@ -54,6 +54,7 @@ func (b *DirManifestBuilder) AddEntry(de *snapshot.DirEntry) { b.summary.TotalFileCount += childSummary.TotalFileCount b.summary.TotalFileSize += childSummary.TotalFileSize b.summary.TotalDirCount += childSummary.TotalDirCount + b.summary.TotalSymlinkCount += childSummary.TotalSymlinkCount b.summary.FatalErrorCount += childSummary.FatalErrorCount b.summary.IgnoredErrorCount += childSummary.IgnoredErrorCount b.summary.FailedEntries = append(b.summary.FailedEntries, childSummary.FailedEntries...) diff --git a/snapshot/snapshotfs/dir_manifest_builder_test.go b/snapshot/snapshotfs/dir_manifest_builder_test.go new file mode 100644 index 00000000000..9edaf884e7f --- /dev/null +++ b/snapshot/snapshotfs/dir_manifest_builder_test.go @@ -0,0 +1,94 @@ +package snapshotfs + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/kopia/kopia/fs" + "github.com/kopia/kopia/snapshot" +) + +func TestAddEntry(t *testing.T) { + now := time.Date(2020, 1, 2, 3, 4, 5, 6, time.UTC) + + for _, tc := range []struct { + desc string + entry *snapshot.DirEntry + expected fs.DirectorySummary + }{ + { + desc: "Add file entry", + entry: &snapshot.DirEntry{ + Name: "file1", + Type: snapshot.EntryTypeFile, + FileSize: 100, + ModTime: fs.UTCTimestamp(now.Unix()), + }, + expected: fs.DirectorySummary{ + TotalFileCount: 1, + TotalFileSize: 100, + MaxModTime: fs.UTCTimestamp(now.Unix()), + }, + }, + { + desc: "Add symlink entry", + entry: &snapshot.DirEntry{ + Name: "symlink1", + Type: snapshot.EntryTypeSymlink, + FileSize: 50, + ModTime: fs.UTCTimestamp(now.Add(1 * time.Hour).Unix()), + }, + expected: fs.DirectorySummary{ + TotalSymlinkCount: 1, + TotalFileSize: 50, + MaxModTime: fs.UTCTimestamp(now.Add(1 * time.Hour).Unix()), + }, + }, + { + desc: "Add directory entry with child summary", + entry: &snapshot.DirEntry{ + Name: "dir1", + Type: snapshot.EntryTypeDirectory, + DirSummary: &fs.DirectorySummary{ + TotalFileCount: 2, + TotalFileSize: 200, + TotalDirCount: 1, + TotalSymlinkCount: 1, + FatalErrorCount: 1, + IgnoredErrorCount: 1, + MaxModTime: fs.UTCTimestamp(now.Add(2 * time.Hour).Unix()), + }, + ModTime: fs.UTCTimestamp(now.Add(1 * time.Hour).Unix()), + }, + expected: fs.DirectorySummary{ + TotalFileCount: 2, + TotalFileSize: 200, + TotalDirCount: 1, + TotalSymlinkCount: 1, + FatalErrorCount: 1, + IgnoredErrorCount: 1, + MaxModTime: fs.UTCTimestamp(now.Add(2 * time.Hour).Unix()), + }, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + builder := &DirManifestBuilder{} + builder.AddEntry(tc.entry) + require.Equal(t, tc.expected.TotalFileCount, builder.summary.TotalFileCount, "TotalFileCount mismatch") + + if tc.entry.Type != snapshot.EntryTypeSymlink { + // Note: the file size is not being propagated for symlinks. + // For now, don't check the file size for symlinks. + require.Equal(t, tc.expected.TotalFileSize, builder.summary.TotalFileSize, "TotalFileSize mismatch") + } + + require.Equal(t, tc.expected.TotalSymlinkCount, builder.summary.TotalSymlinkCount, "TotalSymlinkCount mismatch") + require.Equal(t, tc.expected.TotalDirCount, builder.summary.TotalDirCount, "TotalDirCount mismatch") + require.Equal(t, tc.expected.FatalErrorCount, builder.summary.FatalErrorCount, "FatalErrorCount mismatch") + require.Equal(t, tc.expected.IgnoredErrorCount, builder.summary.IgnoredErrorCount, "IgnoredErrorCount mismatch") + require.True(t, builder.summary.MaxModTime.Equal(tc.expected.MaxModTime), "MaxModTime mismatch: got %v, want %v", builder.summary.MaxModTime, tc.expected.MaxModTime) + }) + } +} diff --git a/snapshot/snapshotfs/upload_test.go b/snapshot/snapshotfs/upload_test.go index 5f109762104..588e53a06a2 100644 --- a/snapshot/snapshotfs/upload_test.go +++ b/snapshot/snapshotfs/upload_test.go @@ -712,6 +712,45 @@ func TestUpload_FinishedFileProgress(t *testing.T) { assert.Equal(t, 2, filesFinished, "FinishedFile calls") } +func TestUpload_SymlinkStats(t *testing.T) { + ctx := testlogging.Context(t) + th := newUploadTestHarness(ctx, t) + + root := mockfs.NewDirectory() + root.AddFile("f1", []byte{1, 2, 3}, defaultPermissions) + root.AddDir("d1", defaultPermissions) + root.AddDir("d1/d1", defaultPermissions) + root.AddFile("d1/d1/f1", []byte{1, 2, 3}, defaultPermissions) + root.AddSymlink("s1", "d1/d1/f1", defaultPermissions) + root.AddSymlink("s2", "f1", defaultPermissions) + root.AddSymlink("s3", "d1", defaultPermissions) + + u := NewUploader(th.repo) + policyTree := policy.BuildTree(nil, policy.DefaultPolicy) + + // First upload of the root directory. + man1, err := u.Upload(ctx, root, policyTree, snapshot.SourceInfo{}) + require.NoError(t, err) + + // Expect the directory summary to have the correct breakdown of files and symlinks. + require.Equal(t, int64(3), man1.RootEntry.DirSummary.TotalSymlinkCount, "Directory summary TotalSymlinkCount") + require.Equal(t, int64(2), man1.RootEntry.DirSummary.TotalFileCount, "Directory summary TotalSymlinkCount") + + // Expect the directory summary total file size to match the stats total file size. + require.Equal(t, atomic.LoadInt64(&man1.Stats.TotalFileSize), man1.RootEntry.DirSummary.TotalFileSize, "Total file size") + + // Upload a second time to check the stats from cached files. + man2, err := u.Upload(ctx, root, policyTree, snapshot.SourceInfo{}, man1) + require.NoError(t, err) + + // Expect total file count for the second upload to be zero - all files are cached. + require.Equal(t, int32(0), atomic.LoadInt32(&man2.Stats.TotalFileCount), "Directory summary TotalFileCount") + + // Expect the directory summary to have the correct breakdown of files and symlinks. + require.Equal(t, int64(3), man2.RootEntry.DirSummary.TotalSymlinkCount, "Directory summary TotalSymlinkCount") + require.Equal(t, int64(2), man2.RootEntry.DirSummary.TotalFileCount, "Directory summary TotalSymlinkCount") +} + func TestUploadWithCheckpointing(t *testing.T) { ctx := testlogging.Context(t) th := newUploadTestHarness(ctx, t) From 8f632e4e1fd15efba5131d8e0b1d34b6393cc581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Fri, 21 Feb 2025 21:57:22 -0800 Subject: [PATCH 022/206] refactor(cli): diff test (#4422) - Use a single struct and implementation for common functionality - set type in Mode() for directories - nit: fix typo --- cli/command_diff.go | 2 +- internal/diff/diff_test.go | 102 +++++++++++++++++++++---------------- 2 files changed, 60 insertions(+), 44 deletions(-) diff --git a/cli/command_diff.go b/cli/command_diff.go index 0096fa6c085..6e26a8d325c 100644 --- a/cli/command_diff.go +++ b/cli/command_diff.go @@ -47,7 +47,7 @@ func (c *commandDiff) run(ctx context.Context, rep repo.Repository) error { _, isDir2 := ent2.(fs.Directory) if isDir1 != isDir2 { - return errors.New("arguments do diff must both be directories or both non-directories") + return errors.New("arguments to diff must both be directories or both non-directories") } d, err := diff.NewComparer(c.out.stdout()) diff --git a/internal/diff/diff_test.go b/internal/diff/diff_test.go index 210f6b700e8..c360c295201 100644 --- a/internal/diff/diff_test.go +++ b/internal/diff/diff_test.go @@ -15,51 +15,68 @@ import ( "github.com/kopia/kopia/internal/diff" ) -var _ fs.Entry = (*testFile)(nil) +var ( + _ fs.Entry = (*testFile)(nil) + _ fs.Directory = (*testDirectory)(nil) +) -type testFile struct { +type testBaseEntry struct { modtime time.Time + mode os.FileMode name string +} + +func (f *testBaseEntry) IsDir() bool { return false } +func (f *testBaseEntry) LocalFilesystemPath() string { return f.name } +func (f *testBaseEntry) Close() {} +func (f *testBaseEntry) Name() string { return f.name } +func (f *testBaseEntry) ModTime() time.Time { return f.modtime } +func (f *testBaseEntry) Sys() interface{} { return nil } +func (f *testBaseEntry) Owner() fs.OwnerInfo { return fs.OwnerInfo{UserID: 1000, GroupID: 1000} } +func (f *testBaseEntry) Device() fs.DeviceInfo { return fs.DeviceInfo{Dev: 1} } + +func (f *testBaseEntry) Mode() os.FileMode { + if f.mode == 0 { + return 0o644 + } + + return f.mode & ^os.ModeDir +} + +type testFile struct { + testBaseEntry content string } -func (f *testFile) IsDir() bool { return false } -func (f *testFile) LocalFilesystemPath() string { return f.name } -func (f *testFile) Close() {} -func (f *testFile) Name() string { return f.name } -func (f *testFile) Size() int64 { return int64(len(f.content)) } -func (f *testFile) Mode() os.FileMode { return 0o644 } -func (f *testFile) ModTime() time.Time { return f.modtime } -func (f *testFile) Sys() interface{} { return nil } -func (f *testFile) Owner() fs.OwnerInfo { return fs.OwnerInfo{UserID: 1000, GroupID: 1000} } -func (f *testFile) Device() fs.DeviceInfo { return fs.DeviceInfo{Dev: 1} } func (f *testFile) Open(ctx context.Context) (io.Reader, error) { return strings.NewReader(f.content), nil } -var _ fs.Directory = (*testDirectory)(nil) +func (f *testFile) Size() int64 { return int64(len(f.content)) } type testDirectory struct { - name string - files []fs.Entry - modtime time.Time + testBaseEntry + files []fs.Entry } func (d *testDirectory) Iterate(ctx context.Context) (fs.DirectoryIterator, error) { return fs.StaticIterator(d.files, nil), nil } -func (d *testDirectory) SupportsMultipleIterations() bool { return false } -func (d *testDirectory) IsDir() bool { return true } -func (d *testDirectory) LocalFilesystemPath() string { return d.name } -func (d *testDirectory) Close() {} -func (d *testDirectory) Name() string { return d.name } -func (d *testDirectory) Size() int64 { return 0 } -func (d *testDirectory) Mode() os.FileMode { return 0o755 } -func (d *testDirectory) ModTime() time.Time { return d.modtime } -func (d *testDirectory) Sys() interface{} { return nil } -func (d *testDirectory) Owner() fs.OwnerInfo { return fs.OwnerInfo{UserID: 1000, GroupID: 1000} } -func (d *testDirectory) Device() fs.DeviceInfo { return fs.DeviceInfo{Dev: 1} } +func (d *testDirectory) SupportsMultipleIterations() bool { return false } +func (d *testDirectory) IsDir() bool { return true } +func (d *testDirectory) LocalFilesystemPath() string { return d.name } +func (d *testDirectory) Size() int64 { return 0 } +func (d *testDirectory) Readdir(ctx context.Context) ([]fs.Entry, error) { return d.files, nil } + +func (d *testDirectory) Mode() os.FileMode { + if d.mode == 0 { + return os.ModeDir | 0o755 + } + + return os.ModeDir | d.mode +} + func (d *testDirectory) Child(ctx context.Context, name string) (fs.Entry, error) { for _, f := range d.files { if f.Name() == name { @@ -69,7 +86,6 @@ func (d *testDirectory) Child(ctx context.Context, name string) (fs.Entry, error return nil, fs.ErrEntryNotFound } -func (d *testDirectory) Readdir(ctx context.Context) ([]fs.Entry, error) { return d.files, nil } func TestCompareEmptyDirectories(t *testing.T) { var buf bytes.Buffer @@ -102,14 +118,14 @@ func TestCompareIdenticalDirectories(t *testing.T) { dir1 := createTestDirectory( "testDir1", dmodtime, - &testFile{name: "file1.txt", content: "abcdefghij", modtime: fmodtime}, - &testFile{name: "file2.txt", content: "klmnopqrstuvwxyz", modtime: fmodtime}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file1.txt"}, content: "abcdefghij"}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, ) dir2 := createTestDirectory( "testDir2", dmodtime, - &testFile{name: "file1.txt", content: "abcdefghij", modtime: fmodtime}, - &testFile{name: "file2.txt", content: "klmnopqrstuvwxyz", modtime: fmodtime}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file1.txt"}, content: "abcdefghij"}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, ) c, err := diff.NewComparer(&buf) @@ -134,14 +150,14 @@ func TestCompareDifferentDirectories(t *testing.T) { dir1 := createTestDirectory( "testDir1", dmodtime, - &testFile{name: "file1.txt", content: "abcdefghij", modtime: fmodtime}, - &testFile{name: "file2.txt", content: "klmnopqrstuvwxyz", modtime: fmodtime}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file1.txt"}, content: "abcdefghij"}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, ) dir2 := createTestDirectory( "testDir2", dmodtime, - &testFile{name: "file3.txt", content: "abcdefghij1", modtime: fmodtime}, - &testFile{name: "file4.txt", content: "klmnopqrstuvwxyz2", modtime: fmodtime}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file3.txt"}, content: "abcdefghij1"}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file4.txt"}, content: "klmnopqrstuvwxyz2"}, ) c, err := diff.NewComparer(&buf) @@ -171,14 +187,14 @@ func TestCompareDifferentDirectories_DirTimeDiff(t *testing.T) { dir1 := createTestDirectory( "testDir1", dmodtime1, - &testFile{name: "file1.txt", content: "abcdefghij", modtime: fmodtime}, - &testFile{name: "file2.txt", content: "klmnopqrstuvwxyz", modtime: fmodtime}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file1.txt"}, content: "abcdefghij"}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, ) dir2 := createTestDirectory( "testDir2", dmodtime2, - &testFile{name: "file1.txt", content: "abcdefghij", modtime: fmodtime}, - &testFile{name: "file2.txt", content: "klmnopqrstuvwxyz", modtime: fmodtime}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file1.txt"}, content: "abcdefghij"}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, ) c, err := diff.NewComparer(&buf) @@ -205,12 +221,12 @@ func TestCompareDifferentDirectories_FileTimeDiff(t *testing.T) { dir1 := createTestDirectory( "testDir1", dmodtime, - &testFile{name: "file1.txt", content: "abcdefghij", modtime: fmodtime1}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime1, name: "file1.txt"}, content: "abcdefghij"}, ) dir2 := createTestDirectory( "testDir2", dmodtime, - &testFile{name: "file1.txt", content: "abcdefghij", modtime: fmodtime2}, + &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime2, name: "file1.txt"}, content: "abcdefghij"}, ) c, err := diff.NewComparer(&buf) @@ -228,5 +244,5 @@ func TestCompareDifferentDirectories_FileTimeDiff(t *testing.T) { } func createTestDirectory(name string, modtime time.Time, files ...fs.Entry) *testDirectory { - return &testDirectory{name: name, files: files, modtime: modtime} + return &testDirectory{testBaseEntry: testBaseEntry{modtime: modtime, name: name}, files: files} } From 03edfef2fd5a4589abc2ad8ed99bbf4e0d0587e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 23:40:35 +0000 Subject: [PATCH 023/206] build(deps): bump github.com/prometheus/client_golang (#4424) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fdfe6a0a33f..efb364e85db 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/pkg/profile v1.7.0 github.com/pkg/sftp v1.13.7 - github.com/prometheus/client_golang v1.20.5 + github.com/prometheus/client_golang v1.21.0 github.com/prometheus/client_model v0.6.1 github.com/prometheus/common v0.62.0 github.com/sanity-io/litter v1.5.8 diff --git a/go.sum b/go.sum index 0e67563c560..6463eac8a0b 100644 --- a/go.sum +++ b/go.sum @@ -268,8 +268,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= From 23d23e76c67b95c51e1601c407adbd3ceb8898a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 23:45:51 +0000 Subject: [PATCH 024/206] build(deps): bump github.com/chromedp/chromedp from 0.12.1 to 0.13.0 (#4426) --- go.mod | 7 +++---- go.sum | 14 ++++++-------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index efb364e85db..080bf51c2f0 100644 --- a/go.mod +++ b/go.mod @@ -12,8 +12,8 @@ require ( github.com/alecthomas/kingpin/v2 v2.4.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 github.com/chmduquesne/rollinghash v4.0.0+incompatible - github.com/chromedp/cdproto v0.0.0-20250120090109-d38428e4d9c8 - github.com/chromedp/chromedp v0.12.1 + github.com/chromedp/cdproto v0.0.0-20250222051814-50c6cb17f10a + github.com/chromedp/chromedp v0.13.0 github.com/coreos/go-systemd/v22 v22.5.0 github.com/dustinkirkland/golang-petname v0.0.0-20191129215211-8e5a1ed0cff0 github.com/edsrzf/mmap-go v1.2.0 @@ -104,6 +104,7 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/frankban/quicktest v1.13.1 // indirect github.com/go-ini/ini v1.67.0 // indirect + github.com/go-json-experiment/json v0.0.0-20250211171154-1ae217ad3535 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect @@ -121,10 +122,8 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect - github.com/josharian/intern v1.0.0 // indirect github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/kr/fs v0.1.0 // indirect - github.com/mailru/easyjson v0.9.0 // indirect github.com/minio/crc64nvme v1.0.1 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect diff --git a/go.sum b/go.sum index 6463eac8a0b..94648addd3d 100644 --- a/go.sum +++ b/go.sum @@ -66,10 +66,10 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chmduquesne/rollinghash v4.0.0+incompatible h1:hnREQO+DXjqIw3rUTzWN7/+Dpw+N5Um8zpKV0JOEgbo= github.com/chmduquesne/rollinghash v4.0.0+incompatible/go.mod h1:Uc2I36RRfTAf7Dge82bi3RU0OQUmXT9iweIcPqvr8A0= -github.com/chromedp/cdproto v0.0.0-20250120090109-d38428e4d9c8 h1:Q2byC+xLgH/Z7hExJ8G/jVqsvCfGhMmNgM1ysZARA3o= -github.com/chromedp/cdproto v0.0.0-20250120090109-d38428e4d9c8/go.mod h1:RTGuBeCeabAJGi3OZf71a6cGa7oYBfBP75VJZFLv6SU= -github.com/chromedp/chromedp v0.12.1 h1:kBMblXk7xH5/6j3K9uk8d7/c+fzXWiUsCsPte0VMwOA= -github.com/chromedp/chromedp v0.12.1/go.mod h1:F6+wdq9LKFDMoyxhq46ZLz4VLXrsrCAR3sFqJz4Nqc0= +github.com/chromedp/cdproto v0.0.0-20250222051814-50c6cb17f10a h1:EnkQjhmp/MxhDB4KOTssv6xC20aQ9rhFRCfGHTsTqmE= +github.com/chromedp/cdproto v0.0.0-20250222051814-50c6cb17f10a/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= +github.com/chromedp/chromedp v0.13.0 h1:ydOqt7Y9LkwgutrX5C8bx49D+o63L6WcGUDyIoE0A5M= +github.com/chromedp/chromedp v0.13.0/go.mod h1:O3nO4Lno7iLoVX+7GdqQkehhKG7DtLf/zFRyJo0AhXY= github.com/chromedp/sysutil v1.1.0 h1:PUFNv5EcprjqXZD9nJb9b/c9ibAbxiYo4exNWZyipwM= github.com/chromedp/sysutil v1.1.0/go.mod h1:WiThHUdltqCNKGc4gaU50XgYjwjYIhKWoHGPTUfWTJ8= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -116,6 +116,8 @@ github.com/frankban/quicktest v1.13.1 h1:xVm/f9seEhZFL9+n5kv5XLrGwy6elc4V9v/XFY2 github.com/frankban/quicktest v1.13.1/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-json-experiment/json v0.0.0-20250211171154-1ae217ad3535 h1:yE7argOs92u+sSCRgqqe6eF+cDaVhSPlioy1UkA0p/w= +github.com/go-json-experiment/json v0.0.0-20250211171154-1ae217ad3535/go.mod h1:BWmvoE1Xia34f3l/ibJweyhrT+aROb/FQ6d+37F0e2s= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -196,8 +198,6 @@ github.com/hanwen/go-fuse/v2 v2.7.2/go.mod h1:ugNaD/iv5JYyS1Rcvi57Wz7/vrLQJo10mm github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= @@ -225,8 +225,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= -github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= -github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= From bf3c524169c989279129fe171b85029d02851700 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 00:07:47 +0000 Subject: [PATCH 025/206] build(deps): bump github.com/klauspost/compress from 1.17.11 to 1.18.0 (#4427) Bumps [github.com/klauspost/compress](https://github.com/klauspost/compress) from 1.17.11 to 1.18.0. - [Release notes](https://github.com/klauspost/compress/releases) - [Changelog](https://github.com/klauspost/compress/blob/master/.goreleaser.yml) - [Commits](https://github.com/klauspost/compress/compare/v1.17.11...v1.18.0) --- updated-dependencies: - dependency-name: github.com/klauspost/compress dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 080bf51c2f0..baa4de3c4d1 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/gorilla/mux v1.8.1 github.com/hanwen/go-fuse/v2 v2.7.2 github.com/hashicorp/cronexpr v1.1.2 - github.com/klauspost/compress v1.17.11 + github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 github.com/kopia/htmluibuild v0.0.1-0.20250214075053-af5935c9652b diff --git a/go.sum b/go.sum index 94648addd3d..c2521480a21 100644 --- a/go.sum +++ b/go.sum @@ -200,8 +200,8 @@ github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1 github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +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/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= From e59349a044f8d3a38f1208a579888a1819019b01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:28:00 -0800 Subject: [PATCH 026/206] build(deps): bump github.com/google/go-cmp from 0.6.0 to 0.7.0 (#4425) Bumps [github.com/google/go-cmp](https://github.com/google/go-cmp) from 0.6.0 to 0.7.0. - [Release notes](https://github.com/google/go-cmp/releases) - [Commits](https://github.com/google/go-cmp/compare/v0.6.0...v0.7.0) --- updated-dependencies: - dependency-name: github.com/google/go-cmp dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index baa4de3c4d1..b2bca4a4c9b 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/gofrs/flock v0.12.1 github.com/golang-jwt/jwt/v4 v4.5.1 github.com/google/fswalker v0.3.3 - github.com/google/go-cmp v0.6.0 + github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.1 github.com/hanwen/go-fuse/v2 v2.7.2 diff --git a/go.sum b/go.sum index c2521480a21..82d906b9e6b 100644 --- a/go.sum +++ b/go.sum @@ -169,8 +169,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= From 63ada06fdeaf52e6aac6203c490d6a147dc8bf6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 00:49:38 +0000 Subject: [PATCH 027/206] build(deps): bump the common-golang-dependencies group with 4 updates (#4423) Bumps the common-golang-dependencies group with 4 updates: [github.com/minio/minio-go/v7](https://github.com/minio/minio-go), [golang.org/x/crypto](https://github.com/golang/crypto), [golang.org/x/oauth2](https://github.com/golang/oauth2) and [google.golang.org/api](https://github.com/googleapis/google-api-go-client). Updates `github.com/minio/minio-go/v7` from 7.0.86 to 7.0.87 - [Release notes](https://github.com/minio/minio-go/releases) - [Commits](https://github.com/minio/minio-go/compare/v7.0.86...v7.0.87) Updates `golang.org/x/crypto` from 0.33.0 to 0.35.0 - [Commits](https://github.com/golang/crypto/compare/v0.33.0...v0.35.0) Updates `golang.org/x/oauth2` from 0.26.0 to 0.27.0 - [Commits](https://github.com/golang/oauth2/compare/v0.26.0...v0.27.0) Updates `google.golang.org/api` from 0.221.0 to 0.222.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.221.0...v0.222.0) --- updated-dependencies: - dependency-name: github.com/minio/minio-go/v7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 20 ++++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index b2bca4a4c9b..c6468d1bcf9 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/kopia/kopia -go 1.23 +go 1.23.0 toolchain go1.23.6 @@ -34,7 +34,7 @@ require ( github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 - github.com/minio/minio-go/v7 v7.0.86 + github.com/minio/minio-go/v7 v7.0.87 github.com/mocktools/go-smtp-mock/v2 v2.4.0 github.com/mxk/go-vss v1.2.0 github.com/natefinch/atomic v1.0.1 @@ -59,16 +59,16 @@ require ( go.opentelemetry.io/otel/trace v1.34.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.33.0 + golang.org/x/crypto v0.35.0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 golang.org/x/mod v0.23.0 golang.org/x/net v0.35.0 - golang.org/x/oauth2 v0.26.0 + golang.org/x/oauth2 v0.27.0 golang.org/x/sync v0.11.0 golang.org/x/sys v0.30.0 golang.org/x/term v0.29.0 golang.org/x/text v0.22.0 - google.golang.org/api v0.221.0 + google.golang.org/api v0.222.0 google.golang.org/grpc v1.70.0 google.golang.org/protobuf v1.36.5 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 @@ -146,6 +146,6 @@ require ( golang.org/x/time v0.10.0 // indirect google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 82d906b9e6b..477ef443f5c 100644 --- a/go.sum +++ b/go.sum @@ -233,8 +233,8 @@ github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.86 h1:DcgQ0AUjLJzRH6y/HrxiZ8CXarA70PAIufXHodP4s+k= -github.com/minio/minio-go/v7 v7.0.86/go.mod h1:VbfO4hYwUu3Of9WqGLBZ8vl3Hxnxo4ngxK4hzQDf4x4= +github.com/minio/minio-go/v7 v7.0.87 h1:nkr9x0u53PespfxfUqxP3UYWiE2a41gaofgNnC4Y8WQ= +github.com/minio/minio-go/v7 v7.0.87/go.mod h1:33+O8h0tO7pCeCWwBVa07RhVVfB/3vS4kEX7rwYKmIg= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/mocktools/go-smtp-mock/v2 v2.4.0 h1:u0ky0iyNW/LEMKAFRTsDivHyP8dHYxe/cV3FZC3rRjo= @@ -354,8 +354,8 @@ golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= @@ -380,8 +380,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= -golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= +golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -432,8 +432,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.221.0 h1:qzaJfLhDsbMeFee8zBRdt/Nc+xmOuafD/dbdgGfutOU= -google.golang.org/api v0.221.0/go.mod h1:7sOU2+TL4TxUTdbi0gWgAIg7tH5qBXxoyhtL+9x3biQ= +google.golang.org/api v0.222.0 h1:Aiewy7BKLCuq6cUCeOUrsAlzjXPqBkEeQ/iwGHVQa/4= +google.golang.org/api v0.222.0/go.mod h1:efZia3nXpWELrwMlN5vyQrD4GmJN1Vw0x68Et3r+a9c= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -443,8 +443,8 @@ google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b h1:FQtJ1MxbXoIIrZHZ33M+w5+dAP9o86rgpjoKr/ZmT7k= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= From 051316221fb6e8aadb1aff780ca1fbb1ec2b1e7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Mar 2025 22:26:51 -0800 Subject: [PATCH 028/206] build(deps): bump the github-actions group with 3 updates (#4431) Bumps the github-actions group with 3 updates: [actions/upload-artifact](https://github.com/actions/upload-artifact), [actions/download-artifact](https://github.com/actions/download-artifact) and [github/codeql-action](https://github.com/github/codeql-action). Updates `actions/upload-artifact` from 4.6.0 to 4.6.1 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08...4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1) Updates `actions/download-artifact` from 4.1.8 to 4.1.9 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/fa0a91b85d4f404e444e00e005971372dc801d16...cc203385981b70ca67e1cc392babf9cc229d5806) Updates `github/codeql-action` from 3.28.8 to 3.28.10 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/dd746615b3b9d728a6a37ca2045b68ca76d4841a...b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/code-coverage.yml | 2 +- .github/workflows/compat-test.yml | 2 +- .github/workflows/endurance-test.yml | 2 +- .github/workflows/htmlui-tests.yml | 2 +- .github/workflows/make.yml | 8 ++++---- .github/workflows/ossf-scorecard.yml | 4 ++-- .github/workflows/stress-test.yml | 2 +- .github/workflows/tests.yml | 2 +- .github/workflows/volume-shadow-copy-test.yml | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index 28d8c7e5211..8f29615193c 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -28,7 +28,7 @@ jobs: with: files: coverage.txt - name: Upload Logs - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/compat-test.yml b/.github/workflows/compat-test.yml index 4318c9943d6..99a778644c2 100644 --- a/.github/workflows/compat-test.yml +++ b/.github/workflows/compat-test.yml @@ -26,7 +26,7 @@ jobs: - name: Compat Test run: make compat-tests - name: Upload Logs - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/endurance-test.yml b/.github/workflows/endurance-test.yml index 7445aa16978..bc40731ab22 100644 --- a/.github/workflows/endurance-test.yml +++ b/.github/workflows/endurance-test.yml @@ -31,7 +31,7 @@ jobs: - name: Endurance Tests run: make endurance-tests - name: Upload Logs - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/htmlui-tests.yml b/.github/workflows/htmlui-tests.yml index c97540233e4..8ca110a223e 100644 --- a/.github/workflows/htmlui-tests.yml +++ b/.github/workflows/htmlui-tests.yml @@ -39,7 +39,7 @@ jobs: - name: Run Tests run: make htmlui-e2e-test - name: Upload Screenshots - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: path: .screenshots/**/*.png if-no-files-found: ignore diff --git a/.github/workflows/make.yml b/.github/workflows/make.yml index dc78795e436..2b92a1a0f5e 100644 --- a/.github/workflows/make.yml +++ b/.github/workflows/make.yml @@ -93,7 +93,7 @@ jobs: # macOS signing certificate (base64-encoded), used by Electron Builder MACOS_SIGNING_IDENTITY: ${{ secrets.MACOS_SIGNING_IDENTITY }} - name: Upload Kopia Artifacts - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: kopia-${{ matrix.os }} path: | @@ -114,7 +114,7 @@ jobs: dist/kopia-ui/*.yml if-no-files-found: ignore - name: Upload Kopia Binary - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: kopia_binaries-${{ matrix.os }} path: | @@ -137,13 +137,13 @@ jobs: - name: Install Linux-specific packages run: "sudo apt-get install -y createrepo-c" - name: Download Artifacts - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9 with: pattern: kopia-* merge-multiple: true path: dist - name: Download Kopia Binaries - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9 with: pattern: kopia_binaries-* merge-multiple: true diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index a2379c0b10b..8fd62d7f7cb 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -39,12 +39,12 @@ jobs: - # Upload the results to GitHub's code scanning dashboard. name: "Upload to results to dashboard" - uses: github/codeql-action/upload-sarif@dd746615b3b9d728a6a37ca2045b68ca76d4841a # v3.28.8 + uses: github/codeql-action/upload-sarif@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 with: sarif_file: results.sarif - name: "Upload analysis results as 'Job Artifact'" - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: SARIF file path: results.sarif diff --git a/.github/workflows/stress-test.yml b/.github/workflows/stress-test.yml index 5585859290d..ad9e2b450f2 100644 --- a/.github/workflows/stress-test.yml +++ b/.github/workflows/stress-test.yml @@ -30,7 +30,7 @@ jobs: - name: Stress Test run: make stress-test - name: Upload Logs - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 523f82ced9e..3ec3920251b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -58,7 +58,7 @@ jobs: - name: Integration Tests run: make -j2 ci-integration-tests - name: Upload Logs - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: logs-${{ matrix.os }} path: .logs/**/*.log diff --git a/.github/workflows/volume-shadow-copy-test.yml b/.github/workflows/volume-shadow-copy-test.yml index 88a1b5d672b..44805cd0375 100644 --- a/.github/workflows/volume-shadow-copy-test.yml +++ b/.github/workflows/volume-shadow-copy-test.yml @@ -34,7 +34,7 @@ jobs: - name: Non-Admin Test run: gsudo -i Medium make os-snapshot-tests - name: Upload Logs - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: logs path: .logs/**/*.log From b1f6dd7696a18dc1f1e0254a5a719ad6ee1a9f86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Mar 2025 22:27:42 -0800 Subject: [PATCH 029/206] build(deps): bump the docker group with 2 updates (#4432) Bumps the docker group with 2 updates: [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) and [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action). Updates `docker/setup-qemu-action` from 3.3.0 to 3.6.0 - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/53851d14592bedcffcf25ea515637cff71ef929a...29109295f81e9208d7d86ff1c6c12d2833863392) Updates `docker/setup-buildx-action` from 3.8.0 to 3.10.0 - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/6524bf65af31da8d45b59e8c27de4bd072b392f5...b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-minor dependency-group: docker - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor dependency-group: docker ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/make.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/make.yml b/.github/workflows/make.yml index 2b92a1a0f5e..23b2a117bdc 100644 --- a/.github/workflows/make.yml +++ b/.github/workflows/make.yml @@ -131,9 +131,9 @@ jobs: steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up QEMU - uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v3.3.0 + uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 + uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0 - name: Install Linux-specific packages run: "sudo apt-get install -y createrepo-c" - name: Download Artifacts From 692fde34fefee5ff1b387f539cd28b78dc05ccd6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Mar 2025 22:28:34 -0800 Subject: [PATCH 030/206] build(deps): bump codecov/codecov-action from 5.3.1 to 5.4.0 (#4434) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.3.1 to 5.4.0. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3...0565863a31f2c772f9f0395002a31e3f06189574) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/code-coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index 8f29615193c..bc68672f10e 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -24,7 +24,7 @@ jobs: - name: Run Tests run: make test-with-coverage - name: Upload Coverage - uses: codecov/codecov-action@13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3 # v5.3.1 + uses: codecov/codecov-action@0565863a31f2c772f9f0395002a31e3f06189574 # v5.4.0 with: files: coverage.txt - name: Upload Logs From 7a5c7a10beff24cc49b6cd3a14181f42e8e187c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 06:36:32 +0000 Subject: [PATCH 031/206] build(deps): bump ossf/scorecard-action from 2.4.0 to 2.4.1 (#4433) Bumps [ossf/scorecard-action](https://github.com/ossf/scorecard-action) from 2.4.0 to 2.4.1. - [Release notes](https://github.com/ossf/scorecard-action/releases) - [Changelog](https://github.com/ossf/scorecard-action/blob/main/RELEASE.md) - [Commits](https://github.com/ossf/scorecard-action/compare/62b2cac7ed8198b15735ed49ab1e5cf35480ba46...f49aabe0b5af0936a0987cfb85d86b75731b0186) --- updated-dependencies: - dependency-name: ossf/scorecard-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ossf-scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index 8fd62d7f7cb..fb1a20ffdfe 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -31,7 +31,7 @@ jobs: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0 + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 with: results_file: results.sarif results_format: sarif From eca5cf5c1f319a10ab4f9d1e0b92efb116c0f33d Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Sun, 2 Mar 2025 22:59:52 -0800 Subject: [PATCH 032/206] feat(ui): upgraded htmlui to the latest version (#4436) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c6468d1bcf9..b7fa4860613 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250214075053-af5935c9652b + github.com/kopia/htmluibuild v0.0.1-0.20250303064157-676b1b5bc735 github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index 477ef443f5c..aaac780c3a0 100644 --- a/go.sum +++ b/go.sum @@ -209,8 +209,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250214075053-af5935c9652b h1:JiINRjRb83kGroU/INrSvrpb5GDIZiV4bZe/Jg4geKQ= -github.com/kopia/htmluibuild v0.0.1-0.20250214075053-af5935c9652b/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250303064157-676b1b5bc735 h1:jhTarsFN8q9gglhSiFHapzVa2i2Wsg/zbm35MWchDYk= +github.com/kopia/htmluibuild v0.0.1-0.20250303064157-676b1b5bc735/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From 46f719e1abaf2150c1cb7e01c63574fa8571ff68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 00:18:51 +0000 Subject: [PATCH 033/206] build(deps): bump google.golang.org/api (#4437) --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index b7fa4860613..7e340533b85 100644 --- a/go.mod +++ b/go.mod @@ -68,7 +68,7 @@ require ( golang.org/x/sys v0.30.0 golang.org/x/term v0.29.0 golang.org/x/text v0.22.0 - google.golang.org/api v0.222.0 + google.golang.org/api v0.223.0 google.golang.org/grpc v1.70.0 google.golang.org/protobuf v1.36.5 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 @@ -78,7 +78,7 @@ require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect cel.dev/expr v0.19.0 // indirect cloud.google.com/go v0.116.0 // indirect - cloud.google.com/go/auth v0.14.1 // indirect + cloud.google.com/go/auth v0.15.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect cloud.google.com/go/iam v1.2.2 // indirect @@ -137,7 +137,7 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect go.opentelemetry.io/otel/metric v1.34.0 // indirect @@ -146,6 +146,6 @@ require ( golang.org/x/time v0.10.0 // indirect google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index aaac780c3a0..2bf1f37f73b 100644 --- a/go.sum +++ b/go.sum @@ -5,8 +5,8 @@ cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= -cloud.google.com/go/auth v0.14.1 h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0= -cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM= +cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps= +cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= @@ -321,8 +321,8 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/detectors/gcp v1.34.0 h1:JRxssobiPg23otYU5SbWtQC//snGVIM3Tx6QRzlQBao= go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= @@ -432,8 +432,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.222.0 h1:Aiewy7BKLCuq6cUCeOUrsAlzjXPqBkEeQ/iwGHVQa/4= -google.golang.org/api v0.222.0/go.mod h1:efZia3nXpWELrwMlN5vyQrD4GmJN1Vw0x68Et3r+a9c= +google.golang.org/api v0.223.0 h1:JUTaWEriXmEy5AhvdMgksGGPEFsYfUKaPEYXd4c3Wvc= +google.golang.org/api v0.223.0/go.mod h1:C+RS7Z+dDwds2b+zoAk5hN/eSfsiCn0UDrYof/M4d2M= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -443,8 +443,8 @@ google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b h1:FQtJ1MxbXoIIrZHZ33M+w5+dAP9o86rgpjoKr/ZmT7k= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 h1:DMTIbak9GhdaSxEjvVzAeNZvyc03I61duqNbnm3SU0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= From ca3e56baa88c85986e6beabaac471ebc4aa527af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Tue, 4 Mar 2025 16:53:16 -0800 Subject: [PATCH 034/206] build(deps): upgrade Go toolchain to 1.23.7 and x/net packages (#4438) Addresses CVE-2025-22870 and Go issue https://go.dev/issue/71984 * build(deps): upgrade Go toolchain to 1.27.7 and x/net packages * deps(go): upgrade x/net to v0.36.0 --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 7e340533b85..4b001eaed81 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/kopia/kopia go 1.23.0 -toolchain go1.23.6 +toolchain go1.23.7 require ( cloud.google.com/go/storage v1.50.0 @@ -62,7 +62,7 @@ require ( golang.org/x/crypto v0.35.0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 golang.org/x/mod v0.23.0 - golang.org/x/net v0.35.0 + golang.org/x/net v0.36.0 golang.org/x/oauth2 v0.27.0 golang.org/x/sync v0.11.0 golang.org/x/sys v0.30.0 diff --git a/go.sum b/go.sum index 2bf1f37f73b..c6534eeb4ec 100644 --- a/go.sum +++ b/go.sum @@ -377,8 +377,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= -golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= +golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= +golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= From 63fc857ac653aa01263ee9824ddff81f8b4b242e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Mar 2025 18:24:56 +0000 Subject: [PATCH 035/206] build(deps): bump github.com/chromedp/chromedp from 0.13.0 to 0.13.1 (#4443) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4b001eaed81..285e78ffbd8 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 github.com/chmduquesne/rollinghash v4.0.0+incompatible github.com/chromedp/cdproto v0.0.0-20250222051814-50c6cb17f10a - github.com/chromedp/chromedp v0.13.0 + github.com/chromedp/chromedp v0.13.1 github.com/coreos/go-systemd/v22 v22.5.0 github.com/dustinkirkland/golang-petname v0.0.0-20191129215211-8e5a1ed0cff0 github.com/edsrzf/mmap-go v1.2.0 diff --git a/go.sum b/go.sum index c6534eeb4ec..1271b872178 100644 --- a/go.sum +++ b/go.sum @@ -68,8 +68,8 @@ github.com/chmduquesne/rollinghash v4.0.0+incompatible h1:hnREQO+DXjqIw3rUTzWN7/ github.com/chmduquesne/rollinghash v4.0.0+incompatible/go.mod h1:Uc2I36RRfTAf7Dge82bi3RU0OQUmXT9iweIcPqvr8A0= github.com/chromedp/cdproto v0.0.0-20250222051814-50c6cb17f10a h1:EnkQjhmp/MxhDB4KOTssv6xC20aQ9rhFRCfGHTsTqmE= github.com/chromedp/cdproto v0.0.0-20250222051814-50c6cb17f10a/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= -github.com/chromedp/chromedp v0.13.0 h1:ydOqt7Y9LkwgutrX5C8bx49D+o63L6WcGUDyIoE0A5M= -github.com/chromedp/chromedp v0.13.0/go.mod h1:O3nO4Lno7iLoVX+7GdqQkehhKG7DtLf/zFRyJo0AhXY= +github.com/chromedp/chromedp v0.13.1 h1:FDh9CfaAt0w70gl69Hb69M/xgZrWuppH9AW22aGa+iU= +github.com/chromedp/chromedp v0.13.1/go.mod h1:O3nO4Lno7iLoVX+7GdqQkehhKG7DtLf/zFRyJo0AhXY= github.com/chromedp/sysutil v1.1.0 h1:PUFNv5EcprjqXZD9nJb9b/c9ibAbxiYo4exNWZyipwM= github.com/chromedp/sysutil v1.1.0/go.mod h1:WiThHUdltqCNKGc4gaU50XgYjwjYIhKWoHGPTUfWTJ8= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= From b1147307d97a734273c50102a26f9531bbb15cfe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Mar 2025 10:53:03 -0800 Subject: [PATCH 036/206] build(deps): bump the common-golang-dependencies group with 10 updates (#4441) Bumps the common-golang-dependencies group with 10 updates: | Package | From | To | | --- | --- | --- | | [golang.org/x/crypto](https://github.com/golang/crypto) | `0.35.0` | `0.36.0` | | [golang.org/x/mod](https://github.com/golang/mod) | `0.23.0` | `0.24.0` | | [golang.org/x/net](https://github.com/golang/net) | `0.36.0` | `0.37.0` | | [golang.org/x/oauth2](https://github.com/golang/oauth2) | `0.27.0` | `0.28.0` | | [golang.org/x/sync](https://github.com/golang/sync) | `0.11.0` | `0.12.0` | | [golang.org/x/sys](https://github.com/golang/sys) | `0.30.0` | `0.31.0` | | [golang.org/x/term](https://github.com/golang/term) | `0.29.0` | `0.30.0` | | [golang.org/x/text](https://github.com/golang/text) | `0.22.0` | `0.23.0` | | [google.golang.org/api](https://github.com/googleapis/google-api-go-client) | `0.223.0` | `0.224.0` | | [google.golang.org/grpc](https://github.com/grpc/grpc-go) | `1.70.0` | `1.71.0` | Updates `golang.org/x/crypto` from 0.35.0 to 0.36.0 - [Commits](https://github.com/golang/crypto/compare/v0.35.0...v0.36.0) Updates `golang.org/x/mod` from 0.23.0 to 0.24.0 - [Commits](https://github.com/golang/mod/compare/v0.23.0...v0.24.0) Updates `golang.org/x/net` from 0.36.0 to 0.37.0 - [Commits](https://github.com/golang/net/compare/v0.36.0...v0.37.0) Updates `golang.org/x/oauth2` from 0.27.0 to 0.28.0 - [Commits](https://github.com/golang/oauth2/compare/v0.27.0...v0.28.0) Updates `golang.org/x/sync` from 0.11.0 to 0.12.0 - [Commits](https://github.com/golang/sync/compare/v0.11.0...v0.12.0) Updates `golang.org/x/sys` from 0.30.0 to 0.31.0 - [Commits](https://github.com/golang/sys/compare/v0.30.0...v0.31.0) Updates `golang.org/x/term` from 0.29.0 to 0.30.0 - [Commits](https://github.com/golang/term/compare/v0.29.0...v0.30.0) Updates `golang.org/x/text` from 0.22.0 to 0.23.0 - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.22.0...v0.23.0) Updates `google.golang.org/api` from 0.223.0 to 0.224.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.223.0...v0.224.0) Updates `google.golang.org/grpc` from 1.70.0 to 1.71.0 - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.70.0...v1.71.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/mod dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/sync dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/term dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/text dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 33 ++++++++++++++------------- go.sum | 70 ++++++++++++++++++++++++++++++---------------------------- 2 files changed, 52 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index 285e78ffbd8..1828d448033 100644 --- a/go.mod +++ b/go.mod @@ -59,24 +59,24 @@ require ( go.opentelemetry.io/otel/trace v1.34.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.35.0 + golang.org/x/crypto v0.36.0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 - golang.org/x/mod v0.23.0 - golang.org/x/net v0.36.0 - golang.org/x/oauth2 v0.27.0 - golang.org/x/sync v0.11.0 - golang.org/x/sys v0.30.0 - golang.org/x/term v0.29.0 - golang.org/x/text v0.22.0 - google.golang.org/api v0.223.0 - google.golang.org/grpc v1.70.0 + golang.org/x/mod v0.24.0 + golang.org/x/net v0.37.0 + golang.org/x/oauth2 v0.28.0 + golang.org/x/sync v0.12.0 + golang.org/x/sys v0.31.0 + golang.org/x/term v0.30.0 + golang.org/x/text v0.23.0 + google.golang.org/api v0.224.0 + google.golang.org/grpc v1.71.0 google.golang.org/protobuf v1.36.5 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 ) require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect - cel.dev/expr v0.19.0 // indirect + cel.dev/expr v0.19.1 // indirect cloud.google.com/go v0.116.0 // indirect cloud.google.com/go/auth v0.15.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect @@ -91,15 +91,14 @@ require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chromedp/sysutil v1.1.0 // indirect - github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect + github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3 // indirect github.com/danieljoos/wincred v1.2.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/envoyproxy/go-control-plane v0.13.1 // indirect - github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect + github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/felixge/fgprof v0.9.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/frankban/quicktest v1.13.1 // indirect @@ -119,7 +118,7 @@ require ( github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect github.com/google/readahead v0.0.0-20161222183148-eaceba169032 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.5 // indirect github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect github.com/klauspost/cpuid/v2 v2.2.9 // indirect @@ -146,6 +145,6 @@ require ( golang.org/x/time v0.10.0 // indirect google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 1271b872178..c72f39fa1a7 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho= al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= -cel.dev/expr v0.19.0 h1:lXuo+nDhpyJSpWxpPVi5cPUwzKb+dsdOiw6IreM5yt0= -cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4= +cel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= @@ -60,8 +60,6 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= 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/chmduquesne/rollinghash v4.0.0+incompatible h1:hnREQO+DXjqIw3rUTzWN7/+Dpw+N5Um8zpKV0JOEgbo= @@ -77,8 +75,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= -github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3 h1:boJj011Hh+874zpIySeApCX4GeOjPl9qhRF3QuIZq+Q= +github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -99,11 +97,15 @@ github.com/edsrzf/mmap-go v1.2.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8E github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE= -github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= +github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= +github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= +github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= +github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= -github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= @@ -185,8 +187,8 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/enterprise-certificate-proxy v0.3.5 h1:VgzTY2jogw3xt39CusEnFJWm7rlsq5yL5q9XdLOuP5g= +github.com/googleapis/enterprise-certificate-proxy v0.3.5/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= @@ -354,8 +356,8 @@ golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= -golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= @@ -364,8 +366,8 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= -golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -377,18 +379,18 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= -golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= +golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= +golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= -golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= +golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -403,23 +405,23 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= -golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= +golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -432,8 +434,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.223.0 h1:JUTaWEriXmEy5AhvdMgksGGPEFsYfUKaPEYXd4c3Wvc= -google.golang.org/api v0.223.0/go.mod h1:C+RS7Z+dDwds2b+zoAk5hN/eSfsiCn0UDrYof/M4d2M= +google.golang.org/api v0.224.0 h1:Ir4UPtDsNiwIOHdExr3fAj4xZ42QjK7uQte3lORLJwU= +google.golang.org/api v0.224.0/go.mod h1:3V39my2xAGkodXy0vEqcEtkqgw2GtrFL5WuBZlCTCOQ= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -443,15 +445,15 @@ google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 h1:DMTIbak9GhdaSxEjvVzAeNZvyc03I61duqNbnm3SU0M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e h1:YA5lmSs3zc/5w+xsRcHqpETkaYyK63ivEPzNTcUUlSA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= -google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= +google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 8e4abbbafd36bbb41bb1d66c5cdaa8da2e27d9fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Mar 2025 19:14:41 +0000 Subject: [PATCH 037/206] build(deps): bump the telemetry-dependencies group with 5 updates (#4442) Bumps the telemetry-dependencies group with 5 updates: | Package | From | To | | --- | --- | --- | | [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) | `1.21.0` | `1.21.1` | | [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.34.0` | `1.35.0` | | [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://github.com/open-telemetry/opentelemetry-go) | `1.34.0` | `1.35.0` | | [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) | `1.34.0` | `1.35.0` | | [go.opentelemetry.io/otel/trace](https://github.com/open-telemetry/opentelemetry-go) | `1.34.0` | `1.35.0` | Updates `github.com/prometheus/client_golang` from 1.21.0 to 1.21.1 - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.21.0...v1.21.1) Updates `go.opentelemetry.io/otel` from 1.34.0 to 1.35.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.34.0...v1.35.0) Updates `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` from 1.34.0 to 1.35.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.34.0...v1.35.0) Updates `go.opentelemetry.io/otel/sdk` from 1.34.0 to 1.35.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.34.0...v1.35.0) Updates `go.opentelemetry.io/otel/trace` from 1.34.0 to 1.35.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.34.0...v1.35.0) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-patch dependency-group: telemetry-dependencies - dependency-name: go.opentelemetry.io/otel dependency-type: direct:production update-type: version-update:semver-minor dependency-group: telemetry-dependencies - dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc dependency-type: direct:production update-type: version-update:semver-minor dependency-group: telemetry-dependencies - dependency-name: go.opentelemetry.io/otel/sdk dependency-type: direct:production update-type: version-update:semver-minor dependency-group: telemetry-dependencies - dependency-name: go.opentelemetry.io/otel/trace dependency-type: direct:production update-type: version-update:semver-minor dependency-group: telemetry-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 18 +++++++++--------- go.sum | 36 ++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index 1828d448033..2cc31115066 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/pkg/profile v1.7.0 github.com/pkg/sftp v1.13.7 - github.com/prometheus/client_golang v1.21.0 + github.com/prometheus/client_golang v1.21.1 github.com/prometheus/client_model v0.6.1 github.com/prometheus/common v0.62.0 github.com/sanity-io/litter v1.5.8 @@ -53,10 +53,10 @@ require ( github.com/tg123/go-htpasswd v1.2.3 github.com/zalando/go-keyring v0.2.6 github.com/zeebo/blake3 v0.2.4 - go.opentelemetry.io/otel v1.34.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 - go.opentelemetry.io/otel/sdk v1.34.0 - go.opentelemetry.io/otel/trace v1.34.0 + go.opentelemetry.io/otel v1.35.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 + go.opentelemetry.io/otel/sdk v1.35.0 + go.opentelemetry.io/otel/trace v1.35.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 golang.org/x/crypto v0.36.0 @@ -120,7 +120,7 @@ require ( github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.5 // indirect github.com/googleapis/gax-go/v2 v2.14.1 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/kr/fs v0.1.0 // indirect github.com/minio/crc64nvme v1.0.1 // indirect @@ -138,13 +138,13 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect - go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect + go.opentelemetry.io/otel/metric v1.35.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect golang.org/x/time v0.10.0 // indirect google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index c72f39fa1a7..c9b4710a49a 100644 --- a/go.sum +++ b/go.sum @@ -193,8 +193,8 @@ github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrk github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= github.com/hanwen/go-fuse/v2 v2.7.2 h1:SbJP1sUP+n1UF8NXBA14BuojmTez+mDgOk0bC057HQw= github.com/hanwen/go-fuse/v2 v2.7.2/go.mod h1:ugNaD/iv5JYyS1Rcvi57Wz7/vrLQJo10mmketmoef48= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= @@ -268,8 +268,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= -github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= +github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= @@ -327,22 +327,22 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= -go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= -go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= +go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 h1:m639+BofXTvcY1q8CGs4ItwQarYtJPOWmVobfM1HpVI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0/go.mod h1:LjReUci/F4BUyv+y4dwnq3h/26iNOeC3wAIqgvTIZVo= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= -go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= -go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= +go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= +go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= -go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= -go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= +go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -443,8 +443,8 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= -google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= -google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= +google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a h1:nwKuGPlUAt+aR+pcrkfFRrTU1BVrSmYyYMxYbUIVHr0= +google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU= google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e h1:YA5lmSs3zc/5w+xsRcHqpETkaYyK63ivEPzNTcUUlSA= google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= From 9b68189d29efe4c8b548d67b3c7a37e4f65770ae Mon Sep 17 00:00:00 2001 From: Rohit-BM18 Date: Fri, 7 Mar 2025 07:41:14 -0500 Subject: [PATCH 038/206] feat(cli): compute snapshot diff stats (#4444) Added functionality to calculate aggregate statistics when comparing what's changed between snapshots using kopia diff Statistics collected during snapshot diff computation includes: - files added/removed/modified - dirs added/removed/modified - files/dirs with metadata changes but same underlying content (OID) Testing approach: Added a test for verifying stats collected when comparing two directories with the same objectID but metadata changes across snapshots (dir mode, dir mod time, dir owner, etc), expectation is all the appropriate dir stats fields are updated. Added another test for verifying stats collected when comparing two directories with similar file contents but the metadata for the files have changed between snapshots but content remains unchanged. Expectation is all the relevant file level stats fields are updated. Existing tests have been updated due to stats now being printed in addition to previous output. --- cli/command_diff.go | 16 +- internal/diff/diff.go | 167 ++++++++-- internal/diff/diff_test.go | 313 +++++++++++++++--- tests/end_to_end_test/restore_test.go | 2 +- tests/recovery/recovery_test/recovery_test.go | 2 +- 5 files changed, 433 insertions(+), 67 deletions(-) diff --git a/cli/command_diff.go b/cli/command_diff.go index 6e26a8d325c..c3d9f6e2b9f 100644 --- a/cli/command_diff.go +++ b/cli/command_diff.go @@ -2,6 +2,8 @@ package cli import ( "context" + "encoding/json" + "fmt" "strings" "github.com/pkg/errors" @@ -63,7 +65,19 @@ func (c *commandDiff) run(ctx context.Context, rep repo.Repository) error { } if isDir1 { - return errors.Wrap(d.Compare(ctx, ent1, ent2), "error comparing directories") + snapshotDiffStats, err := d.Compare(ctx, ent1, ent2) + if err != nil { + return errors.Wrap(err, "error comparing directories") + } + + b, err := json.Marshal(snapshotDiffStats) + if err != nil { + return errors.Wrap(err, "error marshaling computed snapshot diff stats") + } + + fmt.Fprintf(c.out.stdout(), "%s", b) //nolint:errcheck + + return nil } return errors.New("comparing files not implemented yet") diff --git a/internal/diff/diff.go b/internal/diff/diff.go index 59245bc6668..84cd6bb46d0 100644 --- a/internal/diff/diff.go +++ b/internal/diff/diff.go @@ -21,18 +21,47 @@ const dirMode = 0o700 var log = logging.Module("diff") +// EntryTypeStats accumulates specific stats for the snapshots being compared. +type EntryTypeStats struct { + Added uint32 `json:"added"` + Removed uint32 `json:"removed"` + Modified uint32 `json:"modified"` + + // aggregate stats + SameContentButDifferentMetadata uint32 `json:"sameContentButDifferentMetadata"` + + // stats categorized based on metadata + SameContentButDifferentMode uint32 `json:"sameContentButDifferentMode"` + SameContentButDifferentModificationTime uint32 `json:"sameContentButDifferentModificationTime"` + SameContentButDifferentUserOwner uint32 `json:"sameContentButDifferentUserOwner"` + SameContentButDifferentGroupOwner uint32 `json:"sameContentButDifferentGroupOwner"` +} + +// Stats accumulates stats between snapshots being compared. +type Stats struct { + FileEntries EntryTypeStats `json:"fileEntries"` + DirectoryEntries EntryTypeStats `json:"directoryEntries"` +} + // Comparer outputs diff information between two filesystems. type Comparer struct { - out io.Writer - tmpDir string - + stats Stats + out io.Writer + tmpDir string DiffCommand string DiffArguments []string } // Compare compares two filesystem entries and emits their diff information. -func (c *Comparer) Compare(ctx context.Context, e1, e2 fs.Entry) error { - return c.compareEntry(ctx, e1, e2, ".") +func (c *Comparer) Compare(ctx context.Context, e1, e2 fs.Entry) (Stats, error) { + c.stats = Stats{} + + err := c.compareEntry(ctx, e1, e2, ".") + if err != nil { + return c.stats, err + } + + return c.stats, errors.Wrap(err, "error comparing fs entries") } // Close removes all temporary files used by the comparer. @@ -76,23 +105,34 @@ func (c *Comparer) compareDirectories(ctx context.Context, dir1, dir2 fs.Directo //nolint:gocyclo func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path string) error { // see if we have the same object IDs, which implies identical objects, thanks to content-addressable-storage - if h1, ok := e1.(object.HasObjectID); ok { - if h2, ok := e2.(object.HasObjectID); ok { - if h1.ObjectID() == h2.ObjectID() { - log(ctx).Debugf("unchanged %v", path) - return nil + h1, e1HasObjectID := e1.(object.HasObjectID) + h2, e2HasObjectID := e2.(object.HasObjectID) + + if e1HasObjectID && e2HasObjectID { + if h1.ObjectID() == h2.ObjectID() { + if _, isDir := e1.(fs.Directory); isDir { + c.compareDirMetadataAndComputeStats(ctx, e1, e2, path) + } else { + c.compareFileMetadataAndComputeStats(ctx, e1, e2, path) } + + return nil } } if e1 == nil { if dir2, isDir2 := e2.(fs.Directory); isDir2 { c.output("added directory %v\n", path) + + c.stats.DirectoryEntries.Added++ + return c.compareDirectories(ctx, nil, dir2, path) } c.output("added file %v (%v bytes)\n", path, e2.Size()) + c.stats.FileEntries.Added++ + if f, ok := e2.(fs.File); ok { if err := c.compareFiles(ctx, nil, f, path); err != nil { return err @@ -105,11 +145,16 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin if e2 == nil { if dir1, isDir1 := e1.(fs.Directory); isDir1 { c.output("removed directory %v\n", path) + + c.stats.DirectoryEntries.Removed++ + return c.compareDirectories(ctx, dir1, nil, path) } c.output("removed file %v (%v bytes)\n", path, e1.Size()) + c.stats.FileEntries.Removed++ + if f, ok := e1.(fs.File); ok { if err := c.compareFiles(ctx, f, nil, path); err != nil { return err @@ -119,7 +164,7 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin return nil } - compareEntry(e1, e2, path, c.out) + c.compareEntryMetadata(e1, e2, path) dir1, isDir1 := e1.(fs.Directory) dir2, isDir2 := e2.(fs.Directory) @@ -137,6 +182,8 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin if isDir2 { // left is non-directory, right is a directory log(ctx).Infof("changed %v from non-directory to a directory", path) + c.output("changed %v from non-directory to a directory\n", path) + return nil } @@ -144,6 +191,8 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin if f2, ok := e2.(fs.File); ok { c.output("changed %v at %v (size %v -> %v)\n", path, e2.ModTime().String(), e1.Size(), e2.Size()) + c.stats.FileEntries.Modified++ + if err := c.compareFiles(ctx, f1, f2, path); err != nil { return err } @@ -153,18 +202,81 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin return nil } -func compareEntry(e1, e2 fs.Entry, fullpath string, out io.Writer) bool { +func (c *Comparer) compareDirMetadataAndComputeStats(ctx context.Context, e1, e2 fs.Entry, path string) { + // check for metadata changes pertaining to directories given that content hasn't changed and gather aggregate statistics + equal := true + + if m1, m2 := e1.Mode(), e2.Mode(); m1 != m2 { + equal = false + c.stats.DirectoryEntries.SameContentButDifferentMode++ + } + + if mt1, mt2 := e1.ModTime(), e2.ModTime(); !mt1.Equal(mt2) { + equal = false + c.stats.DirectoryEntries.SameContentButDifferentModificationTime++ + } + + o1, o2 := e1.Owner(), e2.Owner() + if o1.UserID != o2.UserID { + equal = false + c.stats.DirectoryEntries.SameContentButDifferentUserOwner++ + } + + if o1.GroupID != o2.GroupID { + equal = false + c.stats.DirectoryEntries.SameContentButDifferentGroupOwner++ + } + + if !equal { + c.stats.DirectoryEntries.SameContentButDifferentMetadata++ + + log(ctx).Debugf("content unchanged but metadata has been modified: %v", path) + } +} + +func (c *Comparer) compareFileMetadataAndComputeStats(ctx context.Context, e1, e2 fs.Entry, path string) { + // check for metadata changes pertaining to files given that content hasn't changed and gather aggregate statistics + equal := true + if m1, m2 := e1.Mode(), e2.Mode(); m1 != m2 { + equal = false + c.stats.FileEntries.SameContentButDifferentMode++ + } + + if mt1, mt2 := e1.ModTime(), e2.ModTime(); !mt1.Equal(mt2) { + equal = false + c.stats.FileEntries.SameContentButDifferentModificationTime++ + } + + o1, o2 := e1.Owner(), e2.Owner() + if o1.UserID != o2.UserID { + equal = false + c.stats.FileEntries.SameContentButDifferentUserOwner++ + } + + if o1.GroupID != o2.GroupID { + equal = false + c.stats.FileEntries.SameContentButDifferentGroupOwner++ + } + + if !equal { + c.stats.FileEntries.SameContentButDifferentMetadata++ + + log(ctx).Debugf("content unchanged but metadata has been modified: %v", path) + } +} + +func (c *Comparer) compareEntryMetadata(e1, e2 fs.Entry, fullpath string) bool { if e1 == e2 { // in particular e1 == nil && e2 == nil return true } if e1 == nil { - fmt.Fprintln(out, fullpath, "does not exist in source directory") //nolint:errcheck + c.output("%v does not exist in source directory\n", fullpath) return false } if e2 == nil { - fmt.Fprintln(out, fullpath, "does not exist in destination directory") //nolint:errcheck + c.output("%v does not exist in destination directory\n", fullpath) return false } @@ -173,32 +285,43 @@ func compareEntry(e1, e2 fs.Entry, fullpath string, out io.Writer) bool { if m1, m2 := e1.Mode(), e2.Mode(); m1 != m2 { equal = false - fmt.Fprintln(out, fullpath, "modes differ: ", m1, m2) //nolint:errcheck + c.output("%v modes differ: %v %v\n", fullpath, m1, m2) } if s1, s2 := e1.Size(), e2.Size(); s1 != s2 { equal = false - fmt.Fprintln(out, fullpath, "sizes differ: ", s1, s2) //nolint:errcheck + c.output("%v sizes differ: %v %v\n", fullpath, s1, s2) } if mt1, mt2 := e1.ModTime(), e2.ModTime(); !mt1.Equal(mt2) { equal = false - fmt.Fprintln(out, fullpath, "modification times differ: ", mt1, mt2) //nolint:errcheck + c.output("%v modification times differ: %v %v\n", fullpath, mt1, mt2) } o1, o2 := e1.Owner(), e2.Owner() if o1.UserID != o2.UserID { equal = false - fmt.Fprintln(out, fullpath, "owner users differ: ", o1.UserID, o2.UserID) //nolint:errcheck + c.output("%v owner users differ: %v %v\n", fullpath, o1.UserID, o2.UserID) } if o1.GroupID != o2.GroupID { equal = false - fmt.Fprintln(out, fullpath, "owner groups differ: ", o1.GroupID, o2.GroupID) //nolint:errcheck + c.output("%v owner groups differ: %v %v\n", fullpath, o1.GroupID, o2.GroupID) + } + + _, isDir1 := e1.(fs.Directory) + _, isDir2 := e2.(fs.Directory) + + if !equal { + if isDir1 && isDir2 { + c.stats.DirectoryEntries.Modified++ + } else { + c.stats.FileEntries.Modified++ + } } // don't compare filesystem boundaries (e1.Device()), it's pretty useless and is not stored in backups @@ -297,6 +420,12 @@ func downloadFile(ctx context.Context, f fs.File, fname string) error { return errors.Wrap(iocopy.JustCopy(dst, src), "error downloading file") } +// Stats returns aggregated statistics computed during snapshot comparison +// must be invoked after a call to Compare which populates ComparerStats struct. +func (c *Comparer) Stats() Stats { + return c.stats +} + func (c *Comparer) output(msg string, args ...interface{}) { fmt.Fprintf(c.out, msg, args...) //nolint:errcheck } diff --git a/internal/diff/diff_test.go b/internal/diff/diff_test.go index c360c295201..30deb20e290 100644 --- a/internal/diff/diff_test.go +++ b/internal/diff/diff_test.go @@ -13,6 +13,8 @@ import ( "github.com/kopia/kopia/fs" "github.com/kopia/kopia/internal/diff" + "github.com/kopia/kopia/repo/content/index" + "github.com/kopia/kopia/repo/object" ) var ( @@ -24,6 +26,8 @@ type testBaseEntry struct { modtime time.Time mode os.FileMode name string + owner fs.OwnerInfo + oid object.ID } func (f *testBaseEntry) IsDir() bool { return false } @@ -32,8 +36,9 @@ func (f *testBaseEntry) Close() {} func (f *testBaseEntry) Name() string { return f.name } func (f *testBaseEntry) ModTime() time.Time { return f.modtime } func (f *testBaseEntry) Sys() interface{} { return nil } -func (f *testBaseEntry) Owner() fs.OwnerInfo { return fs.OwnerInfo{UserID: 1000, GroupID: 1000} } +func (f *testBaseEntry) Owner() fs.OwnerInfo { return f.owner } func (f *testBaseEntry) Device() fs.DeviceInfo { return fs.DeviceInfo{Dev: 1} } +func (f *testBaseEntry) ObjectID() object.ID { return f.oid } func (f *testBaseEntry) Mode() os.FileMode { if f.mode == 0 { @@ -92,9 +97,18 @@ func TestCompareEmptyDirectories(t *testing.T) { ctx := context.Background() - dmodtime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) - dir1 := createTestDirectory("testDir1", dmodtime) - dir2 := createTestDirectory("testDir2", dmodtime) + dirModTime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + dirOwnerInfo := fs.OwnerInfo{UserID: 1000, GroupID: 1000} + dirMode := os.FileMode(0o777) + + cid, _ := index.IDFromHash("p", []byte("sdkjfn")) + dirObjectID1 := object.DirectObjectID(cid) + + cid, _ = index.IDFromHash("i", []byte("dfjlgn")) + dirObjectID2 := object.DirectObjectID(cid) + + dir1 := createTestDirectory("testDir1", dirModTime, dirOwnerInfo, dirMode, dirObjectID1) + dir2 := createTestDirectory("testDir2", dirModTime, dirOwnerInfo, dirMode, dirObjectID2) c, err := diff.NewComparer(&buf) require.NoError(t, err) @@ -103,9 +117,12 @@ func TestCompareEmptyDirectories(t *testing.T) { _ = c.Close() }) - err = c.Compare(ctx, dir1, dir2) + expectedStats := diff.Stats{} + actualStats, err := c.Compare(ctx, dir1, dir2) + require.NoError(t, err) require.Empty(t, buf.String()) + require.Equal(t, expectedStats, actualStats) } func TestCompareIdenticalDirectories(t *testing.T) { @@ -113,21 +130,41 @@ func TestCompareIdenticalDirectories(t *testing.T) { ctx := context.Background() - dmodtime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) - fmodtime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + dirModTime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + dirOwnerInfo := fs.OwnerInfo{UserID: 1000, GroupID: 1000} + dirMode := os.FileMode(0o777) + fileModTime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + + cid, _ := index.IDFromHash("p", []byte("sdkjfn")) + dirObjectID1 := object.DirectObjectID(cid) + + cid, _ = index.IDFromHash("i", []byte("dfjlgn")) + dirObjectID2 := object.DirectObjectID(cid) + + file1 := &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime, name: "file1.txt"}, content: "abcdefghij"} + file2 := &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"} + dir1 := createTestDirectory( "testDir1", - dmodtime, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file1.txt"}, content: "abcdefghij"}, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, + dirModTime, + dirOwnerInfo, + dirMode, + dirObjectID1, + file1, + file2, ) dir2 := createTestDirectory( "testDir2", - dmodtime, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file1.txt"}, content: "abcdefghij"}, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, + dirModTime, + dirOwnerInfo, + dirMode, + dirObjectID2, + file1, + file2, ) + expectedStats := diff.Stats{} + c, err := diff.NewComparer(&buf) require.NoError(t, err) @@ -135,9 +172,11 @@ func TestCompareIdenticalDirectories(t *testing.T) { _ = c.Close() }) - err = c.Compare(ctx, dir1, dir2) + actualStats, err := c.Compare(ctx, dir1, dir2) + require.NoError(t, err) require.Empty(t, buf.String()) + require.Equal(t, expectedStats, actualStats) } func TestCompareDifferentDirectories(t *testing.T) { @@ -145,19 +184,34 @@ func TestCompareDifferentDirectories(t *testing.T) { ctx := context.Background() - dmodtime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) - fmodtime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + dirModTime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + fileModTime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + dirOwnerInfo := fs.OwnerInfo{UserID: 1000, GroupID: 1000} + dirMode := os.FileMode(0o777) + + cid, _ := index.IDFromHash("p", []byte("sdkjfn")) + dirObjectID1 := object.DirectObjectID(cid) + + cid, _ = index.IDFromHash("i", []byte("dfjlgn")) + dirObjectID2 := object.DirectObjectID(cid) + dir1 := createTestDirectory( "testDir1", - dmodtime, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file1.txt"}, content: "abcdefghij"}, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, + dirModTime, + dirOwnerInfo, + dirMode, + dirObjectID1, + &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime, name: "file1.txt"}, content: "abcdefghij"}, + &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, ) dir2 := createTestDirectory( "testDir2", - dmodtime, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file3.txt"}, content: "abcdefghij1"}, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file4.txt"}, content: "klmnopqrstuvwxyz2"}, + dirModTime, + dirOwnerInfo, + dirMode, + dirObjectID2, + &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime, name: "file3.txt"}, content: "abcdefghij1"}, + &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime, name: "file4.txt"}, content: "klmnopqrstuvwxyz2"}, ) c, err := diff.NewComparer(&buf) @@ -167,12 +221,18 @@ func TestCompareDifferentDirectories(t *testing.T) { _ = c.Close() }) + expectedStats := diff.Stats{} + expectedStats.FileEntries.Added = 2 + expectedStats.FileEntries.Removed = 2 + expectedOutput := "added file ./file3.txt (11 bytes)\nadded file ./file4.txt (17 bytes)\n" + "removed file ./file1.txt (10 bytes)\n" + "removed file ./file2.txt (16 bytes)\n" - err = c.Compare(ctx, dir1, dir2) + actualStats, err := c.Compare(ctx, dir1, dir2) + require.NoError(t, err) + require.Equal(t, expectedStats, actualStats) require.Equal(t, expectedOutput, buf.String()) } @@ -181,22 +241,40 @@ func TestCompareDifferentDirectories_DirTimeDiff(t *testing.T) { ctx := context.Background() - dmodtime1 := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) - dmodtime2 := time.Date(2022, time.April, 12, 10, 30, 0, 0, time.UTC) - fmodtime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + fileModTime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + dirModTime1 := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + dirModTime2 := time.Date(2022, time.April, 12, 10, 30, 0, 0, time.UTC) + dirOwnerInfo := fs.OwnerInfo{UserID: 1000, GroupID: 1000} + dirMode := os.FileMode(0o777) + + cid, _ := index.IDFromHash("p", []byte("sdkjfn")) + dirObjectID1 := object.DirectObjectID(cid) + + cid, _ = index.IDFromHash("i", []byte("dfjlgn")) + dirObjectID2 := object.DirectObjectID(cid) + dir1 := createTestDirectory( "testDir1", - dmodtime1, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file1.txt"}, content: "abcdefghij"}, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, + dirModTime1, + dirOwnerInfo, + dirMode, + dirObjectID1, + &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime, name: "file1.txt"}, content: "abcdefghij"}, + &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, ) dir2 := createTestDirectory( "testDir2", - dmodtime2, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file1.txt"}, content: "abcdefghij"}, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, + dirModTime2, + dirOwnerInfo, + dirMode, + dirObjectID2, + &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime, name: "file1.txt"}, content: "abcdefghij"}, + &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime, name: "file2.txt"}, content: "klmnopqrstuvwxyz"}, ) + expectedStats := diff.Stats{} + expectedStats.DirectoryEntries.Modified = 1 + c, err := diff.NewComparer(&buf) require.NoError(t, err) @@ -204,10 +282,12 @@ func TestCompareDifferentDirectories_DirTimeDiff(t *testing.T) { _ = c.Close() }) - expectedOutput := ". modification times differ: 2023-04-12 10:30:00 +0000 UTC 2022-04-12 10:30:00 +0000 UTC\n" - err = c.Compare(ctx, dir1, dir2) + expectedOutput := ". modification times differ: 2023-04-12 10:30:00 +0000 UTC 2022-04-12 10:30:00 +0000 UTC\n" + actualStats, err := c.Compare(ctx, dir1, dir2) + require.NoError(t, err) require.Equal(t, expectedOutput, buf.String()) + require.Equal(t, expectedStats, actualStats) } func TestCompareDifferentDirectories_FileTimeDiff(t *testing.T) { @@ -215,18 +295,33 @@ func TestCompareDifferentDirectories_FileTimeDiff(t *testing.T) { ctx := context.Background() - fmodtime1 := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) - fmodtime2 := time.Date(2022, time.April, 12, 10, 30, 0, 0, time.UTC) - dmodtime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + fileModTime1 := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + fileModTime2 := time.Date(2022, time.April, 12, 10, 30, 0, 0, time.UTC) + dirModTime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + dirOwnerInfo := fs.OwnerInfo{UserID: 1000, GroupID: 1000} + dirMode := os.FileMode(0o700) + + cid, _ := index.IDFromHash("p", []byte("sdkjfn")) + OID1 := object.DirectObjectID(cid) + + cid, _ = index.IDFromHash("i", []byte("hvhjb")) + OID2 := object.DirectObjectID(cid) + dir1 := createTestDirectory( "testDir1", - dmodtime, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime1, name: "file1.txt"}, content: "abcdefghij"}, + dirModTime, + dirOwnerInfo, + dirMode, + OID1, + &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime1, name: "file1.txt", oid: OID1}, content: "abcdefghij"}, ) dir2 := createTestDirectory( "testDir2", - dmodtime, - &testFile{testBaseEntry: testBaseEntry{modtime: fmodtime2, name: "file1.txt"}, content: "abcdefghij"}, + dirModTime, + dirOwnerInfo, + dirMode, + OID2, + &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime2, name: "file1.txt", oid: OID2}, content: "abcdefghij"}, ) c, err := diff.NewComparer(&buf) @@ -236,13 +331,141 @@ func TestCompareDifferentDirectories_FileTimeDiff(t *testing.T) { _ = c.Close() }) - expectedOutput := "./file1.txt modification times differ: 2023-04-12 10:30:00 +0000 UTC 2022-04-12 10:30:00 +0000 UTC\n" + expectedStats := diff.Stats{} + expectedStats.FileEntries.Modified = 1 + + expectedOutput := "./file1.txt modification times differ: 2023-04-12 10:30:00 +0000 UTC 2022-04-12 10:30:00 +0000 UTC\n" + + actualStats, err := c.Compare(ctx, dir1, dir2) - err = c.Compare(ctx, dir1, dir2) require.NoError(t, err) require.Equal(t, expectedOutput, buf.String()) + require.Equal(t, expectedStats, actualStats) +} + +func TestCompareFileWithIdenticalContentsButDiffFileMetadata(t *testing.T) { + var buf bytes.Buffer + + ctx := context.Background() + + fileModTime1 := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + fileModTime2 := time.Date(2022, time.April, 12, 10, 30, 0, 0, time.UTC) + + fileOwnerinfo1 := fs.OwnerInfo{UserID: 1000, GroupID: 1000} + fileOwnerinfo2 := fs.OwnerInfo{UserID: 1001, GroupID: 1002} + + dirOwnerInfo := fs.OwnerInfo{UserID: 1000, GroupID: 1000} + dirMode := os.FileMode(0o777) + dirModTime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + + cid, _ := index.IDFromHash("p", []byte("sdkjfn")) + dirObjectID1 := object.DirectObjectID(cid) + + cid, _ = index.IDFromHash("i", []byte("dfjlgn")) + dirObjectID2 := object.DirectObjectID(cid) + + dir1 := createTestDirectory( + "testDir1", + dirModTime, + dirOwnerInfo, + dirMode, + dirObjectID1, + &testFile{testBaseEntry: testBaseEntry{name: "file1.txt", modtime: fileModTime1, oid: object.ID{}, owner: fileOwnerinfo1, mode: 0o700}, content: "abcdefghij"}, + ) + + dir2 := createTestDirectory( + "testDir2", + dirModTime, + dirOwnerInfo, + dirMode, + dirObjectID2, + &testFile{testBaseEntry: testBaseEntry{name: "file1.txt", modtime: fileModTime2, oid: object.ID{}, owner: fileOwnerinfo2, mode: 0o777}, content: "abcdefghij"}, + ) + + c, err := diff.NewComparer(&buf) + require.NoError(t, err) + + t.Cleanup(func() { + _ = c.Close() + }) + + expectedStats := diff.Stats{ + FileEntries: diff.EntryTypeStats{ + SameContentButDifferentMetadata: 1, + SameContentButDifferentModificationTime: 1, + SameContentButDifferentMode: 1, + SameContentButDifferentUserOwner: 1, + SameContentButDifferentGroupOwner: 1, + }, + } + + actualStats, err := c.Compare(ctx, dir1, dir2) + + require.NoError(t, err) + require.Empty(t, buf.String()) + require.Equal(t, expectedStats, actualStats) +} + +func TestCompareIdenticalDirectoriesWithDiffDirectoryMetadata(t *testing.T) { + var buf bytes.Buffer + + ctx := context.Background() + + dirModTime1 := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + dirModTime2 := time.Date(2022, time.April, 12, 10, 30, 0, 0, time.UTC) + + dirOwnerInfo1 := fs.OwnerInfo{UserID: 1000, GroupID: 1000} + dirOwnerInfo2 := fs.OwnerInfo{UserID: 1001, GroupID: 1002} + + dirMode1 := os.FileMode(0o644) + dirMode2 := os.FileMode(0o777) + + fileModTime := time.Date(2023, time.April, 12, 10, 30, 0, 0, time.UTC) + + cid, _ := index.IDFromHash("p", []byte("sdkjfn")) + dirObjectID := object.DirectObjectID(cid) + + dir1 := createTestDirectory( + "testDir1", + dirModTime1, + dirOwnerInfo1, + dirMode1, + dirObjectID, + &testFile{testBaseEntry: testBaseEntry{name: "file1.txt", modtime: fileModTime}, content: "abcdefghij"}, + ) + + dir2 := createTestDirectory( + "testDir2", + dirModTime2, + dirOwnerInfo2, + dirMode2, + dirObjectID, + &testFile{testBaseEntry: testBaseEntry{name: "file1.txt", modtime: fileModTime}, content: "abcdefghij"}, + ) + c, err := diff.NewComparer(&buf) + require.NoError(t, err) + + t.Cleanup(func() { + _ = c.Close() + }) + + expectedStats := diff.Stats{ + DirectoryEntries: diff.EntryTypeStats{ + SameContentButDifferentMetadata: 1, + SameContentButDifferentModificationTime: 1, + SameContentButDifferentMode: 1, + SameContentButDifferentUserOwner: 1, + SameContentButDifferentGroupOwner: 1, + }, + } + + actualStats, err := c.Compare(ctx, dir1, dir2) + + require.NoError(t, err) + require.Empty(t, buf.String()) + require.Equal(t, expectedStats, actualStats) } -func createTestDirectory(name string, modtime time.Time, files ...fs.Entry) *testDirectory { - return &testDirectory{testBaseEntry: testBaseEntry{modtime: modtime, name: name}, files: files} +func createTestDirectory(name string, modtime time.Time, owner fs.OwnerInfo, mode os.FileMode, oid object.ID, files ...fs.Entry) *testDirectory { + return &testDirectory{testBaseEntry: testBaseEntry{modtime: modtime, name: name, owner: owner, mode: mode, oid: oid}, files: files} } diff --git a/tests/end_to_end_test/restore_test.go b/tests/end_to_end_test/restore_test.go index db29ee6315d..cb699b2a9b6 100644 --- a/tests/end_to_end_test/restore_test.go +++ b/tests/end_to_end_test/restore_test.go @@ -196,7 +196,7 @@ func compareDirs(t *testing.T, source, restoreDir string) { require.NoError(t, err) cmp.DiffCommand = "cmp" - _ = cmp.Compare(ctx, s, r) + cmp.Compare(ctx, s, r) } } diff --git a/tests/recovery/recovery_test/recovery_test.go b/tests/recovery/recovery_test/recovery_test.go index 747c6d8219c..d588669be73 100644 --- a/tests/recovery/recovery_test/recovery_test.go +++ b/tests/recovery/recovery_test/recovery_test.go @@ -310,7 +310,7 @@ func CompareDirs(t *testing.T, source, destination string) { e2, err := localfs.NewEntry(destination) require.NoError(t, err) - err = c.Compare(ctx, e1, e2) + _, err = c.Compare(ctx, e1, e2) require.NoError(t, err) } From 51de24dcff72e50dbf51004543ef36fcb728f8ad Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Fri, 14 Mar 2025 15:48:31 -0700 Subject: [PATCH 039/206] refactor(snapshots): refactored uploader into separate package (#4450) --- cli/cli_progress.go | 16 ++-- cli/command_snapshot_create.go | 8 +- cli/command_snapshot_estimate.go | 12 +-- cli/command_snapshot_migrate.go | 9 ++- internal/repotesting/repotesting_test.go | 4 +- internal/server/api_estimate.go | 10 +-- internal/server/api_restore_test.go | 4 +- internal/server/api_snapshots_test.go | 6 +- internal/server/source_manager.go | 20 ++--- internal/serverapi/serverapi.go | 16 ++-- snapshot/snapshotfs/dir_manifest_builder.go | 4 + snapshot/snapshotfs/dir_rewriter.go | 2 +- snapshot/snapshotfs/dir_writer.go | 3 +- snapshot/snapshotfs/repofs.go | 3 + .../snapshotfs/snapshot_storage_stats_test.go | 3 +- .../snapshotfs/snapshot_tree_walker_test.go | 9 ++- snapshot/snapshotfs/snapshot_verifier_test.go | 3 +- .../source_directories_internal_test.go | 72 ++++++++++++++++++ .../snapshotfs/source_directories_test.go | 73 ++----------------- snapshot/snapshotmaintenance/helper_test.go | 4 +- .../checkpoint_registry.go | 5 +- .../checkpoint_registry_test.go | 5 +- snapshot/{snapshotfs => upload}/estimate.go | 2 +- .../{snapshotfs => upload}/estimate_test.go | 8 +- snapshot/{snapshotfs => upload}/upload.go | 48 ++++++------ .../{snapshotfs => upload}/upload_actions.go | 2 +- .../upload_estimator.go | 2 +- .../upload_estimator_test.go | 42 +++++------ .../upload_os_snapshot_nonwindows.go | 2 +- .../upload_os_snapshot_windows.go | 2 +- .../{snapshotfs => upload}/upload_progress.go | 22 +++--- .../{snapshotfs => upload}/upload_scan.go | 2 +- .../{snapshotfs => upload}/upload_test.go | 17 +++-- tests/tools/kopiaclient/kopiaclient.go | 3 +- 34 files changed, 237 insertions(+), 206 deletions(-) create mode 100644 snapshot/snapshotfs/source_directories_internal_test.go rename snapshot/{snapshotfs => upload}/checkpoint_registry.go (89%) rename snapshot/{snapshotfs => upload}/checkpoint_registry_test.go (95%) rename snapshot/{snapshotfs => upload}/estimate.go (99%) rename snapshot/{snapshotfs => upload}/estimate_test.go (87%) rename snapshot/{snapshotfs => upload}/upload.go (97%) rename snapshot/{snapshotfs => upload}/upload_actions.go (99%) rename snapshot/{snapshotfs => upload}/upload_estimator.go (99%) rename snapshot/{snapshotfs => upload}/upload_estimator_test.go (80%) rename snapshot/{snapshotfs => upload}/upload_os_snapshot_nonwindows.go (96%) rename snapshot/{snapshotfs => upload}/upload_os_snapshot_windows.go (99%) rename snapshot/{snapshotfs => upload}/upload_progress.go (95%) rename snapshot/{snapshotfs => upload}/upload_scan.go (97%) rename snapshot/{snapshotfs => upload}/upload_test.go (99%) diff --git a/cli/cli_progress.go b/cli/cli_progress.go index 7ff6904d350..0992e1cb9ee 100644 --- a/cli/cli_progress.go +++ b/cli/cli_progress.go @@ -13,7 +13,7 @@ import ( "github.com/kopia/kopia/internal/timetrack" "github.com/kopia/kopia/internal/units" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) const ( @@ -30,15 +30,15 @@ type progressFlags struct { func (p *progressFlags) setup(svc appServices, app *kingpin.Application) { app.Flag("progress", "Enable progress bar").Hidden().Default("true").BoolVar(&p.enableProgress) - app.Flag("progress-estimation-type", "Set type of estimation of the data to be snapshotted").Hidden().Default(snapshotfs.EstimationTypeClassic). - EnumVar(&p.progressEstimationType, snapshotfs.EstimationTypeClassic, snapshotfs.EstimationTypeRough, snapshotfs.EstimationTypeAdaptive) + app.Flag("progress-estimation-type", "Set type of estimation of the data to be snapshotted").Hidden().Default(upload.EstimationTypeClassic). + EnumVar(&p.progressEstimationType, upload.EstimationTypeClassic, upload.EstimationTypeRough, upload.EstimationTypeAdaptive) app.Flag("progress-update-interval", "How often to update progress information").Hidden().Default("300ms").DurationVar(&p.progressUpdateInterval) - app.Flag("adaptive-estimation-threshold", "Sets the threshold below which the classic estimation method will be used").Hidden().Default(strconv.FormatInt(snapshotfs.AdaptiveEstimationThreshold, 10)).Int64Var(&p.adaptiveEstimationThreshold) + app.Flag("adaptive-estimation-threshold", "Sets the threshold below which the classic estimation method will be used").Hidden().Default(strconv.FormatInt(upload.AdaptiveEstimationThreshold, 10)).Int64Var(&p.adaptiveEstimationThreshold) p.out.setup(svc) } type cliProgress struct { - snapshotfs.NullUploadProgress + upload.NullUploadProgress // all int64 must precede all int32 due to alignment requirements on ARM uploadedBytes atomic.Int64 @@ -270,11 +270,11 @@ func (p *cliProgress) Finish() { } } -func (p *cliProgress) EstimationParameters() snapshotfs.EstimationParameters { - return snapshotfs.EstimationParameters{ +func (p *cliProgress) EstimationParameters() upload.EstimationParameters { + return upload.EstimationParameters{ Type: p.progressEstimationType, AdaptiveThreshold: p.adaptiveEstimationThreshold, } } -var _ snapshotfs.UploadProgress = (*cliProgress)(nil) +var _ upload.Progress = (*cliProgress)(nil) diff --git a/cli/command_snapshot_create.go b/cli/command_snapshot_create.go index 5828684dd52..3fb87f53d8b 100644 --- a/cli/command_snapshot_create.go +++ b/cli/command_snapshot_create.go @@ -17,7 +17,7 @@ import ( "github.com/kopia/kopia/repo" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) const ( @@ -215,8 +215,8 @@ func validateStartEndTime(st, et string) error { return nil } -func (c *commandSnapshotCreate) setupUploader(rep repo.RepositoryWriter) *snapshotfs.Uploader { - u := snapshotfs.NewUploader(rep) +func (c *commandSnapshotCreate) setupUploader(rep repo.RepositoryWriter) *upload.Uploader { + u := upload.NewUploader(rep) u.MaxUploadBytes = c.snapshotCreateCheckpointUploadLimitMB << 20 //nolint:mnd if c.snapshotCreateForceEnableActions { @@ -275,7 +275,7 @@ func (c *commandSnapshotCreate) snapshotSingleSource( fsEntry fs.Entry, setManual bool, rep repo.RepositoryWriter, - u *snapshotfs.Uploader, + u *upload.Uploader, sourceInfo snapshot.SourceInfo, tags map[string]string, st *notifydata.MultiSnapshotStatus, diff --git a/cli/command_snapshot_estimate.go b/cli/command_snapshot_estimate.go index 7c0b4f79427..7be3fac9351 100644 --- a/cli/command_snapshot_estimate.go +++ b/cli/command_snapshot_estimate.go @@ -13,7 +13,7 @@ import ( "github.com/kopia/kopia/repo" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) type commandSnapshotEstimate struct { @@ -39,8 +39,8 @@ func (c *commandSnapshotEstimate) setup(svc appServices, parent commandParent) { type estimateProgress struct { stats snapshot.Stats - included snapshotfs.SampleBuckets - excluded snapshotfs.SampleBuckets + included upload.SampleBuckets + excluded upload.SampleBuckets excludedDirs []string quiet bool } @@ -59,7 +59,7 @@ func (ep *estimateProgress) Error(ctx context.Context, filename string, err erro } } -func (ep *estimateProgress) Stats(ctx context.Context, st *snapshot.Stats, included, excluded snapshotfs.SampleBuckets, excludedDirs []string, final bool) { +func (ep *estimateProgress) Stats(ctx context.Context, st *snapshot.Stats, included, excluded upload.SampleBuckets, excludedDirs []string, final bool) { _ = final ep.stats = *st @@ -99,7 +99,7 @@ func (c *commandSnapshotEstimate) run(ctx context.Context, rep repo.Repository) return errors.Wrapf(err, "error creating policy tree for %v", sourceInfo) } - if err := snapshotfs.Estimate(ctx, dir, policyTree, &ep, c.maxExamplesPerBucket); err != nil { + if err := upload.Estimate(ctx, dir, policyTree, &ep, c.maxExamplesPerBucket); err != nil { return errors.Wrap(err, "error estimating") } @@ -137,7 +137,7 @@ func (c *commandSnapshotEstimate) run(ctx context.Context, rep repo.Repository) return nil } -func (c *commandSnapshotEstimate) showBuckets(buckets snapshotfs.SampleBuckets, showFiles bool) { +func (c *commandSnapshotEstimate) showBuckets(buckets upload.SampleBuckets, showFiles bool) { for i, bucket := range buckets { if bucket.Count == 0 { continue diff --git a/cli/command_snapshot_migrate.go b/cli/command_snapshot_migrate.go index d44c455d948..eb04586bb90 100644 --- a/cli/command_snapshot_migrate.go +++ b/cli/command_snapshot_migrate.go @@ -12,6 +12,7 @@ import ( "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) type commandSnapshotMigrate struct { @@ -63,7 +64,7 @@ func (c *commandSnapshotMigrate) run(ctx context.Context, destRepo repo.Reposito wg sync.WaitGroup mu sync.Mutex canceled bool - activeUploaders = map[snapshot.SourceInfo]*snapshotfs.Uploader{} + activeUploaders = map[snapshot.SourceInfo]*upload.Uploader{} ) c.svc.getProgress().StartShared() @@ -104,7 +105,7 @@ func (c *commandSnapshotMigrate) run(ctx context.Context, destRepo repo.Reposito break } - uploader := snapshotfs.NewUploader(destRepo) + uploader := upload.NewUploader(destRepo) uploader.Progress = c.svc.getProgress() activeUploaders[s] = uploader mu.Unlock() @@ -220,7 +221,7 @@ func (c *commandSnapshotMigrate) findPreviousSnapshotManifestWithStartTime(ctx c return nil, nil } -func (c *commandSnapshotMigrate) migrateSingleSource(ctx context.Context, uploader *snapshotfs.Uploader, sourceRepo repo.Repository, destRepo repo.RepositoryWriter, s snapshot.SourceInfo) error { +func (c *commandSnapshotMigrate) migrateSingleSource(ctx context.Context, uploader *upload.Uploader, sourceRepo repo.Repository, destRepo repo.RepositoryWriter, s snapshot.SourceInfo) error { manifests, err := snapshot.ListSnapshotManifests(ctx, sourceRepo, &s, nil) if err != nil { return errors.Wrapf(err, "error listing snapshot manifests for %v", s) @@ -248,7 +249,7 @@ func (c *commandSnapshotMigrate) migrateSingleSource(ctx context.Context, upload return nil } -func (c *commandSnapshotMigrate) migrateSingleSourceSnapshot(ctx context.Context, uploader *snapshotfs.Uploader, sourceRepo repo.Repository, destRepo repo.RepositoryWriter, s snapshot.SourceInfo, m *snapshot.Manifest) error { +func (c *commandSnapshotMigrate) migrateSingleSourceSnapshot(ctx context.Context, uploader *upload.Uploader, sourceRepo repo.Repository, destRepo repo.RepositoryWriter, s snapshot.SourceInfo, m *snapshot.Manifest) error { if m.IncompleteReason != "" { log(ctx).Debugf("ignoring incomplete %v at %v", s, formatTimestamp(m.StartTime.ToTime())) return nil diff --git a/internal/repotesting/repotesting_test.go b/internal/repotesting/repotesting_test.go index 355bc9dd172..e4b6fc224a0 100644 --- a/internal/repotesting/repotesting_test.go +++ b/internal/repotesting/repotesting_test.go @@ -13,7 +13,7 @@ import ( "github.com/kopia/kopia/repo/content" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) func TestTimeFuncWiring(t *testing.T) { @@ -84,7 +84,7 @@ func TestTimeFuncWiring(t *testing.T) { sourceDir.AddFile("f1", []byte{1, 2, 3}, defaultPermissions) nt = ft.Advance(1 * time.Hour) - u := snapshotfs.NewUploader(env.RepositoryWriter) + u := upload.NewUploader(env.RepositoryWriter) policyTree := policy.BuildTree(nil, policy.DefaultPolicy) s1, err := u.Upload(ctx, sourceDir, policyTree, snapshot.SourceInfo{}) diff --git a/internal/server/api_estimate.go b/internal/server/api_estimate.go index bdd0339e9c4..2705638ca94 100644 --- a/internal/server/api_estimate.go +++ b/internal/server/api_estimate.go @@ -17,7 +17,7 @@ import ( "github.com/kopia/kopia/internal/units" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) type estimateTaskProgress struct { @@ -36,7 +36,7 @@ func (p estimateTaskProgress) Error(ctx context.Context, dirname string, err err } } -func (p estimateTaskProgress) Stats(ctx context.Context, st *snapshot.Stats, included, excluded snapshotfs.SampleBuckets, excludedDirs []string, final bool) { +func (p estimateTaskProgress) Stats(ctx context.Context, st *snapshot.Stats, included, excluded upload.SampleBuckets, excludedDirs []string, final bool) { _ = excludedDirs _ = final @@ -57,7 +57,7 @@ func (p estimateTaskProgress) Stats(ctx context.Context, st *snapshot.Stats, inc } } -func logBucketSamples(ctx context.Context, buckets snapshotfs.SampleBuckets, prefix string, showExamples bool) { +func logBucketSamples(ctx context.Context, buckets upload.SampleBuckets, prefix string, showExamples bool) { hasAny := false for i, bucket := range buckets { @@ -97,7 +97,7 @@ func logBucketSamples(ctx context.Context, buckets snapshotfs.SampleBuckets, pre } } -var _ snapshotfs.EstimateProgress = estimateTaskProgress{} +var _ upload.EstimateProgress = estimateTaskProgress{} func handleEstimate(ctx context.Context, rc requestContext) (interface{}, *apiError) { var req serverapi.EstimateRequest @@ -140,7 +140,7 @@ func handleEstimate(ctx context.Context, rc requestContext) (interface{}, *apiEr ctrl.OnCancel(cancel) - return snapshotfs.Estimate(estimatectx, dir, policyTree, estimateTaskProgress{ctrl}, req.MaxExamplesPerBucket) + return upload.Estimate(estimatectx, dir, policyTree, estimateTaskProgress{ctrl}, req.MaxExamplesPerBucket) }) taskID := <-taskIDChan diff --git a/internal/server/api_restore_test.go b/internal/server/api_restore_test.go index 2a1c01f3742..96f8bf9b11e 100644 --- a/internal/server/api_restore_test.go +++ b/internal/server/api_restore_test.go @@ -21,7 +21,7 @@ import ( "github.com/kopia/kopia/repo/manifest" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/restore" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) func TestRestoreSnapshots(t *testing.T) { @@ -32,7 +32,7 @@ func TestRestoreSnapshots(t *testing.T) { var id11 manifest.ID require.NoError(t, repo.WriteSession(ctx, env.Repository, repo.WriteSessionOptions{Purpose: "Test"}, func(ctx context.Context, w repo.RepositoryWriter) error { - u := snapshotfs.NewUploader(w) + u := upload.NewUploader(w) dir1 := mockfs.NewDirectory() diff --git a/internal/server/api_snapshots_test.go b/internal/server/api_snapshots_test.go index 914ac031db4..00977a1298f 100644 --- a/internal/server/api_snapshots_test.go +++ b/internal/server/api_snapshots_test.go @@ -14,7 +14,7 @@ import ( "github.com/kopia/kopia/repo" "github.com/kopia/kopia/repo/manifest" "github.com/kopia/kopia/snapshot" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) func TestListAndDeleteSnapshots(t *testing.T) { @@ -26,7 +26,7 @@ func TestListAndDeleteSnapshots(t *testing.T) { var id11, id12, id13, id14, id21 manifest.ID require.NoError(t, repo.WriteSession(ctx, env.Repository, repo.WriteSessionOptions{Purpose: "Test"}, func(ctx context.Context, w repo.RepositoryWriter) error { - u := snapshotfs.NewUploader(w) + u := upload.NewUploader(w) dir1 := mockfs.NewDirectory() @@ -187,7 +187,7 @@ func TestEditSnapshots(t *testing.T) { var id11 manifest.ID require.NoError(t, repo.WriteSession(ctx, env.Repository, repo.WriteSessionOptions{Purpose: "Test"}, func(ctx context.Context, w repo.RepositoryWriter) error { - u := snapshotfs.NewUploader(w) + u := upload.NewUploader(w) dir1 := mockfs.NewDirectory() diff --git a/internal/server/source_manager.go b/internal/server/source_manager.go index e50c09e5039..38f4364f648 100644 --- a/internal/server/source_manager.go +++ b/internal/server/source_manager.go @@ -17,7 +17,7 @@ import ( "github.com/kopia/kopia/repo" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) const ( @@ -40,7 +40,7 @@ type sourceManagerServerInterface interface { // - FAILED - inactive // - UPLOADING - uploading a snapshot. type sourceManager struct { - snapshotfs.NullUploadProgress + upload.NullUploadProgress server sourceManagerServerInterface @@ -52,7 +52,7 @@ type sourceManager struct { sourceMutex sync.RWMutex // +checklocks:sourceMutex - uploader *snapshotfs.Uploader + uploader *upload.Uploader // +checklocks:sourceMutex pol policy.SchedulingPolicy // +checklocks:sourceMutex @@ -74,7 +74,7 @@ type sourceManager struct { // +checklocks:sourceMutex isReadOnly bool - progress *snapshotfs.CountingUploadProgress + progress *upload.CountingUploadProgress } func (s *sourceManager) Status() *serverapi.SourceStatus { @@ -139,14 +139,14 @@ func (s *sourceManager) setNextSnapshotTime(t time.Time) { s.nextSnapshotTime = &t } -func (s *sourceManager) currentUploader() *snapshotfs.Uploader { +func (s *sourceManager) currentUploader() *upload.Uploader { s.sourceMutex.RLock() defer s.sourceMutex.RUnlock() return s.uploader } -func (s *sourceManager) setUploader(u *snapshotfs.Uploader) { +func (s *sourceManager) setUploader(u *upload.Uploader) { s.sourceMutex.Lock() defer s.sourceMutex.Unlock() @@ -351,7 +351,7 @@ func (s *sourceManager) snapshotInternal(ctx context.Context, ctrl uitask.Contro }, func(ctx context.Context, w repo.RepositoryWriter) error { log(ctx).Debugf("uploading %v", s.src) - u := snapshotfs.NewUploader(w) + u := upload.NewUploader(w) ctrl.OnCancel(u.Cancel) @@ -475,7 +475,7 @@ func (s *sourceManager) refreshStatus(ctx context.Context) { type uitaskProgress struct { nextReportTimeNanos atomic.Int64 - p *snapshotfs.CountingUploadProgress + p *upload.CountingUploadProgress ctrl uitask.Controller } @@ -586,7 +586,7 @@ func (t *uitaskProgress) EstimatedDataSize(fileCount, totalBytes int64) { } // EstimationParameters returns parameters to be used for estimation. -func (t *uitaskProgress) EstimationParameters() snapshotfs.EstimationParameters { +func (t *uitaskProgress) EstimationParameters() upload.EstimationParameters { return t.p.EstimationParameters() } @@ -598,7 +598,7 @@ func newSourceManager(src snapshot.SourceInfo, server *Server, rep repo.Reposito state: "UNKNOWN", closed: make(chan struct{}), snapshotRequests: make(chan struct{}, 1), - progress: &snapshotfs.CountingUploadProgress{}, + progress: &upload.CountingUploadProgress{}, } return m diff --git a/internal/serverapi/serverapi.go b/internal/serverapi/serverapi.go index 5c1c7a81e0d..d0adda34262 100644 --- a/internal/serverapi/serverapi.go +++ b/internal/serverapi/serverapi.go @@ -15,7 +15,7 @@ import ( "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" "github.com/kopia/kopia/snapshot/restore" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) // StatusResponse is the response of 'status' HTTP API command. @@ -52,13 +52,13 @@ type SourcesResponse struct { // SourceStatus describes the status of a single source. type SourceStatus struct { - Source snapshot.SourceInfo `json:"source"` - Status string `json:"status"` - SchedulingPolicy policy.SchedulingPolicy `json:"schedule"` - LastSnapshot *snapshot.Manifest `json:"lastSnapshot,omitempty"` - NextSnapshotTime *time.Time `json:"nextSnapshotTime,omitempty"` - UploadCounters *snapshotfs.UploadCounters `json:"upload,omitempty"` - CurrentTask string `json:"currentTask,omitempty"` + Source snapshot.SourceInfo `json:"source"` + Status string `json:"status"` + SchedulingPolicy policy.SchedulingPolicy `json:"schedule"` + LastSnapshot *snapshot.Manifest `json:"lastSnapshot,omitempty"` + NextSnapshotTime *time.Time `json:"nextSnapshotTime,omitempty"` + UploadCounters *upload.Counters `json:"upload,omitempty"` + CurrentTask string `json:"currentTask,omitempty"` } // PolicyListEntry describes single policy. diff --git a/snapshot/snapshotfs/dir_manifest_builder.go b/snapshot/snapshotfs/dir_manifest_builder.go index 875e0c25c2b..d89a6a82029 100644 --- a/snapshot/snapshotfs/dir_manifest_builder.go +++ b/snapshot/snapshotfs/dir_manifest_builder.go @@ -118,6 +118,10 @@ func (b *DirManifestBuilder) Build(dirModTime fs.UTCTimestamp, incompleteReason } } +func isDir(e *snapshot.DirEntry) bool { + return e.Type == snapshot.EntryTypeDirectory +} + func sortedTopFailures(entries []*fs.EntryWithError) []*fs.EntryWithError { sort.Slice(entries, func(i, j int) bool { return entries[i].EntryPath < entries[j].EntryPath diff --git a/snapshot/snapshotfs/dir_rewriter.go b/snapshot/snapshotfs/dir_rewriter.go index ab41d463f34..d550ac2fa0e 100644 --- a/snapshot/snapshotfs/dir_rewriter.go +++ b/snapshot/snapshotfs/dir_rewriter.go @@ -198,7 +198,7 @@ func (rw *DirRewriter) processDirectoryEntries(ctx context.Context, parentPath s dm := builder.Build(entry.ModTime, entry.DirSummary.IncompleteReason) - oid, err := writeDirManifest(ctx, rw.rep, entry.ObjectID.String(), dm, metadataComp) + oid, err := WriteDirManifest(ctx, rw.rep, entry.ObjectID.String(), dm, metadataComp) if err != nil { return nil, errors.Wrap(err, "unable to write directory manifest") } diff --git a/snapshot/snapshotfs/dir_writer.go b/snapshot/snapshotfs/dir_writer.go index 39556547a33..1b89706284a 100644 --- a/snapshot/snapshotfs/dir_writer.go +++ b/snapshot/snapshotfs/dir_writer.go @@ -12,7 +12,8 @@ import ( "github.com/kopia/kopia/snapshot" ) -func writeDirManifest(ctx context.Context, rep repo.RepositoryWriter, dirRelativePath string, dirManifest *snapshot.DirManifest, metadataComp compression.Name) (object.ID, error) { +// WriteDirManifest writes a directory manifest to the repository and returns the object ID. +func WriteDirManifest(ctx context.Context, rep repo.RepositoryWriter, dirRelativePath string, dirManifest *snapshot.DirManifest, metadataComp compression.Name) (object.ID, error) { writer := rep.NewObjectWriter(ctx, object.WriterOptions{ Description: "DIR:" + dirRelativePath, Prefix: objectIDPrefixDirectory, diff --git a/snapshot/snapshotfs/repofs.go b/snapshot/snapshotfs/repofs.go index cb99eaa653b..53dda798c16 100644 --- a/snapshot/snapshotfs/repofs.go +++ b/snapshot/snapshotfs/repofs.go @@ -12,10 +12,13 @@ import ( "github.com/kopia/kopia/fs" "github.com/kopia/kopia/repo" + "github.com/kopia/kopia/repo/logging" "github.com/kopia/kopia/repo/object" "github.com/kopia/kopia/snapshot" ) +var repoFSLog = logging.Module("repofs") + // Well-known object ID prefixes. const ( objectIDPrefixDirectory = "k" diff --git a/snapshot/snapshotfs/snapshot_storage_stats_test.go b/snapshot/snapshotfs/snapshot_storage_stats_test.go index 41aa98f34e5..67ae44ab573 100644 --- a/snapshot/snapshotfs/snapshot_storage_stats_test.go +++ b/snapshot/snapshotfs/snapshot_storage_stats_test.go @@ -9,6 +9,7 @@ import ( "github.com/kopia/kopia/internal/repotesting" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) func TestCalculateStorageStats(t *testing.T) { @@ -29,7 +30,7 @@ func TestCalculateStorageStats(t *testing.T) { Path: "/dummy", } - u := snapshotfs.NewUploader(env.RepositoryWriter) + u := upload.NewUploader(env.RepositoryWriter) man1, err := u.Upload(ctx, sourceRoot, nil, src) require.NoError(t, err) require.NoError(t, env.RepositoryWriter.Flush(ctx)) diff --git a/snapshot/snapshotfs/snapshot_tree_walker_test.go b/snapshot/snapshotfs/snapshot_tree_walker_test.go index e6951eb8288..cec5be72e23 100644 --- a/snapshot/snapshotfs/snapshot_tree_walker_test.go +++ b/snapshot/snapshotfs/snapshot_tree_walker_test.go @@ -14,6 +14,7 @@ import ( "github.com/kopia/kopia/repo/object" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) func TestSnapshotTreeWalker(t *testing.T) { @@ -46,7 +47,7 @@ func TestSnapshotTreeWalker(t *testing.T) { // root directory, 2 subdirectories + 2 unique files (dir1/file11 === dir2/file22) const numUniqueObjects = 5 - u := snapshotfs.NewUploader(env.RepositoryWriter) + u := upload.NewUploader(env.RepositoryWriter) man, err := u.Upload(ctx, sourceRoot, nil, snapshot.SourceInfo{}) require.NoError(t, err) @@ -110,7 +111,7 @@ func TestSnapshotTreeWalker_Errors(t *testing.T) { dir2.AddFile("file21", []byte{1, 2, 3, 4}, 0o644) dir2.AddFile("file22", []byte{1, 2, 3}, 0o644) // same content as dir11/file11 - u := snapshotfs.NewUploader(env.RepositoryWriter) + u := upload.NewUploader(env.RepositoryWriter) man, err := u.Upload(ctx, sourceRoot, nil, snapshot.SourceInfo{}) require.NoError(t, err) @@ -157,7 +158,7 @@ func TestSnapshotTreeWalker_MultipleErrors(t *testing.T) { dir2.AddFile("file21", []byte{1, 2, 3, 4}, 0o644) dir2.AddFile("file22", []byte{1, 2, 3, 4, 5}, 0o644) - u := snapshotfs.NewUploader(env.RepositoryWriter) + u := upload.NewUploader(env.RepositoryWriter) man, err := u.Upload(ctx, sourceRoot, nil, snapshot.SourceInfo{}) require.NoError(t, err) @@ -207,7 +208,7 @@ func TestSnapshotTreeWalker_MultipleErrorsSameOID(t *testing.T) { dir2.AddFile("file21", []byte{1, 2, 3, 4}, 0o644) dir2.AddFile("file22", []byte{1, 2, 3}, 0o644) // same content as dir11/file11 - u := snapshotfs.NewUploader(env.RepositoryWriter) + u := upload.NewUploader(env.RepositoryWriter) man, err := u.Upload(ctx, sourceRoot, nil, snapshot.SourceInfo{}) require.NoError(t, err) diff --git a/snapshot/snapshotfs/snapshot_verifier_test.go b/snapshot/snapshotfs/snapshot_verifier_test.go index 4b60cf5f11c..5febd437128 100644 --- a/snapshot/snapshotfs/snapshot_verifier_test.go +++ b/snapshot/snapshotfs/snapshot_verifier_test.go @@ -14,12 +14,13 @@ import ( "github.com/kopia/kopia/repo/blob" "github.com/kopia/kopia/repo/object" "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) func TestSnapshotVerifier(t *testing.T) { ctx, te := repotesting.NewEnvironment(t, repotesting.FormatNotImportant) - u := snapshotfs.NewUploader(te.RepositoryWriter) + u := upload.NewUploader(te.RepositoryWriter) dir1 := mockfs.NewDirectory() si1 := te.LocalPathSourceInfo("/dummy/path") diff --git a/snapshot/snapshotfs/source_directories_internal_test.go b/snapshot/snapshotfs/source_directories_internal_test.go new file mode 100644 index 00000000000..36962cb1f0d --- /dev/null +++ b/snapshot/snapshotfs/source_directories_internal_test.go @@ -0,0 +1,72 @@ +package snapshotfs + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSafeNameForMount(t *testing.T) { + cases := map[string]string{ + "/tmp/foo/bar": "tmp_foo_bar", + "/root": "root", + "/root/": "root", + "/": "__root", + "C:": "C", + "C:\\": "C", + "C:\\foo": "C_foo", + "C:\\foo/bar": "C_foo_bar", + "\\\\server\\root": "__server_root", + "\\\\server\\root\\": "__server_root", + "\\\\server\\root\\subdir": "__server_root_subdir", + "\\\\server\\root\\subdir/with/forward/slashes": "__server_root_subdir_with_forward_slashes", + "\\\\server\\root\\subdir/with\\mixed/slashes\\": "__server_root_subdir_with_mixed_slashes", + } + + for input, want := range cases { + assert.Equal(t, want, safeNameForMount(input), input) + } +} + +func TestDisambiguateSafeNames(t *testing.T) { + cases := []struct { + input map[string]string + want map[string]string + }{ + { + input: map[string]string{ + "c:/": "c", + "c:\\": "c", + "c:": "c", + "c": "c", + }, + want: map[string]string{ + "c": "c", + "c:": "c (2)", + "c:/": "c (3)", + "c:\\": "c (4)", + }, + }, + { + input: map[string]string{ + "c:/": "c", + "c:\\": "c", + "c:": "c", + "c": "c", + "c (2)": "c (2)", + }, + want: map[string]string{ + "c": "c", + "c (2)": "c (2)", + "c:": "c (2) (2)", + "c:/": "c (3)", + "c:\\": "c (4)", + }, + }, + } + + for _, tc := range cases { + require.Equal(t, tc.want, disambiguateSafeNames(tc.input)) + } +} diff --git a/snapshot/snapshotfs/source_directories_test.go b/snapshot/snapshotfs/source_directories_test.go index 70410fc85aa..44efccb072f 100644 --- a/snapshot/snapshotfs/source_directories_test.go +++ b/snapshot/snapshotfs/source_directories_test.go @@ -1,11 +1,10 @@ -package snapshotfs +package snapshotfs_test import ( "context" "testing" "time" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/kopia/kopia/fs" @@ -13,12 +12,14 @@ import ( "github.com/kopia/kopia/internal/repotesting" "github.com/kopia/kopia/repo" "github.com/kopia/kopia/snapshot" + "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) func TestAllSources(t *testing.T) { ctx, env := repotesting.NewEnvironment(t, repotesting.FormatNotImportant) - u := NewUploader(env.RepositoryWriter) + u := upload.NewUploader(env.RepositoryWriter) man, err := u.Upload(ctx, mockfs.NewDirectory(), nil, snapshot.SourceInfo{Host: "dummy", UserName: "dummy", Path: "dummy"}) require.NoError(t, err) @@ -48,7 +49,7 @@ func TestAllSources(t *testing.T) { mustWriteSnapshotManifest(ctx, t, env.RepositoryWriter, snapshot.SourceInfo{UserName: m.user, Host: m.host, Path: m.path}, fs.UTCTimestampFromTime(ts), man) } - as := AllSourcesEntry(env.RepositoryWriter) + as := snapshotfs.AllSourcesEntry(env.RepositoryWriter) gotNames := iterateAllNames(ctx, t, as, "") wantNames := map[string]struct{}{ "another-user@some-host/": {}, @@ -111,67 +112,3 @@ func mustWriteSnapshotManifest(ctx context.Context, t *testing.T, rep repo.Repos _, err := snapshot.SaveSnapshot(ctx, rep, man) require.NoError(t, err) } - -func TestSafeNameForMount(t *testing.T) { - cases := map[string]string{ - "/tmp/foo/bar": "tmp_foo_bar", - "/root": "root", - "/root/": "root", - "/": "__root", - "C:": "C", - "C:\\": "C", - "C:\\foo": "C_foo", - "C:\\foo/bar": "C_foo_bar", - "\\\\server\\root": "__server_root", - "\\\\server\\root\\": "__server_root", - "\\\\server\\root\\subdir": "__server_root_subdir", - "\\\\server\\root\\subdir/with/forward/slashes": "__server_root_subdir_with_forward_slashes", - "\\\\server\\root\\subdir/with\\mixed/slashes\\": "__server_root_subdir_with_mixed_slashes", - } - - for input, want := range cases { - assert.Equal(t, want, safeNameForMount(input), input) - } -} - -func TestDisambiguateSafeNames(t *testing.T) { - cases := []struct { - input map[string]string - want map[string]string - }{ - { - input: map[string]string{ - "c:/": "c", - "c:\\": "c", - "c:": "c", - "c": "c", - }, - want: map[string]string{ - "c": "c", - "c:": "c (2)", - "c:/": "c (3)", - "c:\\": "c (4)", - }, - }, - { - input: map[string]string{ - "c:/": "c", - "c:\\": "c", - "c:": "c", - "c": "c", - "c (2)": "c (2)", - }, - want: map[string]string{ - "c": "c", - "c (2)": "c (2)", - "c:": "c (2) (2)", - "c:/": "c (3)", - "c:\\": "c (4)", - }, - }, - } - - for _, tc := range cases { - require.Equal(t, tc.want, disambiguateSafeNames(tc.input)) - } -} diff --git a/snapshot/snapshotmaintenance/helper_test.go b/snapshot/snapshotmaintenance/helper_test.go index 0ff0e0978f8..0cb4a19a561 100644 --- a/snapshot/snapshotmaintenance/helper_test.go +++ b/snapshot/snapshotmaintenance/helper_test.go @@ -10,7 +10,7 @@ import ( "github.com/kopia/kopia/repo" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) // Create snapshots an FS entry. @@ -28,7 +28,7 @@ func createSnapshot(ctx context.Context, rep repo.RepositoryWriter, e fs.Entry, return nil, err } - u := snapshotfs.NewUploader(rep) + u := upload.NewUploader(rep) manifest, err := u.Upload(ctx, e, policyTree, si, previous...) if err != nil { diff --git a/snapshot/snapshotfs/checkpoint_registry.go b/snapshot/upload/checkpoint_registry.go similarity index 89% rename from snapshot/snapshotfs/checkpoint_registry.go rename to snapshot/upload/checkpoint_registry.go index 653842b5e5b..b84a53ada7f 100644 --- a/snapshot/snapshotfs/checkpoint_registry.go +++ b/snapshot/upload/checkpoint_registry.go @@ -1,4 +1,4 @@ -package snapshotfs +package upload import ( "sync" @@ -7,6 +7,7 @@ import ( "github.com/pkg/errors" "github.com/kopia/kopia/snapshot" + "github.com/kopia/kopia/snapshot/snapshotfs" ) // checkpointFunc is invoked when checkpoint occurs. The callback must checkpoint current state of @@ -41,7 +42,7 @@ func (r *checkpointRegistry) removeCheckpointCallback(entryName string) { // runCheckpoints invokes all registered checkpointers and adds results to the provided builder, while // randomizing file names for non-directory entries. this is to prevent the use of checkpointed objects // as authoritative on subsequent runs. -func (r *checkpointRegistry) runCheckpoints(checkpointBuilder *DirManifestBuilder) error { +func (r *checkpointRegistry) runCheckpoints(checkpointBuilder *snapshotfs.DirManifestBuilder) error { r.mu.Lock() defer r.mu.Unlock() diff --git a/snapshot/snapshotfs/checkpoint_registry_test.go b/snapshot/upload/checkpoint_registry_test.go similarity index 95% rename from snapshot/snapshotfs/checkpoint_registry_test.go rename to snapshot/upload/checkpoint_registry_test.go index 819eb850522..6492fe1d599 100644 --- a/snapshot/snapshotfs/checkpoint_registry_test.go +++ b/snapshot/upload/checkpoint_registry_test.go @@ -1,4 +1,4 @@ -package snapshotfs +package upload import ( "os" @@ -9,6 +9,7 @@ import ( "github.com/kopia/kopia/internal/clock" "github.com/kopia/kopia/internal/mockfs" "github.com/kopia/kopia/snapshot" + "github.com/kopia/kopia/snapshot/snapshotfs" ) func TestCheckpointRegistry(t *testing.T) { @@ -54,7 +55,7 @@ func TestCheckpointRegistry(t *testing.T) { cp.removeCheckpointCallback(f3.Name()) cp.removeCheckpointCallback(f3.Name()) - var dmb DirManifestBuilder + var dmb snapshotfs.DirManifestBuilder dmb.AddEntry(&snapshot.DirEntry{ Name: "pre-existing", diff --git a/snapshot/snapshotfs/estimate.go b/snapshot/upload/estimate.go similarity index 99% rename from snapshot/snapshotfs/estimate.go rename to snapshot/upload/estimate.go index 4950b15948d..38c83bb8eb9 100644 --- a/snapshot/snapshotfs/estimate.go +++ b/snapshot/upload/estimate.go @@ -1,4 +1,4 @@ -package snapshotfs +package upload import ( "context" diff --git a/snapshot/snapshotfs/estimate_test.go b/snapshot/upload/estimate_test.go similarity index 87% rename from snapshot/snapshotfs/estimate_test.go rename to snapshot/upload/estimate_test.go index d6e95e40535..c7302dfff64 100644 --- a/snapshot/snapshotfs/estimate_test.go +++ b/snapshot/upload/estimate_test.go @@ -1,4 +1,4 @@ -package snapshotfs_test +package upload_test import ( "context" @@ -13,7 +13,7 @@ import ( "github.com/kopia/kopia/internal/testlogging" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" ) type fakeProgress struct { @@ -31,7 +31,7 @@ func (p *fakeProgress) Error(context.Context, string, error, bool) {} func (p *fakeProgress) Stats( ctx context.Context, s *snapshot.Stats, - includedFiles, excludedFiles snapshotfs.SampleBuckets, + includedFiles, excludedFiles upload.SampleBuckets, excludedDirs []string, final bool, ) { @@ -62,6 +62,6 @@ func TestEstimate_SkipsStreamingDirectory(t *testing.T) { expectedErrors: 0, } - err := snapshotfs.Estimate(testlogging.Context(t), rootDir, policyTree, p, 1) + err := upload.Estimate(testlogging.Context(t), rootDir, policyTree, p, 1) require.NoError(t, err) } diff --git a/snapshot/snapshotfs/upload.go b/snapshot/upload/upload.go similarity index 97% rename from snapshot/snapshotfs/upload.go rename to snapshot/upload/upload.go index 87528864a42..ed39557ff80 100644 --- a/snapshot/snapshotfs/upload.go +++ b/snapshot/upload/upload.go @@ -1,4 +1,5 @@ -package snapshotfs +// Package upload manages snapshot uploads. +package upload import ( "bytes" @@ -30,15 +31,14 @@ import ( "github.com/kopia/kopia/repo/object" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" + "github.com/kopia/kopia/snapshot/snapshotfs" ) // DefaultCheckpointInterval is the default frequency of mid-upload checkpointing. const DefaultCheckpointInterval = 45 * time.Minute var ( - uploadLog = logging.Module("uploader") - repoFSLog = logging.Module("repofs") - + uploadLog = logging.Module("uploader") uploadTracer = otel.Tracer("upload") ) @@ -64,7 +64,7 @@ const ( type Uploader struct { totalWrittenBytes atomic.Int64 - Progress UploadProgress + Progress Progress // automatically cancel the Upload after certain number of bytes MaxUploadBytes int64 @@ -509,7 +509,7 @@ func (u *Uploader) uploadFileWithCheckpointing(ctx context.Context, relativePath // checkpointRoot invokes checkpoints on the provided registry and if a checkpoint entry was generated, // saves it in an incomplete snapshot manifest. func (u *Uploader) checkpointRoot(ctx context.Context, cp *checkpointRegistry, prototypeManifest *snapshot.Manifest) error { - var dmbCheckpoint DirManifestBuilder + var dmbCheckpoint snapshotfs.DirManifestBuilder if err := cp.runCheckpoints(&dmbCheckpoint); err != nil { return errors.Wrap(err, "running checkpointers") } @@ -586,7 +586,7 @@ func (u *Uploader) periodicallyCheckpoint(ctx context.Context, cp *checkpointReg // uploadDirWithCheckpointing uploads the specified Directory to the repository. func (u *Uploader) uploadDirWithCheckpointing(ctx context.Context, rootDir fs.Directory, policyTree *policy.Tree, previousDirs []fs.Directory, sourceInfo snapshot.SourceInfo) (*snapshot.DirEntry, error) { var ( - dmb DirManifestBuilder + dmb snapshotfs.DirManifestBuilder cp checkpointRegistry ) @@ -654,14 +654,10 @@ func rootCauseError(err error) error { return err } -func isDir(e *snapshot.DirEntry) bool { - return e.Type == snapshot.EntryTypeDirectory -} - func (u *Uploader) processChildren( ctx context.Context, parentDirCheckpointRegistry *checkpointRegistry, - parentDirBuilder *DirManifestBuilder, + parentDirBuilder *snapshotfs.DirManifestBuilder, localDirPathOrEmpty, relativePath string, dir fs.Directory, policyTree *policy.Tree, @@ -786,7 +782,7 @@ func (u *Uploader) effectiveParallelFileReads(pol *policy.Policy) int { func (u *Uploader) processDirectoryEntries( ctx context.Context, parentCheckpointRegistry *checkpointRegistry, - parentDirBuilder *DirManifestBuilder, + parentDirBuilder *snapshotfs.DirManifestBuilder, localDirPathOrEmpty string, dirRelativePath string, dir fs.Directory, @@ -837,7 +833,7 @@ func (u *Uploader) processSingle( ctx context.Context, entry fs.Entry, entryRelativePath string, - parentDirBuilder *DirManifestBuilder, + parentDirBuilder *snapshotfs.DirManifestBuilder, policyTree *policy.Tree, prevDirs []fs.Directory, localDirPathOrEmpty string, @@ -872,7 +868,7 @@ func (u *Uploader) processSingle( switch entry := entry.(type) { case fs.Directory: - childDirBuilder := &DirManifestBuilder{} + childDirBuilder := &snapshotfs.DirManifestBuilder{} childLocalDirPathOrEmpty := "" if localDirPathOrEmpty != "" { @@ -958,7 +954,17 @@ func (u *Uploader) processSingle( } //nolint:unparam -func (u *Uploader) processEntryUploadResult(ctx context.Context, de *snapshot.DirEntry, err error, entryRelativePath string, parentDirBuilder *DirManifestBuilder, isIgnored bool, logDetail policy.LogDetail, logMessage string, t0 timetrack.Timer) error { +func (u *Uploader) processEntryUploadResult( + ctx context.Context, + de *snapshot.DirEntry, + err error, + entryRelativePath string, + parentDirBuilder *snapshotfs.DirManifestBuilder, + isIgnored bool, + logDetail policy.LogDetail, + logMessage string, + t0 timetrack.Timer, +) error { if err != nil { u.reportErrorAndMaybeCancel(err, isIgnored, parentDirBuilder, entryRelativePath) } else { @@ -1098,7 +1104,7 @@ func uploadDirInternal( policyTree *policy.Tree, previousDirs []fs.Directory, localDirPathOrEmpty, dirRelativePath string, - thisDirBuilder *DirManifestBuilder, + thisDirBuilder *snapshotfs.DirManifestBuilder, thisCheckpointRegistry *checkpointRegistry, ) (resultDE *snapshot.DirEntry, resultErr error) { atomic.AddInt32(&u.stats.TotalDirectoryCount, 1) @@ -1162,7 +1168,7 @@ func uploadDirInternal( checkpointManifest := thisCheckpointBuilder.Build(fs.UTCTimestampFromTime(directory.ModTime()), IncompleteReasonCheckpoint) - oid, err := writeDirManifest(ctx, u.repo, dirRelativePath, checkpointManifest, metadataComp) + oid, err := snapshotfs.WriteDirManifest(ctx, u.repo, dirRelativePath, checkpointManifest, metadataComp) if err != nil { return nil, errors.Wrap(err, "error writing dir manifest") } @@ -1177,7 +1183,7 @@ func uploadDirInternal( dirManifest := thisDirBuilder.Build(fs.UTCTimestampFromTime(directory.ModTime()), u.incompleteReason()) - oid, err := writeDirManifest(ctx, u.repo, dirRelativePath, dirManifest, metadataComp) + oid, err := snapshotfs.WriteDirManifest(ctx, u.repo, dirRelativePath, dirManifest, metadataComp) if err != nil { return nil, errors.Wrapf(err, "error writing dir manifest: %v", directory.Name()) } @@ -1185,7 +1191,7 @@ func uploadDirInternal( return newDirEntryWithSummary(directory, oid, dirManifest.Summary) } -func (u *Uploader) reportErrorAndMaybeCancel(err error, isIgnored bool, dmb *DirManifestBuilder, entryRelativePath string) { +func (u *Uploader) reportErrorAndMaybeCancel(err error, isIgnored bool, dmb *snapshotfs.DirManifestBuilder, entryRelativePath string) { if u.IsCanceled() && errors.Is(err, errCanceled) { // already canceled, do not report another. return @@ -1227,7 +1233,7 @@ func (u *Uploader) maybeOpenDirectoryFromManifest(ctx context.Context, man *snap return nil } - ent := EntryFromDirEntry(u.repo, man.RootEntry) + ent := snapshotfs.EntryFromDirEntry(u.repo, man.RootEntry) dir, ok := ent.(fs.Directory) if !ok { diff --git a/snapshot/snapshotfs/upload_actions.go b/snapshot/upload/upload_actions.go similarity index 99% rename from snapshot/snapshotfs/upload_actions.go rename to snapshot/upload/upload_actions.go index 957245bbb0b..f8fdd03467e 100644 --- a/snapshot/snapshotfs/upload_actions.go +++ b/snapshot/upload/upload_actions.go @@ -1,4 +1,4 @@ -package snapshotfs +package upload import ( "bufio" diff --git a/snapshot/snapshotfs/upload_estimator.go b/snapshot/upload/upload_estimator.go similarity index 99% rename from snapshot/snapshotfs/upload_estimator.go rename to snapshot/upload/upload_estimator.go index ee3f3264782..f3b7c9e8c1d 100644 --- a/snapshot/snapshotfs/upload_estimator.go +++ b/snapshot/upload/upload_estimator.go @@ -1,4 +1,4 @@ -package snapshotfs +package upload import ( "context" diff --git a/snapshot/snapshotfs/upload_estimator_test.go b/snapshot/upload/upload_estimator_test.go similarity index 80% rename from snapshot/snapshotfs/upload_estimator_test.go rename to snapshot/upload/upload_estimator_test.go index 083b64839b9..737af4bb052 100644 --- a/snapshot/snapshotfs/upload_estimator_test.go +++ b/snapshot/upload/upload_estimator_test.go @@ -1,4 +1,4 @@ -package snapshotfs_test +package upload_test import ( "context" @@ -10,7 +10,7 @@ import ( vsi "github.com/kopia/kopia/internal/volumesizeinfo" "github.com/kopia/kopia/repo/logging" "github.com/kopia/kopia/snapshot/policy" - "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" "github.com/stretchr/testify/require" "go.uber.org/zap" @@ -56,15 +56,15 @@ func getMockLogger() logging.Logger { // withFailedVolumeSizeInfo returns EstimatorOption which ensures that GetVolumeSizeInfo will fail with provided error. // Purposed for tests. -func withFailedVolumeSizeInfo(err error) snapshotfs.EstimatorOption { - return snapshotfs.WithVolumeSizeInfoFn(func(_ string) (vsi.VolumeSizeInfo, error) { +func withFailedVolumeSizeInfo(err error) upload.EstimatorOption { + return upload.WithVolumeSizeInfoFn(func(_ string) (vsi.VolumeSizeInfo, error) { return vsi.VolumeSizeInfo{}, err }) } // withVolumeSizeInfo returns EstimatorOption which provides fake volume size. -func withVolumeSizeInfo(filesCount, usedFileSize, totalFileSize uint64) snapshotfs.EstimatorOption { - return snapshotfs.WithVolumeSizeInfoFn(func(_ string) (vsi.VolumeSizeInfo, error) { +func withVolumeSizeInfo(filesCount, usedFileSize, totalFileSize uint64) upload.EstimatorOption { + return upload.WithVolumeSizeInfoFn(func(_ string) (vsi.VolumeSizeInfo, error) { return vsi.VolumeSizeInfo{ TotalSize: totalFileSize, UsedSize: usedFileSize, @@ -76,7 +76,7 @@ func withVolumeSizeInfo(filesCount, usedFileSize, totalFileSize uint64) snapshot func expectSuccessfulEstimation( ctx context.Context, t *testing.T, - estimator snapshotfs.Estimator, + estimator upload.Estimator, expectedNumberOfFiles, expectedDataSize int64, ) { @@ -121,7 +121,7 @@ func TestUploadEstimator(t *testing.T) { logger := getMockLogger() policyTree := policy.BuildTree(nil, policy.DefaultPolicy) - estimator := snapshotfs.NewEstimator(dir1, policyTree, snapshotfs.EstimationParameters{Type: snapshotfs.EstimationTypeClassic}, logger) + estimator := upload.NewEstimator(dir1, policyTree, upload.EstimationParameters{Type: upload.EstimationTypeClassic}, logger) estimationCtx := context.Background() expectSuccessfulEstimation(estimationCtx, t, estimator, expectedNumberOfFiles, expectedDataSize) @@ -133,8 +133,8 @@ func TestUploadEstimator(t *testing.T) { expectedDataSize := int64(2000) policyTree := policy.BuildTree(nil, policy.DefaultPolicy) - estimator := snapshotfs.NewEstimator( - dir1, policyTree, snapshotfs.EstimationParameters{Type: snapshotfs.EstimationTypeRough}, logger, + estimator := upload.NewEstimator( + dir1, policyTree, upload.EstimationParameters{Type: upload.EstimationTypeRough}, logger, withVolumeSizeInfo(uint64(expectedNumberOfFiles), uint64(expectedDataSize), 3000)) estimationCtx := context.Background() @@ -145,8 +145,8 @@ func TestUploadEstimator(t *testing.T) { logger := getMockLogger() policyTree := policy.BuildTree(nil, policy.DefaultPolicy) - estimator := snapshotfs.NewEstimator( - dir1, policyTree, snapshotfs.EstimationParameters{Type: snapshotfs.EstimationTypeRough}, logger, + estimator := upload.NewEstimator( + dir1, policyTree, upload.EstimationParameters{Type: upload.EstimationTypeRough}, logger, withFailedVolumeSizeInfo(errSimulated)) estimationCtx := context.Background() @@ -162,9 +162,9 @@ func TestUploadEstimator(t *testing.T) { expectedDataSize := int64(2000) policyTree := policy.BuildTree(nil, policy.DefaultPolicy) - estimator := snapshotfs.NewEstimator( + estimator := upload.NewEstimator( dir1, policyTree, - snapshotfs.EstimationParameters{Type: snapshotfs.EstimationTypeAdaptive, AdaptiveThreshold: 100}, logger, + upload.EstimationParameters{Type: upload.EstimationTypeAdaptive, AdaptiveThreshold: 100}, logger, withVolumeSizeInfo(uint64(expectedNumberOfFiles), uint64(expectedDataSize), 3000)) estimationCtx := context.Background() @@ -175,9 +175,9 @@ func TestUploadEstimator(t *testing.T) { logger := getMockLogger() policyTree := policy.BuildTree(nil, policy.DefaultPolicy) - estimator := snapshotfs.NewEstimator( + estimator := upload.NewEstimator( dir1, policyTree, - snapshotfs.EstimationParameters{Type: snapshotfs.EstimationTypeAdaptive, AdaptiveThreshold: 10000}, logger, + upload.EstimationParameters{Type: upload.EstimationTypeAdaptive, AdaptiveThreshold: 10000}, logger, withVolumeSizeInfo(uint64(1000), uint64(2000), 3000)) estimationCtx := context.Background() @@ -188,8 +188,8 @@ func TestUploadEstimator(t *testing.T) { logger := getMockLogger() policyTree := policy.BuildTree(nil, policy.DefaultPolicy) - estimator := snapshotfs.NewEstimator( - dir1, policyTree, snapshotfs.EstimationParameters{Type: snapshotfs.EstimationTypeAdaptive, AdaptiveThreshold: 1}, logger, + estimator := upload.NewEstimator( + dir1, policyTree, upload.EstimationParameters{Type: upload.EstimationTypeAdaptive, AdaptiveThreshold: 1}, logger, withFailedVolumeSizeInfo(errSimulated)) estimationCtx := context.Background() @@ -214,7 +214,7 @@ func TestUploadEstimator(t *testing.T) { logger := getMockLogger() policyTree := policy.BuildTree(nil, policy.DefaultPolicy) - estimator := snapshotfs.NewEstimator(dir2, policyTree, snapshotfs.EstimationParameters{Type: snapshotfs.EstimationTypeRough}, logger) + estimator := upload.NewEstimator(dir2, policyTree, upload.EstimationParameters{Type: upload.EstimationTypeRough}, logger) // In case of canceled context, we should get zeroes instead of estimated numbers expectSuccessfulEstimation(testCtx, t, estimator, 0, 0) @@ -229,7 +229,7 @@ func TestUploadEstimator(t *testing.T) { logger := getMockLogger() policyTree := policy.BuildTree(nil, policy.DefaultPolicy) - estimator := snapshotfs.NewEstimator(dir2, policyTree, snapshotfs.EstimationParameters{Type: snapshotfs.EstimationTypeClassic}, logger) + estimator := upload.NewEstimator(dir2, policyTree, upload.EstimationParameters{Type: upload.EstimationTypeClassic}, logger) dir2.Subdir("d1").OnReaddir(func() { estimator.Cancel() @@ -248,7 +248,7 @@ func TestUploadEstimator(t *testing.T) { }, policy.DefaultPolicy) logger := getMockLogger() - estimator := snapshotfs.NewEstimator(dir1, policyTree, snapshotfs.EstimationParameters{Type: snapshotfs.EstimationTypeClassic}, logger) + estimator := upload.NewEstimator(dir1, policyTree, upload.EstimationParameters{Type: upload.EstimationTypeClassic}, logger) expectSuccessfulEstimation(context.Background(), t, estimator, expectedNumberOfFiles-1, expectedDataSize-int64(len(file1Content))) }) diff --git a/snapshot/snapshotfs/upload_os_snapshot_nonwindows.go b/snapshot/upload/upload_os_snapshot_nonwindows.go similarity index 96% rename from snapshot/snapshotfs/upload_os_snapshot_nonwindows.go rename to snapshot/upload/upload_os_snapshot_nonwindows.go index e0039e12da6..0216762c75a 100644 --- a/snapshot/snapshotfs/upload_os_snapshot_nonwindows.go +++ b/snapshot/upload/upload_os_snapshot_nonwindows.go @@ -1,7 +1,7 @@ //go:build !windows // +build !windows -package snapshotfs +package upload import ( "context" diff --git a/snapshot/snapshotfs/upload_os_snapshot_windows.go b/snapshot/upload/upload_os_snapshot_windows.go similarity index 99% rename from snapshot/snapshotfs/upload_os_snapshot_windows.go rename to snapshot/upload/upload_os_snapshot_windows.go index d9f11f39af3..14a62ebd973 100644 --- a/snapshot/snapshotfs/upload_os_snapshot_windows.go +++ b/snapshot/upload/upload_os_snapshot_windows.go @@ -1,4 +1,4 @@ -package snapshotfs +package upload import ( "context" diff --git a/snapshot/snapshotfs/upload_progress.go b/snapshot/upload/upload_progress.go similarity index 95% rename from snapshot/snapshotfs/upload_progress.go rename to snapshot/upload/upload_progress.go index 4f690f03c67..03561d0a57b 100644 --- a/snapshot/snapshotfs/upload_progress.go +++ b/snapshot/upload/upload_progress.go @@ -1,4 +1,4 @@ -package snapshotfs +package upload import ( "sync" @@ -26,10 +26,10 @@ type EstimationParameters struct { AdaptiveThreshold int64 } -// UploadProgress is invoked by uploader to report status of file and directory uploads. +// Progress is invoked by uploader to report status of file and directory uploads. // //nolint:interfacebloat -type UploadProgress interface { +type Progress interface { // Enabled returns true when progress is enabled, false otherwise. Enabled() bool @@ -163,10 +163,10 @@ func (p *NullUploadProgress) EstimationParameters() EstimationParameters { } } -var _ UploadProgress = (*NullUploadProgress)(nil) +var _ Progress = (*NullUploadProgress)(nil) -// UploadCounters represents a snapshot of upload counters. -type UploadCounters struct { +// Counters represents a snapshot of upload counters. +type Counters struct { // +checkatomic TotalCachedBytes int64 `json:"cachedBytes"` // +checkatomic @@ -206,13 +206,13 @@ type CountingUploadProgress struct { mu sync.Mutex - counters UploadCounters + counters Counters } // UploadStarted implements UploadProgress. func (p *CountingUploadProgress) UploadStarted() { // reset counters to all-zero values. - p.counters = UploadCounters{} + p.counters = Counters{} } // UploadedBytes implements UploadProgress. @@ -289,11 +289,11 @@ func (p *CountingUploadProgress) StartedDirectory(dirname string) { } // Snapshot captures current snapshot of the upload. -func (p *CountingUploadProgress) Snapshot() UploadCounters { +func (p *CountingUploadProgress) Snapshot() Counters { p.mu.Lock() defer p.mu.Unlock() - return UploadCounters{ + return Counters{ TotalCachedFiles: atomic.LoadInt32(&p.counters.TotalCachedFiles), TotalHashedFiles: atomic.LoadInt32(&p.counters.TotalHashedFiles), TotalCachedBytes: atomic.LoadInt64(&p.counters.TotalCachedBytes), @@ -342,4 +342,4 @@ func (p *CountingUploadProgress) UITaskCounters(final bool) map[string]uitask.Co return m } -var _ UploadProgress = (*CountingUploadProgress)(nil) +var _ Progress = (*CountingUploadProgress)(nil) diff --git a/snapshot/snapshotfs/upload_scan.go b/snapshot/upload/upload_scan.go similarity index 97% rename from snapshot/snapshotfs/upload_scan.go rename to snapshot/upload/upload_scan.go index 9874d656ff1..8b4e3986015 100644 --- a/snapshot/snapshotfs/upload_scan.go +++ b/snapshot/upload/upload_scan.go @@ -1,4 +1,4 @@ -package snapshotfs +package upload import ( "context" diff --git a/snapshot/snapshotfs/upload_test.go b/snapshot/upload/upload_test.go similarity index 99% rename from snapshot/snapshotfs/upload_test.go rename to snapshot/upload/upload_test.go index 588e53a06a2..0b3871a95b8 100644 --- a/snapshot/snapshotfs/upload_test.go +++ b/snapshot/upload/upload_test.go @@ -1,4 +1,4 @@ -package snapshotfs +package upload import ( "bytes" @@ -44,6 +44,7 @@ import ( "github.com/kopia/kopia/repo/object" "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" + "github.com/kopia/kopia/snapshot/snapshotfs" ) const ( @@ -284,7 +285,7 @@ func TestUploadMetadataCompression(t *testing.T) { t.Errorf("Upload error: %v", err) } - dir := EntryFromDirEntry(th.repo, s1.RootEntry).(fs.Directory) + dir := snapshotfs.EntryFromDirEntry(th.repo, s1.RootEntry).(fs.Directory) entries := findAllEntries(t, ctx, dir) verifyMetadataCompressor(t, ctx, th.repo, entries, compression.HeaderZstdFastest) }) @@ -305,7 +306,7 @@ func TestUploadMetadataCompression(t *testing.T) { t.Errorf("Upload error: %v", err) } - dir := EntryFromDirEntry(th.repo, s1.RootEntry).(fs.Directory) + dir := snapshotfs.EntryFromDirEntry(th.repo, s1.RootEntry).(fs.Directory) entries := findAllEntries(t, ctx, dir) verifyMetadataCompressor(t, ctx, th.repo, entries, content.NoCompression) }) @@ -326,7 +327,7 @@ func TestUploadMetadataCompression(t *testing.T) { t.Errorf("Upload error: %v", err) } - dir := EntryFromDirEntry(th.repo, s1.RootEntry).(fs.Directory) + dir := snapshotfs.EntryFromDirEntry(th.repo, s1.RootEntry).(fs.Directory) entries := findAllEntries(t, ctx, dir) verifyMetadataCompressor(t, ctx, th.repo, entries, compression.ByName["gzip"].HeaderID()) }) @@ -628,12 +629,12 @@ func TestUpload_SubDirectoryReadFailureSomeIgnoredNoFailFast(t *testing.T) { } type mockProgress struct { - UploadProgress + Progress finishedFileCheck func(string, error) } func (mp *mockProgress) FinishedFile(relativePath string, err error) { - defer mp.UploadProgress.FinishedFile(relativePath, err) + defer mp.Progress.FinishedFile(relativePath, err) mp.finishedFileCheck(relativePath, err) } @@ -657,7 +658,7 @@ func TestUpload_FinishedFileProgress(t *testing.T) { u := NewUploader(th.repo) u.ForceHashPercentage = 0 u.Progress = &mockProgress{ - UploadProgress: u.Progress, + Progress: u.Progress, finishedFileCheck: func(relativePath string, err error) { defer func() { mu.Lock() @@ -1280,7 +1281,7 @@ func TestParallelUploadOfLargeFiles(t *testing.T) { t.Logf("man: %v", man.RootObjectID()) - dir := EntryFromDirEntry(th.repo, man.RootEntry).(fs.Directory) + dir := snapshotfs.EntryFromDirEntry(th.repo, man.RootEntry).(fs.Directory) successCount := 0 diff --git a/tests/tools/kopiaclient/kopiaclient.go b/tests/tools/kopiaclient/kopiaclient.go index d1bc6b90217..184edcf0540 100644 --- a/tests/tools/kopiaclient/kopiaclient.go +++ b/tests/tools/kopiaclient/kopiaclient.go @@ -26,6 +26,7 @@ import ( "github.com/kopia/kopia/snapshot" "github.com/kopia/kopia/snapshot/policy" "github.com/kopia/kopia/snapshot/snapshotfs" + "github.com/kopia/kopia/snapshot/upload" "github.com/kopia/kopia/tests/robustness" ) @@ -112,7 +113,7 @@ func (kc *KopiaClient) SnapshotCreate(ctx context.Context, key string, val []byt } source := kc.getSourceForKeyVal(key, val) - u := snapshotfs.NewUploader(rw) + u := upload.NewUploader(rw) man, err := u.Upload(ctx, source, policyTree, si) if err != nil { From 02564155202bfdf0ec19d8669d63c43e5b9fa8f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 23:41:18 +0000 Subject: [PATCH 040/206] build(deps): bump github.com/prometheus/common (#4458) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2cc31115066..b1ee3ba9041 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/pkg/sftp v1.13.7 github.com/prometheus/client_golang v1.21.1 github.com/prometheus/client_model v0.6.1 - github.com/prometheus/common v0.62.0 + github.com/prometheus/common v0.63.0 github.com/sanity-io/litter v1.5.8 github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/stretchr/testify v1.10.0 diff --git a/go.sum b/go.sum index c9b4710a49a..7d96a9c67c0 100644 --- a/go.sum +++ b/go.sum @@ -273,8 +273,8 @@ github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuF github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= +github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= From 527ce016983ada6e607203839095141bc2294616 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:35:00 -0700 Subject: [PATCH 041/206] build(deps): bump github.com/golang-jwt/jwt/v5 from 5.2.1 to 5.2.2 (#4463) Bumps [github.com/golang-jwt/jwt/v5](https://github.com/golang-jwt/jwt) from 5.2.1 to 5.2.2. - [Release notes](https://github.com/golang-jwt/jwt/releases) - [Changelog](https://github.com/golang-jwt/jwt/blob/main/VERSION_HISTORY.md) - [Commits](https://github.com/golang-jwt/jwt/compare/v5.2.1...v5.2.2) --- updated-dependencies: - dependency-name: github.com/golang-jwt/jwt/v5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b1ee3ba9041..90069d99b2f 100644 --- a/go.mod +++ b/go.mod @@ -112,7 +112,7 @@ require ( github.com/gobwas/ws v1.4.0 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/golang-jwt/jwt/v5 v5.2.2 // indirect github.com/golang/glog v1.2.4 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect diff --git a/go.sum b/go.sum index 7d96a9c67c0..746995f8e68 100644 --- a/go.sum +++ b/go.sum @@ -142,8 +142,8 @@ github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= From aff54de1022b466241e8b7cb60f1503cac6f7505 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:39:52 -0700 Subject: [PATCH 042/206] build(deps): bump github.com/pkg/sftp from 1.13.7 to 1.13.8 (#4456) Bumps [github.com/pkg/sftp](https://github.com/pkg/sftp) from 1.13.7 to 1.13.8. - [Release notes](https://github.com/pkg/sftp/releases) - [Commits](https://github.com/pkg/sftp/compare/v1.13.7...v1.13.8) --- updated-dependencies: - dependency-name: github.com/pkg/sftp dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 90069d99b2f..72aa72155ba 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/pierrec/lz4 v2.6.1+incompatible github.com/pkg/errors v0.9.1 github.com/pkg/profile v1.7.0 - github.com/pkg/sftp v1.13.7 + github.com/pkg/sftp v1.13.8 github.com/prometheus/client_golang v1.21.1 github.com/prometheus/client_model v0.6.1 github.com/prometheus/common v0.63.0 diff --git a/go.sum b/go.sum index 746995f8e68..35ecb4dbc11 100644 --- a/go.sum +++ b/go.sum @@ -171,6 +171,7 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= @@ -259,8 +260,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= -github.com/pkg/sftp v1.13.7 h1:uv+I3nNJvlKZIQGSr8JVQLNHFU9YhhNpvC14Y6KgmSM= -github.com/pkg/sftp v1.13.7/go.mod h1:KMKI0t3T6hfA+lTR/ssZdunHo+uwq7ghoN09/FSu3DY= +github.com/pkg/sftp v1.13.8 h1:Xt7eJ/xqXv7s0VuzFw7JXhZj6Oc1zI6l4GK8KP9sFB0= +github.com/pkg/sftp v1.13.8/go.mod h1:DmvEkvKE2lshEeuo2JMp06yqcx9HVnR7e3zqQl42F3U= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -355,7 +356,10 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -366,6 +370,9 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -379,6 +386,9 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -389,6 +399,10 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -404,14 +418,21 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -419,7 +440,10 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= @@ -432,6 +456,8 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.224.0 h1:Ir4UPtDsNiwIOHdExr3fAj4xZ42QjK7uQte3lORLJwU= From 66004be14d09b18e43ca09ef18540742a31c3261 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 23:05:49 +0000 Subject: [PATCH 043/206] build(deps): bump github.com/golang-jwt/jwt/v4 from 4.5.1 to 4.5.2 (#4464) Bumps [github.com/golang-jwt/jwt/v4](https://github.com/golang-jwt/jwt) from 4.5.1 to 4.5.2. - [Release notes](https://github.com/golang-jwt/jwt/releases) - [Changelog](https://github.com/golang-jwt/jwt/blob/main/VERSION_HISTORY.md) - [Commits](https://github.com/golang-jwt/jwt/compare/v4.5.1...v4.5.2) --- updated-dependencies: - dependency-name: github.com/golang-jwt/jwt/v4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 72aa72155ba..1f368ad4ca0 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/fatih/color v1.18.0 github.com/foomo/htpasswd v0.0.0-20200116085101-e3a90e78da9c github.com/gofrs/flock v0.12.1 - github.com/golang-jwt/jwt/v4 v4.5.1 + github.com/golang-jwt/jwt/v4 v4.5.2 github.com/google/fswalker v0.3.3 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index 35ecb4dbc11..4fe11c36af1 100644 --- a/go.sum +++ b/go.sum @@ -140,8 +140,8 @@ github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= -github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= -github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= +github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= From b0341f50d874cd3ebee6361d96fdfaa29ceba48e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 23:15:59 +0000 Subject: [PATCH 044/206] build(deps): bump the common-golang-dependencies group across 1 directory with 4 updates (#4465) Bumps the common-golang-dependencies group with 4 updates in the / directory: [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go), [github.com/Azure/azure-sdk-for-go/sdk/azcore](https://github.com/Azure/azure-sdk-for-go), [github.com/minio/minio-go/v7](https://github.com/minio/minio-go) and [google.golang.org/api](https://github.com/googleapis/google-api-go-client). Updates `cloud.google.com/go/storage` from 1.50.0 to 1.51.0 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.50.0...spanner/v1.51.0) Updates `github.com/Azure/azure-sdk-for-go/sdk/azcore` from 1.17.0 to 1.17.1 - [Release notes](https://github.com/Azure/azure-sdk-for-go/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md) - [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azcore/v1.17.0...sdk/azcore/v1.17.1) Updates `github.com/minio/minio-go/v7` from 7.0.87 to 7.0.88 - [Release notes](https://github.com/minio/minio-go/releases) - [Commits](https://github.com/minio/minio-go/compare/v7.0.87...v7.0.88) Updates `google.golang.org/api` from 0.224.0 to 0.227.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.224.0...v0.227.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/storage dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azcore dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies - dependency-name: github.com/minio/minio-go/v7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 34 ++++++------- go.sum | 154 +++++++++++++++------------------------------------------ 2 files changed, 56 insertions(+), 132 deletions(-) diff --git a/go.mod b/go.mod index 1f368ad4ca0..8e706f7939c 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.23.0 toolchain go1.23.7 require ( - cloud.google.com/go/storage v1.50.0 - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 + cloud.google.com/go/storage v1.51.0 + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 github.com/alecthomas/kingpin/v2 v2.4.0 @@ -34,7 +34,7 @@ require ( github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 - github.com/minio/minio-go/v7 v7.0.87 + github.com/minio/minio-go/v7 v7.0.88 github.com/mocktools/go-smtp-mock/v2 v2.4.0 github.com/mxk/go-vss v1.2.0 github.com/natefinch/atomic v1.0.1 @@ -68,7 +68,7 @@ require ( golang.org/x/sys v0.31.0 golang.org/x/term v0.30.0 golang.org/x/text v0.23.0 - google.golang.org/api v0.224.0 + google.golang.org/api v0.227.0 google.golang.org/grpc v1.71.0 google.golang.org/protobuf v1.36.5 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 @@ -76,24 +76,24 @@ require ( require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect - cel.dev/expr v0.19.1 // indirect - cloud.google.com/go v0.116.0 // indirect + cel.dev/expr v0.19.2 // indirect + cloud.google.com/go v0.118.3 // indirect cloud.google.com/go/auth v0.15.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.2.2 // indirect - cloud.google.com/go/monitoring v1.21.2 // indirect + cloud.google.com/go/iam v1.4.1 // indirect + cloud.google.com/go/monitoring v1.24.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 // indirect github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chromedp/sysutil v1.1.0 // indirect - github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3 // indirect + github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 // indirect github.com/danieljoos/wincred v1.2.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -114,11 +114,10 @@ require ( github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/golang-jwt/jwt/v5 v5.2.2 // indirect github.com/golang/glog v1.2.4 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect github.com/google/readahead v0.0.0-20161222183148-eaceba169032 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.5 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/klauspost/cpuid/v2 v2.2.9 // indirect @@ -133,7 +132,6 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/rs/xid v1.6.0 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect - go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect @@ -142,9 +140,9 @@ require ( go.opentelemetry.io/otel/metric v1.35.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect - golang.org/x/time v0.10.0 // indirect - google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e // indirect + golang.org/x/time v0.11.0 // indirect + google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 4fe11c36af1..21dfee4890f 100644 --- a/go.sum +++ b/go.sum @@ -1,30 +1,29 @@ al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho= al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= -cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4= -cel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= -cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cel.dev/expr v0.19.2 h1:V354PbqIXr9IQdwy4SYA4xa0HXaWq1BUPAGzugBY5V4= +cel.dev/expr v0.19.2/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cloud.google.com/go v0.118.3 h1:jsypSnrE/w4mJysioGdMBg4MiW/hHx/sArFpaBWHdME= +cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc= cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps= cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= -cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= -cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= -cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= -cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= -cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= -cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= -cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= -cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= -cloud.google.com/go/storage v1.50.0 h1:3TbVkzTooBvnZsk7WaAQfOsNrdoM8QHusXA1cpk6QJs= -cloud.google.com/go/storage v1.50.0/go.mod h1:l7XeiD//vx5lfqE3RavfmU9yvk5Pp0Zhcv482poyafY= -cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= -cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ= +cloud.google.com/go/iam v1.4.1 h1:cFC25Nv+u5BkTR/BT1tXdoF2daiVbZ1RLx2eqfQ9RMM= +cloud.google.com/go/iam v1.4.1/go.mod h1:2vUEJpUG3Q9p2UdsyksaKpDzlwOrnMzS30isdReIcLM= +cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= +cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= +cloud.google.com/go/longrunning v0.6.5 h1:sD+t8DO8j4HKW4QfouCklg7ZC1qC4uzVZt8iz3uTW+Q= +cloud.google.com/go/longrunning v0.6.5/go.mod h1:Et04XK+0TTLKa5IPYryKf5DkpwImy6TluQ1QTLwlKmY= +cloud.google.com/go/monitoring v1.24.0 h1:csSKiCJ+WVRgNkRzzz3BPoGjFhjPY23ZTcaenToJxMM= +cloud.google.com/go/monitoring v1.24.0/go.mod h1:Bd1PRK5bmQBQNnuGwHBfUamAV1ys9049oEPHnn4pcsc= +cloud.google.com/go/storage v1.51.0 h1:ZVZ11zCiD7b3k+cH5lQs/qcNaoSz3U9I0jgwVzqDlCw= +cloud.google.com/go/storage v1.51.0/go.mod h1:YEJfu/Ki3i5oHC/7jyTgsGZwdQ8P9hqMqvpi5kRKGgc= +cloud.google.com/go/trace v1.11.3 h1:c+I4YFjxRQjvAhRmSsmjpASUKq88chOX854ied0K/pE= +cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w+dgQ06WJtEcbQG/8J7BB6hnCr4= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= @@ -39,18 +38,17 @@ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 h1:H5xDQaE3XowWfhZRUpnfC+rGZMEVoSiji+b+/HFAPU4= github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/GehirnInc/crypt v0.0.0-20190301055215-6c0105aabd46/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo= github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 h1:IEjq88XO4PuBDcvmjQJcQGg+w+UaafSy8G5Kcb5tBhI= github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5/go.mod h1:exZ0C/1emQJAw5tHOaUDyY1ycttqBAPcxuzf7QbY6ec= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= @@ -59,7 +57,6 @@ 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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 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/chmduquesne/rollinghash v4.0.0+incompatible h1:hnREQO+DXjqIw3rUTzWN7/+Dpw+N5Um8zpKV0JOEgbo= @@ -73,10 +70,8 @@ github.com/chromedp/sysutil v1.1.0/go.mod h1:WiThHUdltqCNKGc4gaU50XgYjwjYIhKWoHG github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3 h1:boJj011Hh+874zpIySeApCX4GeOjPl9qhRF3QuIZq+Q= -github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 h1:Om6kYQYDUk5wWbT0t0q6pvyM49i9XZAv9dDrkDA7gjk= +github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -94,16 +89,12 @@ github.com/dustinkirkland/golang-petname v0.0.0-20191129215211-8e5a1ed0cff0 h1:9 github.com/dustinkirkland/golang-petname v0.0.0-20191129215211-8e5a1ed0cff0/go.mod h1:V+Qd57rJe8gd4eiGzZyg4h54VLHmYVVw54iMnlAMrF8= github.com/edsrzf/mmap-go v1.2.0 h1:hXLYlkbaPzt1SaQk+anYwKSRNhufIDCchSPkUD6dD84= github.com/edsrzf/mmap-go v1.2.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -144,32 +135,12 @@ github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXe github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/fswalker v0.3.3 h1:K2+d6cb3vNFjquVPRObIY+QaXJ6cbleVV6yZWLzkkQ8= github.com/google/fswalker v0.3.3/go.mod h1:9upMSscEE8oRi0WJ0rXZZYya1DmgUtJFhXAw7KNS3c4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -185,11 +156,10 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.5 h1:VgzTY2jogw3xt39CusEnFJWm7rlsq5yL5q9XdLOuP5g= -github.com/googleapis/enterprise-certificate-proxy v0.3.5/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= @@ -236,8 +206,8 @@ github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.87 h1:nkr9x0u53PespfxfUqxP3UYWiE2a41gaofgNnC4Y8WQ= -github.com/minio/minio-go/v7 v7.0.87/go.mod h1:33+O8h0tO7pCeCWwBVa07RhVVfB/3vS4kEX7rwYKmIg= +github.com/minio/minio-go/v7 v7.0.88 h1:v8MoIJjwYxOkehp+eiLIuvXk87P2raUtoU5klrAAshs= +github.com/minio/minio-go/v7 v7.0.88/go.mod h1:33+O8h0tO7pCeCWwBVa07RhVVfB/3vS4kEX7rwYKmIg= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/mocktools/go-smtp-mock/v2 v2.4.0 h1:u0ky0iyNW/LEMKAFRTsDivHyP8dHYxe/cV3FZC3rRjo= @@ -271,7 +241,6 @@ github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74 github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= @@ -298,7 +267,6 @@ github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRci github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= @@ -318,8 +286,6 @@ github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI= github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE= github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/detectors/gcp v1.34.0 h1:JRxssobiPg23otYU5SbWtQC//snGVIM3Tx6QRzlQBao= @@ -354,7 +320,6 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= @@ -362,12 +327,8 @@ golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -375,13 +336,8 @@ golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -391,11 +347,8 @@ golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -405,10 +358,8 @@ golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -446,13 +397,9 @@ golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= -golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= -golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= +golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= @@ -460,35 +407,16 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.224.0 h1:Ir4UPtDsNiwIOHdExr3fAj4xZ42QjK7uQte3lORLJwU= -google.golang.org/api v0.224.0/go.mod h1:3V39my2xAGkodXy0vEqcEtkqgw2GtrFL5WuBZlCTCOQ= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= -google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= -google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a h1:nwKuGPlUAt+aR+pcrkfFRrTU1BVrSmYyYMxYbUIVHr0= -google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e h1:YA5lmSs3zc/5w+xsRcHqpETkaYyK63ivEPzNTcUUlSA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/api v0.227.0 h1:QvIHF9IuyG6d6ReE+BNd11kIB8hZvjN8Z5xY5t21zYc= +google.golang.org/api v0.227.0/go.mod h1:EIpaG6MbTgQarWF5xJvX0eOJPK9n/5D4Bynb9j2HXvQ= +google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE= +google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1:iK2jbkWL86DXjEx0qiHcRE9dE4/Ahua5k6V8OWFb//c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -502,5 +430,3 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From c4ebba0ef92b971d625381ababcc0d78ba3ca0fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 01:07:50 +0000 Subject: [PATCH 045/206] build(deps): bump github.com/chromedp/chromedp from 0.13.1 to 0.13.3 (#4468) --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 8e706f7939c..50926919805 100644 --- a/go.mod +++ b/go.mod @@ -12,8 +12,8 @@ require ( github.com/alecthomas/kingpin/v2 v2.4.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 github.com/chmduquesne/rollinghash v4.0.0+incompatible - github.com/chromedp/cdproto v0.0.0-20250222051814-50c6cb17f10a - github.com/chromedp/chromedp v0.13.1 + github.com/chromedp/cdproto v0.0.0-20250319231242-a755498943c8 + github.com/chromedp/chromedp v0.13.3 github.com/coreos/go-systemd/v22 v22.5.0 github.com/dustinkirkland/golang-petname v0.0.0-20191129215211-8e5a1ed0cff0 github.com/edsrzf/mmap-go v1.2.0 diff --git a/go.sum b/go.sum index 21dfee4890f..34d7f685dad 100644 --- a/go.sum +++ b/go.sum @@ -61,10 +61,10 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chmduquesne/rollinghash v4.0.0+incompatible h1:hnREQO+DXjqIw3rUTzWN7/+Dpw+N5Um8zpKV0JOEgbo= github.com/chmduquesne/rollinghash v4.0.0+incompatible/go.mod h1:Uc2I36RRfTAf7Dge82bi3RU0OQUmXT9iweIcPqvr8A0= -github.com/chromedp/cdproto v0.0.0-20250222051814-50c6cb17f10a h1:EnkQjhmp/MxhDB4KOTssv6xC20aQ9rhFRCfGHTsTqmE= -github.com/chromedp/cdproto v0.0.0-20250222051814-50c6cb17f10a/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= -github.com/chromedp/chromedp v0.13.1 h1:FDh9CfaAt0w70gl69Hb69M/xgZrWuppH9AW22aGa+iU= -github.com/chromedp/chromedp v0.13.1/go.mod h1:O3nO4Lno7iLoVX+7GdqQkehhKG7DtLf/zFRyJo0AhXY= +github.com/chromedp/cdproto v0.0.0-20250319231242-a755498943c8 h1:AqW2bDQf67Zbq6Tpop/+yJSIknxhiQecO2B8jNYTAPs= +github.com/chromedp/cdproto v0.0.0-20250319231242-a755498943c8/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= +github.com/chromedp/chromedp v0.13.3 h1:c6nTn97XQBykzcXiGYL5LLebw3h3CEyrCihm4HquYh0= +github.com/chromedp/chromedp v0.13.3/go.mod h1:khsDP9OP20GrowpJfZ7N05iGCwcAYxk7qf9AZBzR3Qw= github.com/chromedp/sysutil v1.1.0 h1:PUFNv5EcprjqXZD9nJb9b/c9ibAbxiYo4exNWZyipwM= github.com/chromedp/sysutil v1.1.0/go.mod h1:WiThHUdltqCNKGc4gaU50XgYjwjYIhKWoHGPTUfWTJ8= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= From 8ccfa08cca065f3cd65643c21185c4406167c16f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 01:11:24 +0000 Subject: [PATCH 046/206] build(deps): bump google.golang.org/protobuf (#4469) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 50926919805..c85de6eef5a 100644 --- a/go.mod +++ b/go.mod @@ -70,7 +70,7 @@ require ( golang.org/x/text v0.23.0 google.golang.org/api v0.227.0 google.golang.org/grpc v1.71.0 - google.golang.org/protobuf v1.36.5 + google.golang.org/protobuf v1.36.6 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 ) diff --git a/go.sum b/go.sum index 34d7f685dad..209de25d3e5 100644 --- a/go.sum +++ b/go.sum @@ -417,8 +417,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= -google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= -google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= From b319a94d96b06baae248ba06286c607d86d7f165 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 20:44:53 +0000 Subject: [PATCH 047/206] build(deps): bump the common-golang-dependencies group with 3 updates (#4473) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * build(deps): bump the common-golang-dependencies group with 3 updates Bumps the common-golang-dependencies group with 3 updates: [github.com/minio/minio-go/v7](https://github.com/minio/minio-go), [golang.org/x/net](https://github.com/golang/net) and [google.golang.org/api](https://github.com/googleapis/google-api-go-client). Updates `github.com/minio/minio-go/v7` from 7.0.88 to 7.0.89 - [Release notes](https://github.com/minio/minio-go/releases) - [Commits](https://github.com/minio/minio-go/compare/v7.0.88...v7.0.89) Updates `golang.org/x/net` from 0.37.0 to 0.38.0 - [Commits](https://github.com/golang/net/compare/v0.37.0...v0.38.0) Updates `google.golang.org/api` from 0.227.0 to 0.228.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.227.0...v0.228.0) --- updated-dependencies: - dependency-name: github.com/minio/minio-go/v7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] * revert go.mod toolchain statement --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Julio López <1953782+julio-lopez@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index c85de6eef5a..11925bab42b 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 - github.com/minio/minio-go/v7 v7.0.88 + github.com/minio/minio-go/v7 v7.0.89 github.com/mocktools/go-smtp-mock/v2 v2.4.0 github.com/mxk/go-vss v1.2.0 github.com/natefinch/atomic v1.0.1 @@ -62,13 +62,13 @@ require ( golang.org/x/crypto v0.36.0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 golang.org/x/mod v0.24.0 - golang.org/x/net v0.37.0 + golang.org/x/net v0.38.0 golang.org/x/oauth2 v0.28.0 golang.org/x/sync v0.12.0 golang.org/x/sys v0.31.0 golang.org/x/term v0.30.0 golang.org/x/text v0.23.0 - google.golang.org/api v0.227.0 + google.golang.org/api v0.228.0 google.golang.org/grpc v1.71.0 google.golang.org/protobuf v1.36.6 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 @@ -79,7 +79,7 @@ require ( cel.dev/expr v0.19.2 // indirect cloud.google.com/go v0.118.3 // indirect cloud.google.com/go/auth v0.15.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect cloud.google.com/go/iam v1.4.1 // indirect cloud.google.com/go/monitoring v1.24.0 // indirect @@ -120,7 +120,7 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/kr/fs v0.1.0 // indirect github.com/minio/crc64nvme v1.0.1 // indirect github.com/minio/md5-simd v1.1.2 // indirect diff --git a/go.sum b/go.sum index 209de25d3e5..acf0af095ce 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ cloud.google.com/go v0.118.3 h1:jsypSnrE/w4mJysioGdMBg4MiW/hHx/sArFpaBWHdME= cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc= cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps= cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= -cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= -cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= cloud.google.com/go/iam v1.4.1 h1:cFC25Nv+u5BkTR/BT1tXdoF2daiVbZ1RLx2eqfQ9RMM= @@ -176,8 +176,8 @@ github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeW 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/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= @@ -206,8 +206,8 @@ github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.88 h1:v8MoIJjwYxOkehp+eiLIuvXk87P2raUtoU5klrAAshs= -github.com/minio/minio-go/v7 v7.0.88/go.mod h1:33+O8h0tO7pCeCWwBVa07RhVVfB/3vS4kEX7rwYKmIg= +github.com/minio/minio-go/v7 v7.0.89 h1:hx4xV5wwTUfyv8LarhJAwNecnXpoTsj9v3f3q/ZkiJU= +github.com/minio/minio-go/v7 v7.0.89/go.mod h1:2rFnGAp02p7Dddo1Fq4S2wYOfpF0MUTSeLTRC90I204= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/mocktools/go-smtp-mock/v2 v2.4.0 h1:u0ky0iyNW/LEMKAFRTsDivHyP8dHYxe/cV3FZC3rRjo= @@ -345,8 +345,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= -golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -407,8 +407,8 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.227.0 h1:QvIHF9IuyG6d6ReE+BNd11kIB8hZvjN8Z5xY5t21zYc= -google.golang.org/api v0.227.0/go.mod h1:EIpaG6MbTgQarWF5xJvX0eOJPK9n/5D4Bynb9j2HXvQ= +google.golang.org/api v0.228.0 h1:X2DJ/uoWGnY5obVjewbp8icSL5U4FzuCfy9OjbLSnLs= +google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= From 6b1f6b93da5e95fbeeb14c30856600cc59b07380 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 29 Mar 2025 20:48:33 +0000 Subject: [PATCH 048/206] build(deps): bump github.com/pkg/sftp from 1.13.8 to 1.13.9 (#4474) Bumps [github.com/pkg/sftp](https://github.com/pkg/sftp) from 1.13.8 to 1.13.9. - [Release notes](https://github.com/pkg/sftp/releases) - [Commits](https://github.com/pkg/sftp/compare/v1.13.8...v1.13.9) --- updated-dependencies: - dependency-name: github.com/pkg/sftp dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 11925bab42b..97300a21db7 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/pierrec/lz4 v2.6.1+incompatible github.com/pkg/errors v0.9.1 github.com/pkg/profile v1.7.0 - github.com/pkg/sftp v1.13.8 + github.com/pkg/sftp v1.13.9 github.com/prometheus/client_golang v1.21.1 github.com/prometheus/client_model v0.6.1 github.com/prometheus/common v0.63.0 diff --git a/go.sum b/go.sum index acf0af095ce..bb0e13fca99 100644 --- a/go.sum +++ b/go.sum @@ -230,8 +230,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= -github.com/pkg/sftp v1.13.8 h1:Xt7eJ/xqXv7s0VuzFw7JXhZj6Oc1zI6l4GK8KP9sFB0= -github.com/pkg/sftp v1.13.8/go.mod h1:DmvEkvKE2lshEeuo2JMp06yqcx9HVnR7e3zqQl42F3U= +github.com/pkg/sftp v1.13.9 h1:4NGkvGudBL7GteO3m6qnaQ4pC0Kvf0onSVc9gR3EWBw= +github.com/pkg/sftp v1.13.9/go.mod h1:OBN7bVXdstkFFN/gdnHPUb5TE8eb8G1Rp9wCItqjkkA= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= From 8f32be2a00b55c762955ee7451b29003024172e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Sat, 29 Mar 2025 22:46:28 -0700 Subject: [PATCH 049/206] fix(cli): add newline after policy export output (#4476) - #4341 - #4020 --- cli/command_policy_export.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/command_policy_export.go b/cli/command_policy_export.go index 4c8f6c1cc56..a44f6a437ce 100644 --- a/cli/command_policy_export.go +++ b/cli/command_policy_export.go @@ -88,7 +88,7 @@ func (c *commandPolicyExport) run(ctx context.Context, rep repo.Repository) erro impossible.PanicOnError(err) - _, err = fmt.Fprintf(output, "%s", toWrite) + _, err = fmt.Fprintf(output, "%s\n", toWrite) return errors.Wrap(err, "unable to write policy to output") } From e0d3fc0fa55d4fead0835f2c9e1f15c7a5ef2f52 Mon Sep 17 00:00:00 2001 From: alingse Date: Sun, 30 Mar 2025 14:08:55 +0800 Subject: [PATCH 050/206] fix(general): use correct error in call to errors.Wrap (#4477) use `twerr` instead of `err`, which is always `nil` --- snapshot/snapshotgc/gc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snapshot/snapshotgc/gc.go b/snapshot/snapshotgc/gc.go index 0368e4b452f..b43056fbffb 100644 --- a/snapshot/snapshotgc/gc.go +++ b/snapshot/snapshotgc/gc.go @@ -51,7 +51,7 @@ func findInUseContentIDs(ctx context.Context, rep repo.Repository, used *bigmap. }, }) if twerr != nil { - return errors.Wrap(err, "unable to create tree walker") + return errors.Wrap(twerr, "unable to create tree walker") } defer w.Close(ctx) From ad33441fbc64652cc4557e9017430f48746d5920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Mon, 31 Mar 2025 21:10:21 -0700 Subject: [PATCH 051/206] chore(cli): add details to persistent password error message (#4480) Extends error message with a generic, OS-independent hint about what the source of the error may be and a potential solution. Also, modifies error message to avoid duplicate messages. - kopia/kopia#4449 --- cli/password.go | 2 +- internal/passwordpersist/passwordpersist_keyring.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/password.go b/cli/password.go index be8a89942fd..e205a6f33e8 100644 --- a/cli/password.go +++ b/cli/password.go @@ -84,7 +84,7 @@ func (c *App) getPasswordFromFlags(ctx context.Context, isCreate, allowPersisten } if !errors.Is(err, passwordpersist.ErrPasswordNotFound) { - return "", errors.Wrap(err, "error getting persistent password") + return "", errors.Wrap(err, "cannot get persistent password") } } diff --git a/internal/passwordpersist/passwordpersist_keyring.go b/internal/passwordpersist/passwordpersist_keyring.go index f6dcafc99ec..9a4ea8e74b7 100644 --- a/internal/passwordpersist/passwordpersist_keyring.go +++ b/internal/passwordpersist/passwordpersist_keyring.go @@ -33,7 +33,7 @@ func (keyringStrategy) GetPassword(ctx context.Context, configFile string) (stri case errors.Is(err, keyring.ErrUnsupportedPlatform): return "", ErrPasswordNotFound default: - return "", errors.Wrap(err, "error retrieving password from OS keyring") + return "", errors.Wrap(err, "error retrieving password from OS keyring, the keyring may be locked, attempt unlocking it using the OS-specific method") } } From 8f37256ab62c01ae19f098db4f95892486a95d8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Tue, 1 Apr 2025 12:54:02 -0700 Subject: [PATCH 052/206] build(deps): use Go 1.23.8 toolchain (#4482) - addresses CVE-2025-22871 - https://go.dev/issue/71988 - https://github.com/kopia/kopia/security/advisories/GHSA-63xm-hhjf-fwvg --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 97300a21db7..59275775c5d 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/kopia/kopia go 1.23.0 -toolchain go1.23.7 +toolchain go1.23.8 require ( cloud.google.com/go/storage v1.51.0 From 5ebff98a67c2df2f53357661dc9becc18cef6e52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 20:04:32 -0700 Subject: [PATCH 053/206] build(deps): bump the github-actions group with 4 updates (#4483) Bumps the github-actions group with 4 updates: [actions/setup-go](https://github.com/actions/setup-go), [actions/upload-artifact](https://github.com/actions/upload-artifact), [actions/download-artifact](https://github.com/actions/download-artifact) and [github/codeql-action](https://github.com/github/codeql-action). Updates `actions/setup-go` from 5.3.0 to 5.4.0 - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/f111f3307d8850f501ac008e886eec1fd1932a34...0aaccfd150d50ccaeb58ebd88d36e91967a5f35b) Updates `actions/upload-artifact` from 4.6.1 to 4.6.2 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1...ea165f8d65b6e75b540449e92b4886f43607fa02) Updates `actions/download-artifact` from 4.1.9 to 4.2.1 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/cc203385981b70ca67e1cc392babf9cc229d5806...95815c38cf2ff2164869cbab79da8d1f422bc89e) Updates `github/codeql-action` from 3.28.10 to 3.28.13 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d...1b549b9259bda1cb5ddde3b41741a82a2d15a841) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/code-coverage.yml | 4 ++-- .github/workflows/compat-test.yml | 4 ++-- .github/workflows/endurance-test.yml | 4 ++-- .github/workflows/htmlui-tests.yml | 4 ++-- .github/workflows/license-check.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/make.yml | 10 +++++----- .github/workflows/ossf-scorecard.yml | 4 ++-- .github/workflows/providers-core.yml | 2 +- .github/workflows/providers-extra.yml | 2 +- .github/workflows/race-detector.yml | 2 +- .github/workflows/stress-test.yml | 4 ++-- .github/workflows/tests.yml | 4 ++-- .github/workflows/volume-shadow-copy-test.yml | 4 ++-- 14 files changed, 26 insertions(+), 26 deletions(-) diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index bc68672f10e..0583d74d063 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -16,7 +16,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true @@ -28,7 +28,7 @@ jobs: with: files: coverage.txt - name: Upload Logs - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/compat-test.yml b/.github/workflows/compat-test.yml index 99a778644c2..55805051572 100644 --- a/.github/workflows/compat-test.yml +++ b/.github/workflows/compat-test.yml @@ -18,7 +18,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true @@ -26,7 +26,7 @@ jobs: - name: Compat Test run: make compat-tests - name: Upload Logs - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/endurance-test.yml b/.github/workflows/endurance-test.yml index bc40731ab22..c8dc8137ac0 100644 --- a/.github/workflows/endurance-test.yml +++ b/.github/workflows/endurance-test.yml @@ -23,7 +23,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true @@ -31,7 +31,7 @@ jobs: - name: Endurance Tests run: make endurance-tests - name: Upload Logs - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/htmlui-tests.yml b/.github/workflows/htmlui-tests.yml index 8ca110a223e..224b45e3336 100644 --- a/.github/workflows/htmlui-tests.yml +++ b/.github/workflows/htmlui-tests.yml @@ -31,7 +31,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true @@ -39,7 +39,7 @@ jobs: - name: Run Tests run: make htmlui-e2e-test - name: Upload Screenshots - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: path: .screenshots/**/*.png if-no-files-found: ignore diff --git a/.github/workflows/license-check.yml b/.github/workflows/license-check.yml index 978ebafb82f..a86a02e7cc7 100644 --- a/.github/workflows/license-check.yml +++ b/.github/workflows/license-check.yml @@ -16,7 +16,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index dfefa94d98b..bd29929cedc 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -30,7 +30,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true diff --git a/.github/workflows/make.yml b/.github/workflows/make.yml index 23b2a117bdc..d148da17d0a 100644 --- a/.github/workflows/make.yml +++ b/.github/workflows/make.yml @@ -40,7 +40,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true @@ -93,7 +93,7 @@ jobs: # macOS signing certificate (base64-encoded), used by Electron Builder MACOS_SIGNING_IDENTITY: ${{ secrets.MACOS_SIGNING_IDENTITY }} - name: Upload Kopia Artifacts - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: kopia-${{ matrix.os }} path: | @@ -114,7 +114,7 @@ jobs: dist/kopia-ui/*.yml if-no-files-found: ignore - name: Upload Kopia Binary - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: kopia_binaries-${{ matrix.os }} path: | @@ -137,13 +137,13 @@ jobs: - name: Install Linux-specific packages run: "sudo apt-get install -y createrepo-c" - name: Download Artifacts - uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: pattern: kopia-* merge-multiple: true path: dist - name: Download Kopia Binaries - uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: pattern: kopia_binaries-* merge-multiple: true diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index fb1a20ffdfe..ac16ae3a76f 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -39,12 +39,12 @@ jobs: - # Upload the results to GitHub's code scanning dashboard. name: "Upload to results to dashboard" - uses: github/codeql-action/upload-sarif@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 + uses: github/codeql-action/upload-sarif@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 with: sarif_file: results.sarif - name: "Upload analysis results as 'Job Artifact'" - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: SARIF file path: results.sarif diff --git a/.github/workflows/providers-core.yml b/.github/workflows/providers-core.yml index b2e4ffcd878..eb56a09c9a4 100644 --- a/.github/workflows/providers-core.yml +++ b/.github/workflows/providers-core.yml @@ -29,7 +29,7 @@ jobs: fetch-depth: 0 ref: ${{ github.event.inputs.ref_name || github.ref }} - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true diff --git a/.github/workflows/providers-extra.yml b/.github/workflows/providers-extra.yml index 8f865ae7641..e9d852bd3d4 100644 --- a/.github/workflows/providers-extra.yml +++ b/.github/workflows/providers-extra.yml @@ -29,7 +29,7 @@ jobs: fetch-depth: 0 ref: ${{ github.event.inputs.ref_name || github.ref }} - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true diff --git a/.github/workflows/race-detector.yml b/.github/workflows/race-detector.yml index 75e7bd1e873..05dc7bb6a43 100644 --- a/.github/workflows/race-detector.yml +++ b/.github/workflows/race-detector.yml @@ -16,7 +16,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true diff --git a/.github/workflows/stress-test.yml b/.github/workflows/stress-test.yml index ad9e2b450f2..fb4b8711a35 100644 --- a/.github/workflows/stress-test.yml +++ b/.github/workflows/stress-test.yml @@ -22,7 +22,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true @@ -30,7 +30,7 @@ jobs: - name: Stress Test run: make stress-test - name: Upload Logs - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: logs path: .logs/**/*.log diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3ec3920251b..272cde4ff4d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -38,7 +38,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true @@ -58,7 +58,7 @@ jobs: - name: Integration Tests run: make -j2 ci-integration-tests - name: Upload Logs - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: logs-${{ matrix.os }} path: .logs/**/*.log diff --git a/.github/workflows/volume-shadow-copy-test.yml b/.github/workflows/volume-shadow-copy-test.yml index 44805cd0375..0c7a89360d9 100644 --- a/.github/workflows/volume-shadow-copy-test.yml +++ b/.github/workflows/volume-shadow-copy-test.yml @@ -19,7 +19,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 + uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0 with: go-version-file: 'go.mod' check-latest: true @@ -34,7 +34,7 @@ jobs: - name: Non-Admin Test run: gsudo -i Medium make os-snapshot-tests - name: Upload Logs - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: logs path: .logs/**/*.log From 5c8e58e07a7ea5eecec1a3d4cc35858cc1e098a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Wed, 2 Apr 2025 15:40:32 -0700 Subject: [PATCH 054/206] refactor(cli): misc cleanups in internal/diff (#4484) - remove spurious log message, duplicates what is being sent to the output; - nit: update struct comment; - consolidate code via a parameterized function; - rename variable for clarity, it makes it easier to understand by avoiding negative condition check; - remove unused return value; - replace if blocks with switch. --- internal/diff/diff.go | 105 ++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 70 deletions(-) diff --git a/internal/diff/diff.go b/internal/diff/diff.go index 84cd6bb46d0..39fe0be661d 100644 --- a/internal/diff/diff.go +++ b/internal/diff/diff.go @@ -21,7 +21,7 @@ const dirMode = 0o700 var log = logging.Module("diff") -// EntryTypeStats accumulates specific stats for the snapshots being compared. +// EntryTypeStats accumulates stats for an FS entry type. type EntryTypeStats struct { Added uint32 `json:"added"` Removed uint32 `json:"removed"` @@ -111,9 +111,9 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin if e1HasObjectID && e2HasObjectID { if h1.ObjectID() == h2.ObjectID() { if _, isDir := e1.(fs.Directory); isDir { - c.compareDirMetadataAndComputeStats(ctx, e1, e2, path) + compareMetadata(ctx, e1, e2, path, &c.stats.DirectoryEntries) } else { - c.compareFileMetadataAndComputeStats(ctx, e1, e2, path) + compareMetadata(ctx, e1, e2, path, &c.stats.FileEntries) } return nil @@ -181,7 +181,6 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin if isDir2 { // left is non-directory, right is a directory - log(ctx).Infof("changed %v from non-directory to a directory", path) c.output("changed %v from non-directory to a directory\n", path) return nil @@ -199,116 +198,86 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin } } + // don't compare filesystem boundaries (e1.Device()), it's pretty useless and is not stored in backups + return nil } -func (c *Comparer) compareDirMetadataAndComputeStats(ctx context.Context, e1, e2 fs.Entry, path string) { - // check for metadata changes pertaining to directories given that content hasn't changed and gather aggregate statistics - equal := true +// Checks for changes in e1's and e2's metadata when they have the same content, +// and upates the stats accordingly. +// The function is not concurrency safe, as it updates st without any locking. +func compareMetadata(ctx context.Context, e1, e2 fs.Entry, path string, st *EntryTypeStats) { + var changed bool if m1, m2 := e1.Mode(), e2.Mode(); m1 != m2 { - equal = false - c.stats.DirectoryEntries.SameContentButDifferentMode++ + changed = true + st.SameContentButDifferentMode++ } if mt1, mt2 := e1.ModTime(), e2.ModTime(); !mt1.Equal(mt2) { - equal = false - c.stats.DirectoryEntries.SameContentButDifferentModificationTime++ + changed = true + st.SameContentButDifferentModificationTime++ } o1, o2 := e1.Owner(), e2.Owner() if o1.UserID != o2.UserID { - equal = false - c.stats.DirectoryEntries.SameContentButDifferentUserOwner++ + changed = true + st.SameContentButDifferentUserOwner++ } if o1.GroupID != o2.GroupID { - equal = false - c.stats.DirectoryEntries.SameContentButDifferentGroupOwner++ + changed = true + st.SameContentButDifferentGroupOwner++ } - if !equal { - c.stats.DirectoryEntries.SameContentButDifferentMetadata++ + if changed { + st.SameContentButDifferentMetadata++ log(ctx).Debugf("content unchanged but metadata has been modified: %v", path) } } -func (c *Comparer) compareFileMetadataAndComputeStats(ctx context.Context, e1, e2 fs.Entry, path string) { - // check for metadata changes pertaining to files given that content hasn't changed and gather aggregate statistics - equal := true - if m1, m2 := e1.Mode(), e2.Mode(); m1 != m2 { - equal = false - c.stats.FileEntries.SameContentButDifferentMode++ - } - - if mt1, mt2 := e1.ModTime(), e2.ModTime(); !mt1.Equal(mt2) { - equal = false - c.stats.FileEntries.SameContentButDifferentModificationTime++ - } - - o1, o2 := e1.Owner(), e2.Owner() - if o1.UserID != o2.UserID { - equal = false - c.stats.FileEntries.SameContentButDifferentUserOwner++ - } - - if o1.GroupID != o2.GroupID { - equal = false - c.stats.FileEntries.SameContentButDifferentGroupOwner++ - } - - if !equal { - c.stats.FileEntries.SameContentButDifferentMetadata++ - - log(ctx).Debugf("content unchanged but metadata has been modified: %v", path) - } -} - -func (c *Comparer) compareEntryMetadata(e1, e2 fs.Entry, fullpath string) bool { - if e1 == e2 { // in particular e1 == nil && e2 == nil - return true - } - - if e1 == nil { +func (c *Comparer) compareEntryMetadata(e1, e2 fs.Entry, fullpath string) { + switch { + case e1 == e2: // in particular e1 == nil && e2 == nil + return + case e1 == nil: c.output("%v does not exist in source directory\n", fullpath) - return false - } - - if e2 == nil { + return + case e2 == nil: c.output("%v does not exist in destination directory\n", fullpath) - return false + return } - equal := true + var changed bool if m1, m2 := e1.Mode(), e2.Mode(); m1 != m2 { - equal = false + changed = true c.output("%v modes differ: %v %v\n", fullpath, m1, m2) } if s1, s2 := e1.Size(), e2.Size(); s1 != s2 { - equal = false + changed = true c.output("%v sizes differ: %v %v\n", fullpath, s1, s2) } if mt1, mt2 := e1.ModTime(), e2.ModTime(); !mt1.Equal(mt2) { - equal = false + changed = true c.output("%v modification times differ: %v %v\n", fullpath, mt1, mt2) } o1, o2 := e1.Owner(), e2.Owner() if o1.UserID != o2.UserID { - equal = false + changed = true c.output("%v owner users differ: %v %v\n", fullpath, o1.UserID, o2.UserID) } if o1.GroupID != o2.GroupID { - equal = false + changed = true c.output("%v owner groups differ: %v %v\n", fullpath, o1.GroupID, o2.GroupID) } @@ -316,17 +285,13 @@ func (c *Comparer) compareEntryMetadata(e1, e2 fs.Entry, fullpath string) bool { _, isDir1 := e1.(fs.Directory) _, isDir2 := e2.(fs.Directory) - if !equal { + if changed { if isDir1 && isDir2 { c.stats.DirectoryEntries.Modified++ } else { c.stats.FileEntries.Modified++ } } - - // don't compare filesystem boundaries (e1.Device()), it's pretty useless and is not stored in backups - - return equal } func (c *Comparer) compareDirectoryEntries(ctx context.Context, entries1, entries2 []fs.Entry, dirPath string) error { From 762a4c65e0a02b4dc3b4b8a5cc6244d7b6b7505c Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Fri, 4 Apr 2025 16:55:10 -0700 Subject: [PATCH 055/206] feat(ui): upgraded htmlui to the latest version (#4487) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 59275775c5d..4d2fcc79e5e 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250303064157-676b1b5bc735 + github.com/kopia/htmluibuild v0.0.1-0.20250404064215-8bfc34d8e3cf github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index bb0e13fca99..4ab8d0eb450 100644 --- a/go.sum +++ b/go.sum @@ -182,8 +182,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250303064157-676b1b5bc735 h1:jhTarsFN8q9gglhSiFHapzVa2i2Wsg/zbm35MWchDYk= -github.com/kopia/htmluibuild v0.0.1-0.20250303064157-676b1b5bc735/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250404064215-8bfc34d8e3cf h1:gQbofNt9EnLDXNdAhhCrLgk6yMfclcUoO17lAyClTcU= +github.com/kopia/htmluibuild v0.0.1-0.20250404064215-8bfc34d8e3cf/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From 950d52e6d52e0859b877eb41965c6bba80f799d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 18:07:04 +0000 Subject: [PATCH 056/206] build(deps): bump github.com/prometheus/client_golang (#4493) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4d2fcc79e5e..0d6d85edfbe 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/pkg/profile v1.7.0 github.com/pkg/sftp v1.13.9 - github.com/prometheus/client_golang v1.21.1 + github.com/prometheus/client_golang v1.22.0 github.com/prometheus/client_model v0.6.1 github.com/prometheus/common v0.63.0 github.com/sanity-io/litter v1.5.8 diff --git a/go.sum b/go.sum index 4ab8d0eb450..020e18928e1 100644 --- a/go.sum +++ b/go.sum @@ -239,8 +239,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= -github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= From 4812152678f2523ead7884f923fe2608293db2b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 11:07:29 -0700 Subject: [PATCH 057/206] build(deps): bump the common-golang-dependencies group with 10 updates (#4492) Bumps the common-golang-dependencies group with 10 updates: | Package | From | To | | --- | --- | --- | | [github.com/Azure/azure-sdk-for-go/sdk/azcore](https://github.com/Azure/azure-sdk-for-go) | `1.17.1` | `1.18.0` | | [github.com/minio/minio-go/v7](https://github.com/minio/minio-go) | `7.0.89` | `7.0.90` | | [golang.org/x/crypto](https://github.com/golang/crypto) | `0.36.0` | `0.37.0` | | [golang.org/x/net](https://github.com/golang/net) | `0.38.0` | `0.39.0` | | [golang.org/x/oauth2](https://github.com/golang/oauth2) | `0.28.0` | `0.29.0` | | [golang.org/x/sync](https://github.com/golang/sync) | `0.12.0` | `0.13.0` | | [golang.org/x/sys](https://github.com/golang/sys) | `0.31.0` | `0.32.0` | | [golang.org/x/term](https://github.com/golang/term) | `0.30.0` | `0.31.0` | | [golang.org/x/text](https://github.com/golang/text) | `0.23.0` | `0.24.0` | | [google.golang.org/grpc](https://github.com/grpc/grpc-go) | `1.71.0` | `1.71.1` | Updates `github.com/Azure/azure-sdk-for-go/sdk/azcore` from 1.17.1 to 1.18.0 - [Release notes](https://github.com/Azure/azure-sdk-for-go/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md) - [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azcore/v1.17.1...sdk/azcore/v1.18.0) Updates `github.com/minio/minio-go/v7` from 7.0.89 to 7.0.90 - [Release notes](https://github.com/minio/minio-go/releases) - [Commits](https://github.com/minio/minio-go/compare/v7.0.89...v7.0.90) Updates `golang.org/x/crypto` from 0.36.0 to 0.37.0 - [Commits](https://github.com/golang/crypto/compare/v0.36.0...v0.37.0) Updates `golang.org/x/net` from 0.38.0 to 0.39.0 - [Commits](https://github.com/golang/net/compare/v0.38.0...v0.39.0) Updates `golang.org/x/oauth2` from 0.28.0 to 0.29.0 - [Commits](https://github.com/golang/oauth2/compare/v0.28.0...v0.29.0) Updates `golang.org/x/sync` from 0.12.0 to 0.13.0 - [Commits](https://github.com/golang/sync/compare/v0.12.0...v0.13.0) Updates `golang.org/x/sys` from 0.31.0 to 0.32.0 - [Commits](https://github.com/golang/sys/compare/v0.31.0...v0.32.0) Updates `golang.org/x/term` from 0.30.0 to 0.31.0 - [Commits](https://github.com/golang/term/compare/v0.30.0...v0.31.0) Updates `golang.org/x/text` from 0.23.0 to 0.24.0 - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.23.0...v0.24.0) Updates `google.golang.org/grpc` from 1.71.0 to 1.71.1 - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.71.0...v1.71.1) --- updated-dependencies: - dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azcore dependency-version: 1.18.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: github.com/minio/minio-go/v7 dependency-version: 7.0.90 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies - dependency-name: golang.org/x/crypto dependency-version: 0.37.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/net dependency-version: 0.39.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/oauth2 dependency-version: 0.29.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/sync dependency-version: 0.13.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/sys dependency-version: 0.32.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/term dependency-version: 0.31.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/text dependency-version: 0.24.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: google.golang.org/grpc dependency-version: 1.71.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 24 ++++++++++++------------ go.sum | 48 ++++++++++++++++++++++++------------------------ 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/go.mod b/go.mod index 0d6d85edfbe..8e5cf731e39 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.23.8 require ( cloud.google.com/go/storage v1.51.0 - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 github.com/alecthomas/kingpin/v2 v2.4.0 @@ -34,7 +34,7 @@ require ( github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 - github.com/minio/minio-go/v7 v7.0.89 + github.com/minio/minio-go/v7 v7.0.90 github.com/mocktools/go-smtp-mock/v2 v2.4.0 github.com/mxk/go-vss v1.2.0 github.com/natefinch/atomic v1.0.1 @@ -59,17 +59,17 @@ require ( go.opentelemetry.io/otel/trace v1.35.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.36.0 + golang.org/x/crypto v0.37.0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 golang.org/x/mod v0.24.0 - golang.org/x/net v0.38.0 - golang.org/x/oauth2 v0.28.0 - golang.org/x/sync v0.12.0 - golang.org/x/sys v0.31.0 - golang.org/x/term v0.30.0 - golang.org/x/text v0.23.0 + golang.org/x/net v0.39.0 + golang.org/x/oauth2 v0.29.0 + golang.org/x/sync v0.13.0 + golang.org/x/sys v0.32.0 + golang.org/x/term v0.31.0 + golang.org/x/text v0.24.0 google.golang.org/api v0.228.0 - google.golang.org/grpc v1.71.0 + google.golang.org/grpc v1.71.1 google.golang.org/protobuf v1.36.6 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 ) @@ -83,8 +83,8 @@ require ( cloud.google.com/go/compute/metadata v0.6.0 // indirect cloud.google.com/go/iam v1.4.1 // indirect cloud.google.com/go/monitoring v1.24.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect diff --git a/go.sum b/go.sum index 020e18928e1..4522aa13753 100644 --- a/go.sum +++ b/go.sum @@ -22,22 +22,22 @@ cloud.google.com/go/storage v1.51.0 h1:ZVZ11zCiD7b3k+cH5lQs/qcNaoSz3U9I0jgwVzqDl cloud.google.com/go/storage v1.51.0/go.mod h1:YEJfu/Ki3i5oHC/7jyTgsGZwdQ8P9hqMqvpi5kRKGgc= cloud.google.com/go/trace v1.11.3 h1:c+I4YFjxRQjvAhRmSsmjpASUKq88chOX854ied0K/pE= cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w+dgQ06WJtEcbQG/8J7BB6hnCr4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.0 h1:Bg8m3nq/X1DeePkAbCfb6ml6F3F0IunEhE8TMh+lY48= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.0/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 h1:UXT0o77lXQrikd1kgwIPQOUect7EoR/+sbP4wQKdzxM= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0/go.mod h1:cTvi54pg19DoT07ekoeMgE/taAwNtCShVeZqA+Iv2xI= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= -github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 h1:H5xDQaE3XowWfhZRUpnfC+rGZMEVoSiji+b+/HFAPU4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= +github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/GehirnInc/crypt v0.0.0-20190301055215-6c0105aabd46/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo= github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 h1:IEjq88XO4PuBDcvmjQJcQGg+w+UaafSy8G5Kcb5tBhI= github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5/go.mod h1:exZ0C/1emQJAw5tHOaUDyY1ycttqBAPcxuzf7QbY6ec= @@ -206,8 +206,8 @@ github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.89 h1:hx4xV5wwTUfyv8LarhJAwNecnXpoTsj9v3f3q/ZkiJU= -github.com/minio/minio-go/v7 v7.0.89/go.mod h1:2rFnGAp02p7Dddo1Fq4S2wYOfpF0MUTSeLTRC90I204= +github.com/minio/minio-go/v7 v7.0.90 h1:TmSj1083wtAD0kEYTx7a5pFsv3iRYMsOJ6A4crjA1lE= +github.com/minio/minio-go/v7 v7.0.90/go.mod h1:uvMUcGrpgeSAAI6+sD3818508nUyMULw94j2Nxku/Go= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/mocktools/go-smtp-mock/v2 v2.4.0 h1:u0ky0iyNW/LEMKAFRTsDivHyP8dHYxe/cV3FZC3rRjo= @@ -325,8 +325,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -345,10 +345,10 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= -golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= -golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= +golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -356,8 +356,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -373,8 +373,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -384,8 +384,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -395,8 +395,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -415,8 +415,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1: google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1:iK2jbkWL86DXjEx0qiHcRE9dE4/Ahua5k6V8OWFb//c= google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= -google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= +google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From e83f917527cb67019ded2086cfe112173e82ceff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 18:12:58 +0000 Subject: [PATCH 058/206] build(deps): bump github.com/chromedp/chromedp from 0.13.3 to 0.13.6 (#4494) Bumps [github.com/chromedp/chromedp](https://github.com/chromedp/chromedp) from 0.13.3 to 0.13.6. - [Release notes](https://github.com/chromedp/chromedp/releases) - [Commits](https://github.com/chromedp/chromedp/compare/v0.13.3...v0.13.6) --- updated-dependencies: - dependency-name: github.com/chromedp/chromedp dependency-version: 0.13.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 8e5cf731e39..7a246f2f619 100644 --- a/go.mod +++ b/go.mod @@ -12,8 +12,8 @@ require ( github.com/alecthomas/kingpin/v2 v2.4.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 github.com/chmduquesne/rollinghash v4.0.0+incompatible - github.com/chromedp/cdproto v0.0.0-20250319231242-a755498943c8 - github.com/chromedp/chromedp v0.13.3 + github.com/chromedp/cdproto v0.0.0-20250403032234-65de8f5d025b + github.com/chromedp/chromedp v0.13.6 github.com/coreos/go-systemd/v22 v22.5.0 github.com/dustinkirkland/golang-petname v0.0.0-20191129215211-8e5a1ed0cff0 github.com/edsrzf/mmap-go v1.2.0 diff --git a/go.sum b/go.sum index 4522aa13753..869f78a75c8 100644 --- a/go.sum +++ b/go.sum @@ -61,10 +61,10 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chmduquesne/rollinghash v4.0.0+incompatible h1:hnREQO+DXjqIw3rUTzWN7/+Dpw+N5Um8zpKV0JOEgbo= github.com/chmduquesne/rollinghash v4.0.0+incompatible/go.mod h1:Uc2I36RRfTAf7Dge82bi3RU0OQUmXT9iweIcPqvr8A0= -github.com/chromedp/cdproto v0.0.0-20250319231242-a755498943c8 h1:AqW2bDQf67Zbq6Tpop/+yJSIknxhiQecO2B8jNYTAPs= -github.com/chromedp/cdproto v0.0.0-20250319231242-a755498943c8/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= -github.com/chromedp/chromedp v0.13.3 h1:c6nTn97XQBykzcXiGYL5LLebw3h3CEyrCihm4HquYh0= -github.com/chromedp/chromedp v0.13.3/go.mod h1:khsDP9OP20GrowpJfZ7N05iGCwcAYxk7qf9AZBzR3Qw= +github.com/chromedp/cdproto v0.0.0-20250403032234-65de8f5d025b h1:jJmiCljLNTaq/O1ju9Bzz2MPpFlmiTn0F7LwCoeDZVw= +github.com/chromedp/cdproto v0.0.0-20250403032234-65de8f5d025b/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= +github.com/chromedp/chromedp v0.13.6 h1:xlNunMyzS5bu3r/QKrb3fzX6ow3WBQ6oao+J65PGZxk= +github.com/chromedp/chromedp v0.13.6/go.mod h1:h8GPP6ZtLMLsU8zFbTcb7ZDGCvCy8j/vRoFmRltQx9A= github.com/chromedp/sysutil v1.1.0 h1:PUFNv5EcprjqXZD9nJb9b/c9ibAbxiYo4exNWZyipwM= github.com/chromedp/sysutil v1.1.0/go.mod h1:WiThHUdltqCNKGc4gaU50XgYjwjYIhKWoHGPTUfWTJ8= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= From f831def52ab9b359d6219f7209b7b3f4fabbed5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Sat, 12 Apr 2025 14:51:32 -0700 Subject: [PATCH 059/206] build(cli): set build info version and info when not set (#4498) Sets `repo.BuildInfo` and `repo.BuildVersion` when they are not specified via link flags. The behavior for binaries built via CI and Make remains the same. Sets `repo.Version` to `v0-unofficial` during tests. --- repo/buildinfo.go | 84 ++++++++++++++++++++++++++++++ repo/buildinfo_test.go | 113 +++++++++++++++++++++++++++++++++++++++++ repo/initialize.go | 9 ---- 3 files changed, 197 insertions(+), 9 deletions(-) create mode 100644 repo/buildinfo.go create mode 100644 repo/buildinfo_test.go diff --git a/repo/buildinfo.go b/repo/buildinfo.go new file mode 100644 index 00000000000..c6f7a05467a --- /dev/null +++ b/repo/buildinfo.go @@ -0,0 +1,84 @@ +package repo + +import ( + stdlib "log" + "runtime/debug" + "strings" +) + +// Kopia's build information. +// +//nolint:gochecknoglobals +var ( + BuildInfo = "" + BuildVersion = "" + BuildGitHubRepo = "" +) + +func init() { + // fill in from executable's build info when these are unset + BuildInfo, BuildVersion = getBuildInfoAndVersion(BuildInfo, BuildVersion) +} + +func getBuildInfoAndVersion(linkedInfo, linkedVersion string) (info, version string) { + info, version = linkedInfo, linkedVersion + + if info != "" && version != "" { + return // use the values specified at link time + } + + // a value was not set at link time, set it from the executable's build + // info if available. + bi, ok := debug.ReadBuildInfo() + if !ok { + // logging not yet set up, use stdlib's logging + stdlib.Println("executable build information is not available") + return // executable's build info is not available, use values set at link time, if any + } + + if version == "" { + version = "v0-unofficial" + + if bi.Main.Version != "" && bi.Main.Version != "(devel)" { // set to '(devel)' during tests in Go 1.24 + version = bi.Main.Version + } + } + + if info == "" { + info = getRevisionString(bi.Settings) + } + + return +} + +func getRevisionString(s []debug.BuildSetting) string { + var ( + revision, vcsTime string + modified bool + ) + + for _, v := range s { + switch v.Key { + case "vcs.revision": + revision = v.Value + case "vcs.time": + vcsTime = v.Value + case "vcs.modified": + if strings.EqualFold(v.Value, "true") { + modified = true + } + } + } + + if revision == "" { + revision = "(unknown_revision)" + } + + var modStr string + + if modified { + modStr = "+dirty" + } + + return vcsTime + "-" + revision + modStr +} diff --git a/repo/buildinfo_test.go b/repo/buildinfo_test.go new file mode 100644 index 00000000000..5164ff7fdb4 --- /dev/null +++ b/repo/buildinfo_test.go @@ -0,0 +1,113 @@ +package repo + +import ( + "runtime/debug" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGetRevisionString(t *testing.T) { + cases := []struct { + input []debug.BuildSetting + want string + }{ + { + want: "-(unknown_revision)", + }, + { + input: []debug.BuildSetting{ + { + Key: "vcs.modified", + Value: "true", + }, + }, + want: "-(unknown_revision)+dirty", + }, + { + input: []debug.BuildSetting{ + { + Key: "vcs.time", + Value: "2025-04-12T16:01:30Z", + }, + }, + want: "2025-04-12T16:01:30Z-(unknown_revision)", + }, + { + input: []debug.BuildSetting{ + { + Key: "vcs.time", + Value: "2025-04-12T16:01:30Z", + }, + { + Key: "vcs.modified", + Value: "true", + }, + }, + want: "2025-04-12T16:01:30Z-(unknown_revision)+dirty", + }, + { + input: []debug.BuildSetting{ + { + Key: "vcs.time", + Value: "2025-04-12T16:01:30Z", + }, + { + Key: "vcs.revision", + Value: "353676da445938316fa00b2b812a61f4b1dd3ffa", + }, + }, + want: "2025-04-12T16:01:30Z-353676da445938316fa00b2b812a61f4b1dd3ffa", + }, + { + input: []debug.BuildSetting{ + { + Key: "vcs.time", + Value: "2025-04-12T16:01:30Z", + }, + { + Key: "vcs.revision", + Value: "353676da4459", + }, + }, + want: "2025-04-12T16:01:30Z-353676da4459", + }, + { + input: []debug.BuildSetting{ + { + Key: "vcs.time", + Value: "2025-04-12T16:01:30Z", + }, + { + Key: "vcs.revision", + Value: "353676da", + }, + }, + want: "2025-04-12T16:01:30Z-353676da", + }, + { + input: []debug.BuildSetting{ + { + Key: "vcs.time", + Value: "2025-04-12T16:01:30Z", + }, + { + Key: "vcs.revision", + Value: "353676da445938316fa00b2b812a61f4b1dd3ffa", + }, + { + Key: "vcs.modified", + Value: "true", + }, + }, + want: "2025-04-12T16:01:30Z-353676da445938316fa00b2b812a61f4b1dd3ffa+dirty", + }, + } + + for _, c := range cases { + t.Run("buildinfo", func(t *testing.T) { + got := getRevisionString(c.input) + require.Equal(t, c.want, got) + }) + } +} diff --git a/repo/initialize.go b/repo/initialize.go index 7b9e7a7749a..ce1c931d92b 100644 --- a/repo/initialize.go +++ b/repo/initialize.go @@ -18,15 +18,6 @@ import ( "github.com/kopia/kopia/repo/splitter" ) -// BuildInfo is the build information of Kopia. -// -//nolint:gochecknoglobals -var ( - BuildInfo = "unknown" - BuildVersion = "v0-unofficial" - BuildGitHubRepo = "" -) - const ( hmacSecretLength = 32 masterKeyLength = 32 From a03ccabcf03e73666e4d5984ca709e9e281b494e Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Sat, 12 Apr 2025 18:18:47 -0700 Subject: [PATCH 060/206] feat(ui): upgraded htmlui to the latest version (#4499) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7a246f2f619..2f73ba1567c 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250404064215-8bfc34d8e3cf + github.com/kopia/htmluibuild v0.0.1-0.20250412220712-778c21a64a84 github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index 869f78a75c8..774e08013ba 100644 --- a/go.sum +++ b/go.sum @@ -182,8 +182,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250404064215-8bfc34d8e3cf h1:gQbofNt9EnLDXNdAhhCrLgk6yMfclcUoO17lAyClTcU= -github.com/kopia/htmluibuild v0.0.1-0.20250404064215-8bfc34d8e3cf/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250412220712-778c21a64a84 h1:UJCTRN2okJ+ar5L02NguM7cTS3I6wvFxYrH6ihEuLqQ= +github.com/kopia/htmluibuild v0.0.1-0.20250412220712-778c21a64a84/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From 51ef01dad527ba81aff13258a0787535bacfd53c Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Sat, 12 Apr 2025 21:08:03 -0700 Subject: [PATCH 061/206] refactor(snapshots): extracted snapshot.FindPreviousManifests() (#4453) --- cli/command_snapshot_create.go | 48 +-------------------- cli/command_snapshot_migrate.go | 4 +- snapshot/manager.go | 45 +++++++++++++++++++ snapshot/snapshotmaintenance/helper_test.go | 36 +--------------- 4 files changed, 50 insertions(+), 83 deletions(-) diff --git a/cli/command_snapshot_create.go b/cli/command_snapshot_create.go index 3fb87f53d8b..bd2d61af388 100644 --- a/cli/command_snapshot_create.go +++ b/cli/command_snapshot_create.go @@ -296,9 +296,9 @@ func (c *commandSnapshotCreate) snapshotSingleSource( var previous []*snapshot.Manifest - previous, finalErr = findPreviousSnapshotManifest(ctx, rep, sourceInfo, nil) + previous, finalErr = snapshot.FindPreviousManifests(ctx, rep, sourceInfo, nil) if finalErr != nil { - return finalErr + return errors.Wrap(finalErr, "unable to find previous manifests") } if len(previous) > 0 { @@ -407,50 +407,6 @@ func (c *commandSnapshotCreate) reportSnapshotStatus(ctx context.Context, manife return nil } -// findPreviousSnapshotManifest returns the list of previous snapshots for a given source, including -// last complete snapshot and possibly some number of incomplete snapshots following it. -func findPreviousSnapshotManifest(ctx context.Context, rep repo.Repository, sourceInfo snapshot.SourceInfo, noLaterThan *fs.UTCTimestamp) ([]*snapshot.Manifest, error) { - man, err := snapshot.ListSnapshots(ctx, rep, sourceInfo) - if err != nil { - return nil, errors.Wrap(err, "error listing previous snapshots") - } - - // phase 1 - find latest complete snapshot. - var previousComplete *snapshot.Manifest - - var previousCompleteStartTime fs.UTCTimestamp - - var result []*snapshot.Manifest - - for _, p := range man { - if noLaterThan != nil && p.StartTime.After(*noLaterThan) { - continue - } - - if p.IncompleteReason == "" && (previousComplete == nil || p.StartTime.After(previousComplete.StartTime)) { - previousComplete = p - previousCompleteStartTime = p.StartTime - } - } - - if previousComplete != nil { - result = append(result, previousComplete) - } - - // add all incomplete snapshots after that - for _, p := range man { - if noLaterThan != nil && p.StartTime.After(*noLaterThan) { - continue - } - - if p.IncompleteReason != "" && p.StartTime.After(previousCompleteStartTime) { - result = append(result, p) - } - } - - return result, nil -} - func getLocalBackupPaths(ctx context.Context, rep repo.Repository) ([]string, error) { log(ctx).Debugf("Looking for previous backups of '%v@%v'...", rep.ClientOptions().Hostname, rep.ClientOptions().Username) diff --git a/cli/command_snapshot_migrate.go b/cli/command_snapshot_migrate.go index eb04586bb90..329d969c596 100644 --- a/cli/command_snapshot_migrate.go +++ b/cli/command_snapshot_migrate.go @@ -272,9 +272,9 @@ func (c *commandSnapshotMigrate) migrateSingleSourceSnapshot(ctx context.Context log(ctx).Infof("migrating snapshot of %v at %v", s, formatTimestamp(m.StartTime.ToTime())) - previous, err := findPreviousSnapshotManifest(ctx, destRepo, m.Source, &m.StartTime) + previous, err := snapshot.FindPreviousManifests(ctx, destRepo, m.Source, &m.StartTime) if err != nil { - return err + return errors.Wrap(err, "unable to find previous manifests") } policyTree, err := policy.TreeForSource(ctx, destRepo, m.Source) diff --git a/snapshot/manager.go b/snapshot/manager.go index d25c3f91c90..a35828d2816 100644 --- a/snapshot/manager.go +++ b/snapshot/manager.go @@ -6,6 +6,7 @@ import ( "github.com/pkg/errors" + "github.com/kopia/kopia/fs" "github.com/kopia/kopia/repo" "github.com/kopia/kopia/repo/logging" "github.com/kopia/kopia/repo/manifest" @@ -247,6 +248,50 @@ func UpdateSnapshot(ctx context.Context, rep repo.RepositoryWriter, m *Manifest) return nil } +// FindPreviousManifests returns the list of previous snapshots for a given source, including +// last complete snapshot and possibly some number of incomplete snapshots following it. +func FindPreviousManifests(ctx context.Context, rep repo.Repository, sourceInfo SourceInfo, noLaterThan *fs.UTCTimestamp) ([]*Manifest, error) { + man, err := ListSnapshots(ctx, rep, sourceInfo) + if err != nil { + return nil, errors.Wrap(err, "error listing previous snapshots") + } + + // phase 1 - find latest complete snapshot. + var ( + previousComplete *Manifest + previousCompleteStartTime fs.UTCTimestamp + result []*Manifest + ) + + for _, p := range man { + if noLaterThan != nil && p.StartTime.After(*noLaterThan) { + continue + } + + if p.IncompleteReason == "" && (previousComplete == nil || p.StartTime.After(previousComplete.StartTime)) { + previousComplete = p + previousCompleteStartTime = p.StartTime + } + } + + if previousComplete != nil { + result = append(result, previousComplete) + } + + // add all incomplete snapshots after that + for _, p := range man { + if noLaterThan != nil && p.StartTime.After(*noLaterThan) { + continue + } + + if p.IncompleteReason != "" && p.StartTime.After(previousCompleteStartTime) { + result = append(result, p) + } + } + + return result, nil +} + func entryIDs(entries []*manifest.EntryMetadata) []manifest.ID { var ids []manifest.ID for _, e := range entries { diff --git a/snapshot/snapshotmaintenance/helper_test.go b/snapshot/snapshotmaintenance/helper_test.go index 0cb4a19a561..2574b52dc14 100644 --- a/snapshot/snapshotmaintenance/helper_test.go +++ b/snapshot/snapshotmaintenance/helper_test.go @@ -23,7 +23,7 @@ func createSnapshot(ctx context.Context, rep repo.RepositoryWriter, e fs.Entry, return nil, errors.Wrap(err, "unable to get policy tree") } - previous, err := findPreviousSnapshotManifest(ctx, rep, si) + previous, err := snapshot.FindPreviousManifests(ctx, rep, si, nil) if err != nil { return nil, err } @@ -42,37 +42,3 @@ func createSnapshot(ctx context.Context, rep repo.RepositoryWriter, e fs.Entry, return manifest, nil } - -// findPreviousSnapshotManifest returns the list of previous snapshots for a given source, including -// last complete snapshot and possibly some number of incomplete snapshots following it. -// this would belong in the snapshot package. -func findPreviousSnapshotManifest(ctx context.Context, rep repo.Repository, sourceInfo snapshot.SourceInfo) ([]*snapshot.Manifest, error) { - man, err := snapshot.ListSnapshots(ctx, rep, sourceInfo) - if err != nil { - return nil, errors.Wrap(err, "error listing previous snapshots") - } - - // phase 1 - find latest complete snapshot. - var previousComplete *snapshot.Manifest - - var result []*snapshot.Manifest - - for _, p := range man { - if p.IncompleteReason == "" && (previousComplete == nil || p.StartTime.After(previousComplete.StartTime)) { - previousComplete = p - } - } - - if previousComplete != nil { - result = append(result, previousComplete) - } - - // add all incomplete snapshots after that - for _, p := range man { - if p.IncompleteReason != "" && p.StartTime.After(previousComplete.StartTime) { - result = append(result, p) - } - } - - return result, nil -} From b8d9d9c69e9ae096ba3d82b30e3c68e7e35806f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 17:33:22 -0700 Subject: [PATCH 062/206] build(deps): bump the common-golang-dependencies group with 2 updates (#4502) Bumps the common-golang-dependencies group with 2 updates: [github.com/Azure/azure-sdk-for-go/sdk/azidentity](https://github.com/Azure/azure-sdk-for-go) and [google.golang.org/api](https://github.com/googleapis/google-api-go-client). Updates `github.com/Azure/azure-sdk-for-go/sdk/azidentity` from 1.8.2 to 1.9.0 - [Release notes](https://github.com/Azure/azure-sdk-for-go/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md) - [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azidentity/v1.8.2...sdk/azcore/v1.9.0) Updates `google.golang.org/api` from 0.228.0 to 0.229.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.228.0...v0.229.0) --- updated-dependencies: - dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azidentity dependency-version: 1.9.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: google.golang.org/api dependency-version: 0.229.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 40 ++++++++++++++++++++-------------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index 2f73ba1567c..8515a6a7b3c 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.23.8 require ( cloud.google.com/go/storage v1.51.0 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 github.com/alecthomas/kingpin/v2 v2.4.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 @@ -68,7 +68,7 @@ require ( golang.org/x/sys v0.32.0 golang.org/x/term v0.31.0 golang.org/x/text v0.24.0 - google.golang.org/api v0.228.0 + google.golang.org/api v0.229.0 google.golang.org/grpc v1.71.1 google.golang.org/protobuf v1.36.6 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 @@ -78,12 +78,12 @@ require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect cel.dev/expr v0.19.2 // indirect cloud.google.com/go v0.118.3 // indirect - cloud.google.com/go/auth v0.15.0 // indirect + cloud.google.com/go/auth v0.16.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect cloud.google.com/go/iam v1.4.1 // indirect cloud.google.com/go/monitoring v1.24.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect @@ -134,15 +134,15 @@ require ( github.com/xhit/go-str2duration/v2 v2.1.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect golang.org/x/time v0.11.0 // indirect google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 774e08013ba..6b8e4772ab3 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ cel.dev/expr v0.19.2 h1:V354PbqIXr9IQdwy4SYA4xa0HXaWq1BUPAGzugBY5V4= cel.dev/expr v0.19.2/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.118.3 h1:jsypSnrE/w4mJysioGdMBg4MiW/hHx/sArFpaBWHdME= cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc= -cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps= -cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= +cloud.google.com/go/auth v0.16.0 h1:Pd8P1s9WkcrBE2n/PhAwKsdrR35V3Sg2II9B+ndM3CU= +cloud.google.com/go/auth v0.16.0/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= @@ -24,12 +24,12 @@ cloud.google.com/go/trace v1.11.3 h1:c+I4YFjxRQjvAhRmSsmjpASUKq88chOX854ied0K/pE cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 h1:OVoM452qUFBrX+URdH3VpR299ma4kfom0yB0URYky9g= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0/go.mod h1:kUjrAo8bgEwLeZ/CmHqNl3Z/kPm7y6FKfxxK0izYUg4= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.0 h1:Bg8m3nq/X1DeePkAbCfb6ml6F3F0IunEhE8TMh+lY48= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.0/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 h1:UXT0o77lXQrikd1kgwIPQOUect7EoR/+sbP4wQKdzxM= @@ -171,8 +171,8 @@ github.com/hanwen/go-fuse/v2 v2.7.2/go.mod h1:ugNaD/iv5JYyS1Rcvi57Wz7/vrLQJo10mm github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= -github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= -github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= +github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= +github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= 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/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -247,8 +247,8 @@ github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= -github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= +github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= +github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= @@ -290,10 +290,10 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/detectors/gcp v1.34.0 h1:JRxssobiPg23otYU5SbWtQC//snGVIM3Tx6QRzlQBao= go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw= @@ -306,8 +306,8 @@ go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/ go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= -go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= -go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= +go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= @@ -407,14 +407,14 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.228.0 h1:X2DJ/uoWGnY5obVjewbp8icSL5U4FzuCfy9OjbLSnLs= -google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= +google.golang.org/api v0.229.0 h1:p98ymMtqeJ5i3lIBMj5MpR9kzIIgzpHHh8vQ+vgAzx8= +google.golang.org/api v0.229.0/go.mod h1:wyDfmq5g1wYJWn29O22FDWN48P7Xcz0xz+LBpptYvB0= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1:iK2jbkWL86DXjEx0qiHcRE9dE4/Ahua5k6V8OWFb//c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e h1:ztQaXfzEXTmCBvbtWYRhJxW+0iJcz2qXfd38/e9l7bA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= From cf0c3fa4a5397518e17d2524e66b144f33f59624 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 17:35:28 -0700 Subject: [PATCH 063/206] build(deps): bump github.com/prometheus/client_model (#4503) Bumps the telemetry-dependencies group with 1 update: [github.com/prometheus/client_model](https://github.com/prometheus/client_model). Updates `github.com/prometheus/client_model` from 0.6.1 to 0.6.2 - [Release notes](https://github.com/prometheus/client_model/releases) - [Commits](https://github.com/prometheus/client_model/compare/v0.6.1...v0.6.2) --- updated-dependencies: - dependency-name: github.com/prometheus/client_model dependency-version: 0.6.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: telemetry-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8515a6a7b3c..61e15f25e40 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( github.com/pkg/profile v1.7.0 github.com/pkg/sftp v1.13.9 github.com/prometheus/client_golang v1.22.0 - github.com/prometheus/client_model v0.6.1 + github.com/prometheus/client_model v0.6.2 github.com/prometheus/common v0.63.0 github.com/sanity-io/litter v1.5.8 github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 diff --git a/go.sum b/go.sum index 6b8e4772ab3..28b0f804bb6 100644 --- a/go.sum +++ b/go.sum @@ -241,8 +241,8 @@ github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74 github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= From 97ff2a17fbd6ceefbee74d0c602486cd6a18c09e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Tue, 15 Apr 2025 22:21:57 -0700 Subject: [PATCH 064/206] fix(general): `tempfile.Create` on Linux (x64/arm64) (#4504) - Add `TestCreateSucceedsWhenDirIsNotSpecified` - Use `os.TempDir` when `dir` is not specified (empty string) Ref: - Fixes #4331 - Fixes #2415 --- internal/tempfile/tempfile_linux.go | 2 ++ internal/tempfile/tempfile_test.go | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/internal/tempfile/tempfile_linux.go b/internal/tempfile/tempfile_linux.go index 5481b1274c4..a0694f92f24 100644 --- a/internal/tempfile/tempfile_linux.go +++ b/internal/tempfile/tempfile_linux.go @@ -10,6 +10,8 @@ import ( // Create creates a temporary file that will be automatically deleted on close. func Create(dir string) (*os.File, error) { + dir = tempDirOr(dir) + // on reasonably modern Linux (3.11 and above) O_TMPFILE is supported, // which creates invisible, unlinked file in a given directory. fd, err := unix.Open(dir, unix.O_RDWR|unix.O_TMPFILE|unix.O_CLOEXEC, permissions) diff --git a/internal/tempfile/tempfile_test.go b/internal/tempfile/tempfile_test.go index c2a2f6453a2..8c2dd08fc10 100644 --- a/internal/tempfile/tempfile_test.go +++ b/internal/tempfile/tempfile_test.go @@ -36,3 +36,12 @@ func TestTempFile(t *testing.T) { require.NoError(t, err) require.Empty(t, files) } + +func TestCreateSucceedsWhenDirIsNotSpecified(t *testing.T) { + f, err := tempfile.Create("") + + require.NoError(t, err) + + err = f.Close() + require.NoError(t, err) +} From 675e958877cf8f8947e549990c9992e2fc79dd32 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Wed, 16 Apr 2025 07:49:13 +0200 Subject: [PATCH 065/206] chore(ci): bump golangci-lint to v2.1.2 (#4500) Signed-off-by: Matthieu MOREL --- .golangci.yml | 335 ++++++++++-------- cli/command_notification_configure_common.go | 3 +- cli/command_policy_export.go | 2 +- cli/command_policy_import.go | 2 +- cli/command_repository_create_test.go | 4 +- cli/command_repository_upgrade_test.go | 2 +- cli/command_server_tls.go | 3 +- internal/epoch/epoch_manager_test.go | 2 +- internal/iocopy/iocopy_test.go | 2 +- internal/jsonencoding/jsonencoding.go | 2 +- internal/ownwrites/ownwrites.go | 2 +- .../parallelwork/parallel_work_queue_test.go | 6 +- .../providervalidation/providervalidation.go | 5 +- internal/server/api_repo.go | 2 +- internal/server/api_snapshots_test.go | 12 +- internal/server/api_ui_pref_test.go | 2 +- internal/server/grpc_session.go | 8 +- internal/uitask/uitask_test.go | 2 +- internal/wcmatch/wcmatch.go | 6 +- internal/webdavmount/webdavmount.go | 4 +- repo/api_server_repository.go | 2 +- repo/blob/azure/azure_pit.go | 2 +- repo/blob/azure/azure_storage.go | 2 +- repo/blob/config.go | 2 - repo/blob/filesystem/filesystem_storage.go | 2 +- repo/blob/gcs/gcs_pit.go | 2 +- repo/blob/gcs/gcs_storage.go | 4 +- repo/blob/gdrive/gdrive_storage.go | 7 +- repo/blob/rclone/rclone_storage.go | 2 +- repo/blob/s3/s3_pit.go | 2 +- repo/blob/s3/s3_storage_test.go | 4 +- repo/blob/s3/s3_versioned_test.go | 2 +- .../storagemetrics/storage_metrics_test.go | 2 +- repo/blob/webdav/webdav_storage.go | 4 +- repo/connect.go | 2 +- repo/content/index/one_use_index_builder.go | 3 +- repo/ecc/ecc_rs_crc.go | 2 +- repo/format/format_manager.go | 2 +- repo/format/format_set_parameters.go | 2 +- repo/format/upgrade_lock.go | 6 +- repo/format/upgrade_lock_intent_test.go | 2 +- repo/grpc_repository_client.go | 2 +- repo/initialize.go | 8 +- repo/logging/logging_buf_test.go | 2 +- repo/splitter/splitter_pool.go | 2 +- snapshot/manifest.go | 2 - snapshot/upload/upload_estimator.go | 4 +- snapshot/upload/upload_estimator_test.go | 8 +- snapshot/upload/upload_test.go | 2 +- tests/end_to_end_test/server_start_test.go | 2 +- tests/end_to_end_test/shallowrestore_test.go | 2 +- tests/end_to_end_test/snapshot_create_test.go | 2 +- tests/robustness/engine/engine_test.go | 4 +- tests/robustness/pathlock/path_lock_test.go | 6 +- tests/robustness/robustness_test/main_test.go | 4 +- .../kopia_snapshotter_upgrade_test.go | 2 +- tests/tools/fio/workload_test.go | 2 +- tests/tools/fswalker/fswalker.go | 2 - tools/cli2md/cli2md.go | 2 +- tools/gettool/checksums.txt | 12 +- tools/tools.mk | 2 +- 61 files changed, 270 insertions(+), 266 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 92be8a1e809..21e8556ebca 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,87 +1,81 @@ -linters-settings: - cyclop: - max-complexity: 20 - skip-tests: true - exhaustive: - # indicates that switch statements are to be considered exhaustive if a - # 'default' case is present, even if all enum members aren't listed in the - # switch - default-signifies-exhaustive: true - forbidigo: - forbid: - - filepath.IsAbs # use ospath.IsAbs which supports windows UNC paths - - ioutil.Discard # use io.Discard - - ioutil.NopCloser # use io.NopCloser - - ioutil.ReadAll # use io.ReadAll - - ioutil.ReadDir # use os.ReadDir - - ioutil.ReadFile # use os.ReadFile - - ioutil.TempDir # use os.MkdirTemp - - ioutil.TempFile # use os.CreateTemp - - ioutil.WriteFile # use os.WriteFile - - time.Now # do not use outside of 'clock' and 'timetrack' packages use clock.Now or timetrack.StartTimer - - time.Since # use timetrack.Timer.Elapsed() - - time.Until # never use this - - Envar\(\" # do not use envar literals, always wrap with EnvName() - funlen: - lines: 100 - statements: 60 - gci: - sections: - - standard - - default - - prefix(github.com/kopia/kopia) - gocognit: - min-complexity: 40 - goconst: - min-len: 5 - min-occurrences: 3 - gocritic: - settings: - hugeParam: - # size in bytes that makes the warning trigger (default 80) - sizeThreshold: 160 - enabled-tags: - - diagnostic - - experimental - - opinionated - - performance - - style - disabled-checks: - - whyNoLint - - wrapperFunc - gocyclo: - min-complexity: 15 - goimports: - local-prefixes: github.com/kopia/kopia - govet: - shadow: true - settings: - printf: - funcs: - - (*go.uber.org/zap.SugaredLogger).Debugf - - (*go.uber.org/zap.SugaredLogger).Infof - - (*go.uber.org/zap.SugaredLogger).Warnf - - (*go.uber.org/zap.SugaredLogger).Errorf - lll: - line-length: 256 - loggercheck: - zap: true - no-printf-like: true - rules: - - (*go.uber.org/zap.SugaredLogger).With - maligned: - suggest-new: true - misspell: - locale: US - +version: "2" linters: - enable-all: true + settings: + cyclop: + max-complexity: 20 + exhaustive: + # indicates that switch statements are to be considered exhaustive if a + # 'default' case is present, even if all enum members aren't listed in the + # switch + default-signifies-exhaustive: true + forbidigo: + forbid: + - pattern: filepath.IsAbs # use ospath.IsAbs which supports windows UNC paths + - pattern: ioutil.Discard # use io.Discard + - pattern: ioutil.NopCloser # use io.NopCloser + - pattern: ioutil.ReadAll # use io.ReadAll + - pattern: ioutil.ReadDir # use os.ReadDir + - pattern: ioutil.ReadFile # use os.ReadFile + - pattern: ioutil.TempDir # use os.MkdirTemp + - pattern: ioutil.TempFile # use os.CreateTemp + - pattern: ioutil.WriteFile # use os.WriteFile + - pattern: time.Now # do not use outside of 'clock' and 'timetrack' packages use clock.Now or timetrack.StartTimer + - pattern: time.Since # use timetrack.Timer.Elapsed() + - pattern: time.Until # never use this + - pattern: Envar\(\" # do not use envar literals, always wrap with EnvName() + funlen: + lines: 100 + statements: 60 + gocognit: + min-complexity: 40 + goconst: + min-len: 5 + min-occurrences: 3 + gocritic: + settings: + hugeParam: + # size in bytes that makes the warning trigger (default 80) + sizeThreshold: 160 + enabled-tags: + - diagnostic + - experimental + - opinionated + - performance + - style + disabled-checks: + - whyNoLint + - wrapperFunc + gocyclo: + min-complexity: 15 + govet: + enable-all: true + settings: + printf: + funcs: + - (*go.uber.org/zap.SugaredLogger).Debugf + - (*go.uber.org/zap.SugaredLogger).Infof + - (*go.uber.org/zap.SugaredLogger).Warnf + - (*go.uber.org/zap.SugaredLogger).Errorf + lll: + line-length: 256 + loggercheck: + zap: true + no-printf-like: true + rules: + - (*go.uber.org/zap.SugaredLogger).With + misspell: + locale: US + + default: all disable: + - gochecknoglobals - depguard - exhaustruct - - exportloopref + - exptostd + - forcetypeassert + - funcorder - gochecknoinits - - gci + - importas - ireturn # this one may be interesting to control allocations - gosmopolitan - musttag @@ -90,90 +84,119 @@ linters: - nonamedreturns - paralleltest - prealloc + - protogetter - rowserrcheck - sqlclosecheck - tagalign - tagliatelle - testpackage - tparallel + - usetesting - varnamelen # this one may be interesting, but too much churn - wastedassign - whitespace -issues: - exclude-use-default: false - exclude-rules: - - path: \.pb\.go - linters: - - gofmt - - path: reporter.go - linters: - - musttag - - path: _test\.go|testing|tests|test_env|fshasher|fault - linters: - - contextcheck - - errcheck - - errchkjson - - forcetypeassert - - funlen - - gochecknoglobals - - gocognit - - goconst - - mnd - - gosec - - musttag - - nestif - - perfsprint - - revive - - nolintlint - - wrapcheck - - wsl - - text: "log is a global variable" - linters: - - gochecknoglobals - - text: "tracer is a global variable" - linters: - - gochecknoglobals - # always allow ctx even when unused - - text: "unused-parameter: parameter 'ctx' seems to be unused" - linters: - - revive - - text: "Magic number: 1e" - linters: - - mnd - - text: "unnecessaryDefer" - linters: - - gocritic - - text: "filepathJoin" - linters: - - gocritic - - text: "weak cryptographic primitive" - linters: - - gosec - - text: "lines are duplicate of" - linters: - - dupl - - text: "Line contains TODO" - linters: - - godox - - text: "error returned from external package is unwrapped: sig: func github.com/kopia/kopia/internal/retry" - linters: - - wrapcheck - - text: "error returned from external package is unwrapped: sig: func github.com/kopia/kopia/internal/connection.UsingConnection" - linters: - - wrapcheck - - text: timeCmpSimplify - linters: - - gocritic - - text: ".*Magic number\\: [01]," - linters: - - mnd - - text: "Errors unhandled" - linters: - - gosec - - text: "unwrapped: sig: func github.com/kopia/kopia/fs.GetAllEntries" - linters: - - wrapcheck - - text: "float-compare: use require.InEpsilon" - linters: - - testifylint + exclusions: + generated: lax + rules: + - path: reporter.go + linters: + - musttag + - path: _test\.go|testing|tests|test_env|fshasher|fault + linters: + - contextcheck + - errcheck + - errchkjson + - forcetypeassert + - funlen + - gochecknoglobals + - gocognit + - goconst + - gosec + - mnd + - musttag + - nestif + - nolintlint + - perfsprint + - revive + - wrapcheck + - wsl + - text: "log is a global variable" + linters: + - gochecknoglobals + - text: "tracer is a global variable" + linters: + - gochecknoglobals + # always allow ctx even when unused + - text: "unused-parameter: parameter 'ctx' seems to be unused" + linters: + - revive + - text: "Magic number: 1e" + linters: + - mnd + - text: "unnecessaryDefer" + linters: + - gocritic + - text: "filepathJoin" + linters: + - gocritic + - text: "weak cryptographic primitive" + linters: + - gosec + - text: "lines are duplicate of" + linters: + - dupl + - text: "Line contains TODO" + linters: + - godox + - text: "error returned from external package is unwrapped: sig: func github.com/kopia/kopia/internal/retry" + linters: + - wrapcheck + - text: "error returned from external package is unwrapped: sig: func github.com/kopia/kopia/internal/connection.UsingConnection" + linters: + - wrapcheck + - text: timeCmpSimplify + linters: + - gocritic + - text: ".*Magic number\\: [01]," + linters: + - mnd + - text: "Errors unhandled" + linters: + - gosec + - text: "unwrapped: sig: func github.com/kopia/kopia/fs.GetAllEntries" + linters: + - wrapcheck + - text: "float-compare: use require.InEpsilon" + linters: + - testifylint + - text: "fieldalignment:" + linters: + - govet + - text: "shadow:" + linters: + - govet + - text: "unnamedResult:" + linters: + - gocritic + - linters: + - cyclop + path: (.+)_test\.go + warn-unused: true + +formatters: + enable: + - gci + - gofumpt + settings: + gci: + sections: + - standard + - default + - prefix(github.com/kopia/kopia) + +output: + show-stats: false + +run: + timeout: 20m diff --git a/cli/command_notification_configure_common.go b/cli/command_notification_configure_common.go index 75a1714c703..ab7ba48a7aa 100644 --- a/cli/command_notification_configure_common.go +++ b/cli/command_notification_configure_common.go @@ -3,10 +3,9 @@ package cli import ( "context" - "golang.org/x/exp/maps" - "github.com/alecthomas/kingpin/v2" "github.com/pkg/errors" + "golang.org/x/exp/maps" "github.com/kopia/kopia/notification" "github.com/kopia/kopia/notification/notifyprofile" diff --git a/cli/command_policy_export.go b/cli/command_policy_export.go index a44f6a437ce..1bfa92e1fe4 100644 --- a/cli/command_policy_export.go +++ b/cli/command_policy_export.go @@ -53,7 +53,7 @@ func (c *commandPolicyExport) run(ctx context.Context, rep repo.Repository) erro policies := make(map[string]*policy.Policy) - if c.policyTargetFlags.global || len(c.policyTargetFlags.targets) > 0 { + if c.global || len(c.targets) > 0 { targets, err := c.policyTargets(ctx, rep) if err != nil { return err diff --git a/cli/command_policy_import.go b/cli/command_policy_import.go index f9012d39fdc..df55156cbf3 100644 --- a/cli/command_policy_import.go +++ b/cli/command_policy_import.go @@ -67,7 +67,7 @@ func (c *commandPolicyImport) run(ctx context.Context, rep repo.RepositoryWriter var targetLimit []snapshot.SourceInfo - if c.policyTargetFlags.global || len(c.policyTargetFlags.targets) > 0 { + if c.global || len(c.targets) > 0 { targetLimit, err = c.policyTargets(ctx, rep) if err != nil { return err diff --git a/cli/command_repository_create_test.go b/cli/command_repository_create_test.go index f30670a68c6..9fd128b7f23 100644 --- a/cli/command_repository_create_test.go +++ b/cli/command_repository_create_test.go @@ -6,12 +6,12 @@ import ( "strings" "testing" + "github.com/stretchr/testify/require" + "github.com/kopia/kopia/repo" "github.com/kopia/kopia/repo/blob" "github.com/kopia/kopia/repo/blob/filesystem" "github.com/kopia/kopia/tests/testenv" - - "github.com/stretchr/testify/require" ) func TestRepositoryCreateWithConfigFile(t *testing.T) { diff --git a/cli/command_repository_upgrade_test.go b/cli/command_repository_upgrade_test.go index 7feccca0435..51000996c22 100644 --- a/cli/command_repository_upgrade_test.go +++ b/cli/command_repository_upgrade_test.go @@ -420,7 +420,7 @@ func TestRepositoryUpgrade_checkIndexInfo(t *testing.T) { for i, tc := range tcs { t.Run(strconv.Itoa(i), func(t *testing.T) { report := cli.CheckIndexInfo(tc.indexInfo0, tc.indexInfo1) - require.Equal(t, len(report), len(tc.expectRegexs), "unexpected report length") + require.Len(t, tc.expectRegexs, len(report), "unexpected report length") for i := range tc.expectRegexs { require.Regexp(t, tc.expectRegexs[i], report[i], "report does not match regular expression") } diff --git a/cli/command_server_tls.go b/cli/command_server_tls.go index 019af0c097d..a69d62add6d 100644 --- a/cli/command_server_tls.go +++ b/cli/command_server_tls.go @@ -17,9 +17,8 @@ import ( "strings" "time" - "github.com/pkg/errors" - "github.com/coreos/go-systemd/v22/activation" + "github.com/pkg/errors" "github.com/kopia/kopia/internal/tlsutil" ) diff --git a/internal/epoch/epoch_manager_test.go b/internal/epoch/epoch_manager_test.go index abc4ed76e20..af2edf15bd5 100644 --- a/internal/epoch/epoch_manager_test.go +++ b/internal/epoch/epoch_manager_test.go @@ -862,7 +862,7 @@ func verifySequentialWrites(t *testing.T, te *epochManagerTestEnv) { func TestIndexEpochManager_Disabled(t *testing.T) { te := newTestEnv(t) - te.mgr.paramProvider.(parameterProvider).Parameters.Enabled = false + te.mgr.paramProvider.(parameterProvider).Enabled = false _, err := te.mgr.Current(testlogging.Context(t)) require.Error(t, err) diff --git a/internal/iocopy/iocopy_test.go b/internal/iocopy/iocopy_test.go index 2644508ab61..c880e98af79 100644 --- a/internal/iocopy/iocopy_test.go +++ b/internal/iocopy/iocopy_test.go @@ -20,7 +20,7 @@ const ( type errorWriter struct{} func (errorWriter) Write(p []byte) (n int, err error) { - return 0, errors.New("write error") //nolint:goerr113 + return 0, errors.New("write error") //nolint:err113 } func TestGetBuffer(t *testing.T) { diff --git a/internal/jsonencoding/jsonencoding.go b/internal/jsonencoding/jsonencoding.go index 3c369c0699a..dec9103e3f4 100644 --- a/internal/jsonencoding/jsonencoding.go +++ b/internal/jsonencoding/jsonencoding.go @@ -9,7 +9,7 @@ import ( ) // Duration adds text/json (un)marshaling functions to time.Duration. -type Duration struct { //nolint: recvcheck +type Duration struct { time.Duration } diff --git a/internal/ownwrites/ownwrites.go b/internal/ownwrites/ownwrites.go index a2a0e2f974c..3e5312d2775 100644 --- a/internal/ownwrites/ownwrites.go +++ b/internal/ownwrites/ownwrites.go @@ -105,7 +105,7 @@ func (s *CacheStorage) ListBlobs(ctx context.Context, prefix blob.ID, cb func(bl // This will be slower than ListBlobs() but we're expecting this set to be empty // most of the time because eventual consistency effects don't show up too often. for blobID := range cachedCreatedSet { - bm, err := s.Storage.GetMetadata(ctx, blobID) + bm, err := s.GetMetadata(ctx, blobID) if errors.Is(err, blob.ErrBlobNotFound) { // blob did not exist in storage, but we had the marker in cache, ignore. continue diff --git a/internal/parallelwork/parallel_work_queue_test.go b/internal/parallelwork/parallel_work_queue_test.go index 38e95244808..b0359263de9 100644 --- a/internal/parallelwork/parallel_work_queue_test.go +++ b/internal/parallelwork/parallel_work_queue_test.go @@ -80,7 +80,7 @@ func TestEnqueueBackAndProcess(t *testing.T) { func TestProcessWithError(t *testing.T) { queue := parallelwork.NewQueue() - testError := errors.New("test error") //nolint:goerr113 + testError := errors.New("test error") //nolint:err113 // Enqueue work items, one of them returns an error queue.EnqueueBack(context.Background(), func() error { @@ -165,7 +165,7 @@ func TestOnNthCompletion(t *testing.T) { t.Run("callback is only called on n-th invocation", func(t *testing.T) { var ( n = 5 // expect invocation on 5th attempt - errCalled = errors.New("called") //nolint:goerr113 + errCalled = errors.New("called") //nolint:err113 callbackInvoked int callback = func() error { callbackInvoked++ @@ -198,7 +198,7 @@ func TestOnNthCompletion(t *testing.T) { var ( n = 5 // expect invocation on 5th attempt results = make(chan error, n+1) // we will have n+1, i.e. 6 attempts in total - errCalled = errors.New("called") //nolint:goerr113 + errCalled = errors.New("called") //nolint:err113 callbackInvoked atomic.Int32 wg sync.WaitGroup callback = func() error { diff --git a/internal/providervalidation/providervalidation.go b/internal/providervalidation/providervalidation.go index 37d2ebb80a9..8106efe8cd7 100644 --- a/internal/providervalidation/providervalidation.go +++ b/internal/providervalidation/providervalidation.go @@ -19,9 +19,8 @@ import ( "github.com/kopia/kopia/internal/clock" "github.com/kopia/kopia/internal/gather" "github.com/kopia/kopia/repo/blob" - "github.com/kopia/kopia/repo/logging" - loggingwrapper "github.com/kopia/kopia/repo/blob/logging" + "github.com/kopia/kopia/repo/logging" ) // Options provides options for provider validation. @@ -447,7 +446,7 @@ func (c *concurrencyTest) getMetadataWorker(ctx context.Context, worker int) fun } } -func (c *concurrencyTest) listBlobWorker(ctx context.Context, worker int) func() error { +func (c *concurrencyTest) listBlobWorker(_ context.Context, worker int) func() error { // TODO: implement me _ = worker diff --git a/internal/server/api_repo.go b/internal/server/api_repo.go index 46b72114e56..04b38de094d 100644 --- a/internal/server/api_repo.go +++ b/internal/server/api_repo.go @@ -328,7 +328,7 @@ func handleRepoSetThrottle(ctx context.Context, rc requestContext) (interface{}, func (s *Server) getConnectOptions(cliOpts repo.ClientOptions) *repo.ConnectOptions { o := *s.options.ConnectOptions - o.ClientOptions = o.ClientOptions.Override(cliOpts) + o.ClientOptions = o.Override(cliOpts) return &o } diff --git a/internal/server/api_snapshots_test.go b/internal/server/api_snapshots_test.go index 00977a1298f..3116e6fe800 100644 --- a/internal/server/api_snapshots_test.go +++ b/internal/server/api_snapshots_test.go @@ -233,8 +233,8 @@ func TestEditSnapshots(t *testing.T) { }, &updated)) require.Len(t, updated, 1) - require.EqualValues(t, []string{"pin1", "pin2"}, updated[0].Pins) - require.EqualValues(t, newDesc1, updated[0].Description) + require.Equal(t, []string{"pin1", "pin2"}, updated[0].Pins) + require.Equal(t, newDesc1, updated[0].Description) require.NoError(t, cli.Post(ctx, "snapshots/edit", &serverapi.EditSnapshotsRequest{ Snapshots: []manifest.ID{updated[0].ID}, @@ -244,8 +244,8 @@ func TestEditSnapshots(t *testing.T) { }, &updated)) require.Len(t, updated, 1) - require.EqualValues(t, []string{"pin2", "pin3"}, updated[0].Pins) - require.EqualValues(t, newDesc2, updated[0].Description) + require.Equal(t, []string{"pin2", "pin3"}, updated[0].Pins) + require.Equal(t, newDesc2, updated[0].Description) require.NoError(t, cli.Post(ctx, "snapshots/edit", &serverapi.EditSnapshotsRequest{ Snapshots: []manifest.ID{updated[0].ID}, @@ -253,6 +253,6 @@ func TestEditSnapshots(t *testing.T) { }, &updated)) require.Len(t, updated, 1) - require.EqualValues(t, []string{"pin2"}, updated[0].Pins) - require.EqualValues(t, newDesc2, updated[0].Description) + require.Equal(t, []string{"pin2"}, updated[0].Pins) + require.Equal(t, newDesc2, updated[0].Description) } diff --git a/internal/server/api_ui_pref_test.go b/internal/server/api_ui_pref_test.go index 02b3d0b2b9f..7e512be2259 100644 --- a/internal/server/api_ui_pref_test.go +++ b/internal/server/api_ui_pref_test.go @@ -29,7 +29,7 @@ func TestUIPreferences(t *testing.T) { var p, p2 serverapi.UIPreferences require.NoError(t, cli.Get(ctx, "ui-preferences", nil, &p)) - require.Equal(t, "", p.Theme) + require.Empty(t, p.Theme) p.Theme = "dark" require.NoError(t, cli.Put(ctx, "ui-preferences", &p, &serverapi.Empty{})) diff --git a/internal/server/grpc_session.go b/internal/server/grpc_session.go index e532b2886d2..0612fb22eb9 100644 --- a/internal/server/grpc_session.go +++ b/internal/server/grpc_session.go @@ -41,8 +41,8 @@ type grpcServerState struct { // send sends the provided session response with the provided request ID. func (s *Server) send(srv grpcapi.KopiaRepository_SessionServer, requestID int64, resp *grpcapi.SessionResponse) error { - s.grpcServerState.sendMutex.Lock() - defer s.grpcServerState.sendMutex.Unlock() + s.sendMutex.Lock() + defer s.sendMutex.Unlock() resp.RequestId = requestID @@ -125,12 +125,12 @@ func (s *Server) Session(srv grpcapi.KopiaRepository_SessionServer) error { } // enforce limit on concurrent handling - if err := s.grpcServerState.sem.Acquire(ctx, 1); err != nil { + if err := s.sem.Acquire(ctx, 1); err != nil { return errors.Wrap(err, "unable to acquire semaphore") } go func() { - defer s.grpcServerState.sem.Release(1) + defer s.sem.Release(1) s.handleSessionRequest(ctx, dw, authz, usernameAtHostname, req, func(resp *grpcapi.SessionResponse) { if err := s.send(srv, req.GetRequestId(), resp); err != nil { diff --git a/internal/uitask/uitask_test.go b/internal/uitask/uitask_test.go index c6edbdefa1c..033ff2ddd13 100644 --- a/internal/uitask/uitask_test.go +++ b/internal/uitask/uitask_test.go @@ -30,7 +30,7 @@ func TestUITask_withoutPersistentLogging(t *testing.T) { m := uitask.NewManager(false) testUITaskInternal(t, ctx, m) - require.Equal(t, "", logBuf.String()) + require.Empty(t, logBuf.String()) } func TestUITask_withPersistentLogging(t *testing.T) { diff --git a/internal/wcmatch/wcmatch.go b/internal/wcmatch/wcmatch.go index 4197985f6f9..aca5b788d32 100644 --- a/internal/wcmatch/wcmatch.go +++ b/internal/wcmatch/wcmatch.go @@ -389,11 +389,7 @@ func doMatch(tokens []token, text []rune, ignoreCase bool) matchResult { break } - for { - if t.eos() { - break - } - + for !t.eos() { matchResult := doMatch(tokens[pi+1:], text[t.pos:], ignoreCase) if matchResult != wcNoMatch { if !token.doubleStar || matchResult != wcAbortToDoubleStar { diff --git a/internal/webdavmount/webdavmount.go b/internal/webdavmount/webdavmount.go index 57fa0e63c33..9bbc170483f 100644 --- a/internal/webdavmount/webdavmount.go +++ b/internal/webdavmount/webdavmount.go @@ -26,7 +26,7 @@ var ( type webdavFile struct { // webdavFile implements webdav.File but needs context // +checklocks:mu - ctx context.Context //nolint:containedctx + ctx context.Context entry fs.File @@ -100,7 +100,7 @@ func (f *webdavFile) Close() error { type webdavDir struct { // webdavDir implements webdav.File but needs context - ctx context.Context //nolint:containedctx + ctx context.Context w *webdavFS info os.FileInfo diff --git a/repo/api_server_repository.go b/repo/api_server_repository.go index 11cc4048321..b1031ebda05 100644 --- a/repo/api_server_repository.go +++ b/repo/api_server_repository.go @@ -22,7 +22,7 @@ type APIServerInfo struct { func ConnectAPIServer(ctx context.Context, configFile string, si *APIServerInfo, password string, opt *ConnectOptions) error { lc := LocalConfig{ APIServer: si, - ClientOptions: opt.ClientOptions.ApplyDefaults(ctx, "API Server: "+si.BaseURL), + ClientOptions: opt.ApplyDefaults(ctx, "API Server: "+si.BaseURL), } if err := setupCachingOptionsWithDefaults(ctx, configFile, &lc, &opt.CachingOptions, []byte(si.BaseURL)); err != nil { diff --git a/repo/blob/azure/azure_pit.go b/repo/blob/azure/azure_pit.go index a5f15c86e18..6207f7f6dd3 100644 --- a/repo/blob/azure/azure_pit.go +++ b/repo/blob/azure/azure_pit.go @@ -180,7 +180,7 @@ func (az *azPointInTimeStorage) isAzureDeleteMarker(it *azblobmodels.BlobItem) b // maybePointInTimeStore wraps s with a point-in-time store when s is versioned // and a point-in-time value is specified. Otherwise, s is returned. func maybePointInTimeStore(ctx context.Context, s *azStorage, pointInTime *time.Time) (blob.Storage, error) { - if pit := s.Options.PointInTime; pit == nil || pit.IsZero() { + if pit := s.PointInTime; pit == nil || pit.IsZero() { return s, nil } diff --git a/repo/blob/azure/azure_storage.go b/repo/blob/azure/azure_storage.go index 42777975021..4c4379acf37 100644 --- a/repo/blob/azure/azure_storage.go +++ b/repo/blob/azure/azure_storage.go @@ -239,7 +239,7 @@ func (az *azStorage) ConnectionInfo() blob.ConnectionInfo { } func (az *azStorage) DisplayName() string { - return fmt.Sprintf("Azure: %v", az.Options.Container) + return fmt.Sprintf("Azure: %v", az.Container) } func (az *azStorage) getBlobName(it *azblobmodels.BlobItem) blob.ID { diff --git a/repo/blob/config.go b/repo/blob/config.go index 4ec6da659e5..215fe1282b0 100644 --- a/repo/blob/config.go +++ b/repo/blob/config.go @@ -7,8 +7,6 @@ import ( ) // ConnectionInfo represents JSON-serializable configuration of a blob storage. -// -//nolint:recvcheck type ConnectionInfo struct { Type string Config interface{} diff --git a/repo/blob/filesystem/filesystem_storage.go b/repo/blob/filesystem/filesystem_storage.go index ed256157439..4e9a1e85274 100644 --- a/repo/blob/filesystem/filesystem_storage.go +++ b/repo/blob/filesystem/filesystem_storage.go @@ -292,7 +292,7 @@ func (fs *fsStorage) TouchBlob(ctx context.Context, blobID blob.ID, threshold ti //nolint:wrapcheck,forcetypeassert err := retry.WithExponentialBackoffNoValue(ctx, "TouchBlob", func() error { - _, path, err := fs.Storage.GetShardedPathAndFilePath(ctx, blobID) + _, path, err := fs.GetShardedPathAndFilePath(ctx, blobID) if err != nil { return errors.Wrap(err, "error getting sharded path") } diff --git a/repo/blob/gcs/gcs_pit.go b/repo/blob/gcs/gcs_pit.go index 6a552744ec7..4b75435f137 100644 --- a/repo/blob/gcs/gcs_pit.go +++ b/repo/blob/gcs/gcs_pit.go @@ -120,7 +120,7 @@ func getOlderThan(vs []versionMetadata, t time.Time) []versionMetadata { // maybePointInTimeStore wraps s with a point-in-time store when s is versioned // and a point-in-time value is specified. Otherwise s is returned. func maybePointInTimeStore(ctx context.Context, gcs *gcsStorage, pointInTime *time.Time) (blob.Storage, error) { - if pit := gcs.Options.PointInTime; pit == nil || pit.IsZero() { + if pit := gcs.PointInTime; pit == nil || pit.IsZero() { return gcs, nil } diff --git a/repo/blob/gcs/gcs_storage.go b/repo/blob/gcs/gcs_storage.go index 6b8ed3b3db6..9ad8faa78ab 100644 --- a/repo/blob/gcs/gcs_storage.go +++ b/repo/blob/gcs/gcs_storage.go @@ -137,11 +137,11 @@ func (gcs *gcsStorage) PutBlob(ctx context.Context, b blob.ID, data blob.Bytes, writer := obj.NewWriter(ctx) writer.ChunkSize = writerChunkSize writer.ContentType = "application/x-kopia" - writer.ObjectAttrs.Metadata = timestampmeta.ToMap(opts.SetModTime, timeMapKey) + writer.Metadata = timestampmeta.ToMap(opts.SetModTime, timeMapKey) if opts.RetentionPeriod != 0 { retainUntilDate := clock.Now().Add(opts.RetentionPeriod).UTC() - writer.ObjectAttrs.Retention = &gcsclient.ObjectRetention{ + writer.Retention = &gcsclient.ObjectRetention{ Mode: string(blob.Locked), RetainUntil: retainUntilDate, } diff --git a/repo/blob/gdrive/gdrive_storage.go b/repo/blob/gdrive/gdrive_storage.go index d37881a787c..7f4e0e1d740 100644 --- a/repo/blob/gdrive/gdrive_storage.go +++ b/repo/blob/gdrive/gdrive_storage.go @@ -473,12 +473,11 @@ func translateError(err error) error { } } - switch { - case err == nil: - return nil - default: + if err != nil { return errors.Wrap(err, "unexpected Google Drive error") } + + return nil } func tokenSourceFromCredentialsFile(ctx context.Context, fn string, scopes ...string) (oauth2.TokenSource, error) { diff --git a/repo/blob/rclone/rclone_storage.go b/repo/blob/rclone/rclone_storage.go index 72478f7f6ac..5d96ebbe6cd 100644 --- a/repo/blob/rclone/rclone_storage.go +++ b/repo/blob/rclone/rclone_storage.go @@ -120,7 +120,7 @@ func (r *rcloneStorage) Close(ctx context.Context) error { } func (r *rcloneStorage) DisplayName() string { - return "RClone " + r.Options.RemotePath + return "RClone " + r.RemotePath } func (r *rcloneStorage) processStderrStatus(ctx context.Context, s *bufio.Scanner) { diff --git a/repo/blob/s3/s3_pit.go b/repo/blob/s3/s3_pit.go index e6ca0c564f6..1e87bd15f4f 100644 --- a/repo/blob/s3/s3_pit.go +++ b/repo/blob/s3/s3_pit.go @@ -118,7 +118,7 @@ func getOlderThan(vs []versionMetadata, t time.Time) []versionMetadata { // maybePointInTimeStore wraps s with a point-in-time store when s is versioned // and a point-in-time value is specified. Otherwise s is returned. func maybePointInTimeStore(ctx context.Context, s *s3Storage, pointInTime *time.Time) (blob.Storage, error) { - if pit := s.Options.PointInTime; pit == nil || pit.IsZero() { + if pit := s.PointInTime; pit == nil || pit.IsZero() { return s, nil } diff --git a/repo/blob/s3/s3_storage_test.go b/repo/blob/s3/s3_storage_test.go index 2a9c73613d0..577013cdaeb 100644 --- a/repo/blob/s3/s3_storage_test.go +++ b/repo/blob/s3/s3_storage_test.go @@ -545,7 +545,7 @@ func TestNeedMD5AWS(t *testing.T) { func testStorage(t *testing.T, options *Options, runValidationTest bool, opts blob.PutOptions) { ctx := testlogging.Context(t) - require.Equal(t, "", options.Prefix) + require.Empty(t, options.Prefix) st0, err := New(ctx, options, false) @@ -579,7 +579,7 @@ func testStorage(t *testing.T, options *Options, runValidationTest bool, opts bl func testPutBlobWithInvalidRetention(t *testing.T, options Options, opts blob.PutOptions) { ctx := testlogging.Context(t) - require.Equal(t, "", options.Prefix) + require.Empty(t, options.Prefix) options.Prefix = uuid.NewString() // non-retrying storage diff --git a/repo/blob/s3/s3_versioned_test.go b/repo/blob/s3/s3_versioned_test.go index 4dfd017afcb..b337f63042e 100644 --- a/repo/blob/s3/s3_versioned_test.go +++ b/repo/blob/s3/s3_versioned_test.go @@ -765,7 +765,7 @@ func compareVersionSlices(tb testing.TB, a, b []versionMetadata) { compareMetadata(tb, a[i], b[i]) } - require.Equal(tb, len(a), len(b), "the number of the blob versions to compare does not match", a, b) + require.Len(tb, b, len(a), "the number of the blob versions to compare does not match", a, b) } func reverseVersionSlice(m []versionMetadata) []versionMetadata { diff --git a/repo/blob/storagemetrics/storage_metrics_test.go b/repo/blob/storagemetrics/storage_metrics_test.go index 05141b93bba..04f2831df01 100644 --- a/repo/blob/storagemetrics/storage_metrics_test.go +++ b/repo/blob/storagemetrics/storage_metrics_test.go @@ -284,5 +284,5 @@ func requireCounterValue(t *testing.T, snap metrics.Snapshot, key string, want i v, ok := snap.Counters[key] require.True(t, ok) - require.EqualValues(t, want, v) + require.Equal(t, want, v) } diff --git a/repo/blob/webdav/webdav_storage.go b/repo/blob/webdav/webdav_storage.go index c84044e2340..94009fc6ba3 100644 --- a/repo/blob/webdav/webdav_storage.go +++ b/repo/blob/webdav/webdav_storage.go @@ -152,7 +152,7 @@ func (d *davStorageImpl) PutBlobInPath(ctx context.Context, dirPath, filePath st var writePath string - if d.Options.AtomicWrites { + if d.AtomicWrites { writePath = filePath } else { writePath = fmt.Sprintf("%v-%v", filePath, rand.Int63()) //nolint:gosec @@ -171,7 +171,7 @@ func (d *davStorageImpl) PutBlobInPath(ctx context.Context, dirPath, filePath st err := d.translateError(d.cli.Write(writePath, b, defaultFilePerm)) if err == nil { - if d.Options.AtomicWrites { + if d.AtomicWrites { return nil } diff --git a/repo/connect.go b/repo/connect.go index b1cef53f9b8..48975c9586c 100644 --- a/repo/connect.go +++ b/repo/connect.go @@ -51,7 +51,7 @@ func Connect(ctx context.Context, configFile string, st blob.Storage, password s ci := st.ConnectionInfo() lc.Storage = &ci - lc.ClientOptions = opt.ClientOptions.ApplyDefaults(ctx, "Repository in "+st.DisplayName()) + lc.ClientOptions = opt.ApplyDefaults(ctx, "Repository in "+st.DisplayName()) if err = setupCachingOptionsWithDefaults(ctx, configFile, &lc, &opt.CachingOptions, f.UniqueID); err != nil { return errors.Wrap(err, "unable to set up caching") diff --git a/repo/content/index/one_use_index_builder.go b/repo/content/index/one_use_index_builder.go index 56cdee1c247..c7255321f62 100644 --- a/repo/content/index/one_use_index_builder.go +++ b/repo/content/index/one_use_index_builder.go @@ -5,9 +5,8 @@ import ( "hash/fnv" "io" - "github.com/pkg/errors" - "github.com/petar/GoLLRB/llrb" + "github.com/pkg/errors" "github.com/kopia/kopia/internal/gather" ) diff --git a/repo/ecc/ecc_rs_crc.go b/repo/ecc/ecc_rs_crc.go index 1fd1e45626c..ce85da8608e 100644 --- a/repo/ecc/ecc_rs_crc.go +++ b/repo/ecc/ecc_rs_crc.go @@ -312,7 +312,7 @@ func (r *ReedSolomonCrcECC) Decrypt(input gather.Bytes, _ []byte, output *gather } } - if r.Options.DeleteFirstShardForTests { + if r.DeleteFirstShardForTests { shards[0] = nil } diff --git a/repo/format/format_manager.go b/repo/format/format_manager.go index 1f24d6e0a60..1de22f61540 100644 --- a/repo/format/format_manager.go +++ b/repo/format/format_manager.go @@ -465,7 +465,7 @@ func Initialize(ctx context.Context, st blob.Storage, formatBlob *KopiaRepositor return errors.Wrap(err, "unable to derive format encryption key") } - if err = repoConfig.MutableParameters.Validate(); err != nil { + if err = repoConfig.Validate(); err != nil { return errors.Wrap(err, "invalid parameters") } diff --git a/repo/format/format_set_parameters.go b/repo/format/format_set_parameters.go index b91688a9a1b..4fd0108de77 100644 --- a/repo/format/format_set_parameters.go +++ b/repo/format/format_set_parameters.go @@ -27,7 +27,7 @@ func (m *Manager) SetParameters( return errors.Wrap(err, "invalid blob-config options") } - m.repoConfig.ContentFormat.MutableParameters = mp + m.repoConfig.MutableParameters = mp m.repoConfig.RequiredFeatures = requiredFeatures if err := m.j.EncryptRepositoryConfig(m.repoConfig, m.formatEncryptionKey); err != nil { diff --git a/repo/format/upgrade_lock.go b/repo/format/upgrade_lock.go index 48680e598b2..a959037dba5 100644 --- a/repo/format/upgrade_lock.go +++ b/repo/format/upgrade_lock.go @@ -51,9 +51,9 @@ func (m *Manager) SetUpgradeLockIntent(ctx context.Context, l UpgradeLockIntent) if m.repoConfig.UpgradeLock == nil { // when we are putting a new lock then ensure that we can upgrade // to that version - if m.repoConfig.ContentFormat.Version >= MaxFormatVersion { + if m.repoConfig.Version >= MaxFormatVersion { return nil, errors.WithMessagef(ErrFormatUptoDate, "repository is using version %d, and version %d is the maximum", - m.repoConfig.ContentFormat.Version, MaxFormatVersion) + m.repoConfig.Version, MaxFormatVersion) } // backup the current repository config from local cache to the @@ -66,7 +66,7 @@ func (m *Manager) SetUpgradeLockIntent(ctx context.Context, l UpgradeLockIntent) m.repoConfig.UpgradeLock = &l // mark the upgrade to the new format version, this will ensure that older // clients won't be able to parse the new version - m.repoConfig.ContentFormat.Version = MaxFormatVersion + m.repoConfig.Version = MaxFormatVersion } else if newL, err := m.repoConfig.UpgradeLock.Update(&l); err == nil { m.repoConfig.UpgradeLock = newL } else { diff --git a/repo/format/upgrade_lock_intent_test.go b/repo/format/upgrade_lock_intent_test.go index a5ffcc09f56..520c91aa4a4 100644 --- a/repo/format/upgrade_lock_intent_test.go +++ b/repo/format/upgrade_lock_intent_test.go @@ -337,5 +337,5 @@ func TestUpgradeLockIntentClone(t *testing.T) { Message: "upgrading from format version 2 -> 3", MaxPermittedClockDrift: 5 * time.Second, } - require.EqualValues(t, l, l.Clone()) + require.Equal(t, l, l.Clone()) } diff --git a/repo/grpc_repository_client.go b/repo/grpc_repository_client.go index 85d260af323..0232abcf451 100644 --- a/repo/grpc_repository_client.go +++ b/repo/grpc_repository_client.go @@ -878,7 +878,7 @@ func openGRPCAPIRepository(ctx context.Context, si *APIServerInfo, password stri return nil, errors.Wrap(err, "gRPC client creation error") } - par.refCountedCloser.registerEarlyCloseFunc( + par.registerEarlyCloseFunc( func(ctx context.Context) error { return errors.Wrap(conn.Close(), "error closing GRPC connection") }) diff --git a/repo/initialize.go b/repo/initialize.go index ce1c931d92b..fd10b1e0433 100644 --- a/repo/initialize.go +++ b/repo/initialize.go @@ -111,12 +111,12 @@ func repositoryObjectFormatFromOptions(opt *NewRepositoryOptions) (*format.Repos f.HMACSecret = nil } - if fv == format.FormatVersion1 || f.ContentFormat.ECCOverheadPercent == 0 { - f.ContentFormat.ECC = "" - f.ContentFormat.ECCOverheadPercent = 0 + if fv == format.FormatVersion1 || f.ECCOverheadPercent == 0 { + f.ECC = "" + f.ECCOverheadPercent = 0 } - if err := f.ContentFormat.ResolveFormatVersion(); err != nil { + if err := f.ResolveFormatVersion(); err != nil { return nil, errors.Wrap(err, "error resolving format version") } diff --git a/repo/logging/logging_buf_test.go b/repo/logging/logging_buf_test.go index 147a6b360ba..2e5dc31a6d3 100644 --- a/repo/logging/logging_buf_test.go +++ b/repo/logging/logging_buf_test.go @@ -50,7 +50,7 @@ func TestLoggingBuffer_Append(t *testing.T) { b := logging.GetBuffer() defer b.Release() - require.Equal(t, "", b.String()) + require.Empty(t, b.String()) require.Equal(t, "xx ABC D -42 -23 true 42 false 23 2000-01-02T03:04:05Z", diff --git a/repo/splitter/splitter_pool.go b/repo/splitter/splitter_pool.go index c7a01528d6c..6ea7e2e6e4d 100644 --- a/repo/splitter/splitter_pool.go +++ b/repo/splitter/splitter_pool.go @@ -10,7 +10,7 @@ type recyclableSplitter struct { } func (s recyclableSplitter) Close() { - s.Splitter.Reset() + s.Reset() s.Splitter.Close() s.pool.Put(s.Splitter) } diff --git a/snapshot/manifest.go b/snapshot/manifest.go index 5165894b065..5a8d44bab24 100644 --- a/snapshot/manifest.go +++ b/snapshot/manifest.go @@ -84,8 +84,6 @@ const ( ) // Permissions encapsulates UNIX permissions for a filesystem entry. -// -//nolint:recvcheck type Permissions int // MarshalJSON emits permissions as octal string. diff --git a/snapshot/upload/upload_estimator.go b/snapshot/upload/upload_estimator.go index f3b7c9e8c1d..1ebcfd6d736 100644 --- a/snapshot/upload/upload_estimator.go +++ b/snapshot/upload/upload_estimator.go @@ -4,12 +4,12 @@ import ( "context" "sync" + "github.com/pkg/errors" + "github.com/kopia/kopia/fs" vsi "github.com/kopia/kopia/internal/volumesizeinfo" "github.com/kopia/kopia/repo/logging" "github.com/kopia/kopia/snapshot/policy" - - "github.com/pkg/errors" ) // EstimationDoneFn represents the signature of the callback function which will be invoked when an estimation is done. diff --git a/snapshot/upload/upload_estimator_test.go b/snapshot/upload/upload_estimator_test.go index 737af4bb052..8125a32b298 100644 --- a/snapshot/upload/upload_estimator_test.go +++ b/snapshot/upload/upload_estimator_test.go @@ -6,15 +6,15 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "github.com/kopia/kopia/internal/mockfs" vsi "github.com/kopia/kopia/internal/volumesizeinfo" "github.com/kopia/kopia/repo/logging" "github.com/kopia/kopia/snapshot/policy" "github.com/kopia/kopia/snapshot/upload" - - "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" ) var errSimulated = errors.New("simulated error") diff --git a/snapshot/upload/upload_test.go b/snapshot/upload/upload_test.go index 0b3871a95b8..849deff20ce 100644 --- a/snapshot/upload/upload_test.go +++ b/snapshot/upload/upload_test.go @@ -409,7 +409,7 @@ func TestUpload_SubDirectoryReadFailureFailFast(t *testing.T) { man, err := u.Upload(ctx, th.sourceDir, policyTree, snapshot.SourceInfo{}) require.NoError(t, err) - require.NotEqual(t, "", man.IncompleteReason, "snapshot not marked as incomplete") + require.NotEmpty(t, man.IncompleteReason, "snapshot not marked as incomplete") // will have one error because we're canceling early. verifyErrors(t, man, 1, 0, diff --git a/tests/end_to_end_test/server_start_test.go b/tests/end_to_end_test/server_start_test.go index ca24410aafc..0e43073edb1 100644 --- a/tests/end_to_end_test/server_start_test.go +++ b/tests/end_to_end_test/server_start_test.go @@ -490,7 +490,7 @@ func TestServerScheduling(t *testing.T) { testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "maintenance", "info", "--json"), &miAfter) // make sure we got some maintenance runs - numRuns := len(miAfter.Schedule.Runs["cleanup-logs"]) - len(miBefore.Schedule.Runs["cleanup-logs"]) + numRuns := len(miAfter.Runs["cleanup-logs"]) - len(miBefore.Runs["cleanup-logs"]) require.Greater(t, numRuns, 2) require.Less(t, numRuns, 5) } diff --git a/tests/end_to_end_test/shallowrestore_test.go b/tests/end_to_end_test/shallowrestore_test.go index ce3114ee70f..4fbca7f97ae 100644 --- a/tests/end_to_end_test/shallowrestore_test.go +++ b/tests/end_to_end_test/shallowrestore_test.go @@ -760,7 +760,7 @@ func findFileDir(t *testing.T, shallow string) (dirinshallow, fileinshallow stri fi, err := os.Lstat(f) require.NoError(t, err) - if !(fi.Mode().IsDir() || fi.Mode().IsRegular()) { + if !fi.Mode().IsDir() && !fi.Mode().IsRegular() { continue } diff --git a/tests/end_to_end_test/snapshot_create_test.go b/tests/end_to_end_test/snapshot_create_test.go index 16a13b3dc18..15057991c03 100644 --- a/tests/end_to_end_test/snapshot_create_test.go +++ b/tests/end_to_end_test/snapshot_create_test.go @@ -755,7 +755,7 @@ func TestSnapshotCreateAllSnapshotPath(t *testing.T) { // all non-global policies should be manual for _, p := range plist { if (p.Target != snapshot.SourceInfo{}) { - require.True(t, p.Policy.SchedulingPolicy.Manual) + require.True(t, p.SchedulingPolicy.Manual) } } diff --git a/tests/robustness/engine/engine_test.go b/tests/robustness/engine/engine_test.go index e3d490fe719..f6c39a39cce 100644 --- a/tests/robustness/engine/engine_test.go +++ b/tests/robustness/engine/engine_test.go @@ -541,7 +541,7 @@ func TestActionsFilesystem(t *testing.T) { numActions := 10 for range numActions { err := eng.RandomAction(ctx, actionOpts) - if !(err == nil || errors.Is(err, robustness.ErrNoOp)) { + if err != nil && !errors.Is(err, robustness.ErrNoOp) { t.Error("Hit error", err) } } @@ -588,7 +588,7 @@ func TestActionsS3(t *testing.T) { numActions := 10 for range numActions { err := eng.RandomAction(ctx, actionOpts) - if !(err == nil || errors.Is(err, robustness.ErrNoOp)) { + if err != nil && !errors.Is(err, robustness.ErrNoOp) { t.Error("Hit error", err) } } diff --git a/tests/robustness/pathlock/path_lock_test.go b/tests/robustness/pathlock/path_lock_test.go index 5db08f87460..214c2b5057c 100644 --- a/tests/robustness/pathlock/path_lock_test.go +++ b/tests/robustness/pathlock/path_lock_test.go @@ -133,11 +133,7 @@ func TestPathLockBasic(t *testing.T) { // Wait until the internal atomic counter increments. // That will only happen once the Lock call to path2 executes // and blocks on the prior Lock to path1. - for { - if busyCounter.Load() > currBusyCounter { - break - } - + for busyCounter.Load() <= currBusyCounter { time.Sleep(1 * time.Millisecond) } diff --git a/tests/robustness/robustness_test/main_test.go b/tests/robustness/robustness_test/main_test.go index 320d809cff1..3a799245aed 100644 --- a/tests/robustness/robustness_test/main_test.go +++ b/tests/robustness/robustness_test/main_test.go @@ -60,7 +60,7 @@ func TestMain(m *testing.M) { rs, err := th.snapshotter.GetRepositoryStatus() exitOnError("failed to get repository status before upgrade", err) - prev := rs.ContentFormat.MutableParameters.Version + prev := rs.ContentFormat.Version log.Println("Old repository format:", prev) th.snapshotter.UpgradeRepository() @@ -68,7 +68,7 @@ func TestMain(m *testing.M) { rs, err = th.snapshotter.GetRepositoryStatus() exitOnError("failed to get repository status after upgrade", err) - curr := rs.ContentFormat.MutableParameters.Version + curr := rs.ContentFormat.Version log.Println("Upgraded repository format:", curr) // Reset the env variable. diff --git a/tests/robustness/snapmeta/kopia_snapshotter_upgrade_test.go b/tests/robustness/snapmeta/kopia_snapshotter_upgrade_test.go index aaa6111967b..f068a4127d5 100644 --- a/tests/robustness/snapmeta/kopia_snapshotter_upgrade_test.go +++ b/tests/robustness/snapmeta/kopia_snapshotter_upgrade_test.go @@ -27,6 +27,6 @@ func TestGetRepositoryStatus(t *testing.T) { rs, err := ks.GetRepositoryStatus() require.NoError(t, err) - prev := rs.ContentFormat.MutableParameters.Version + prev := rs.ContentFormat.Version require.Equal(t, prev, format.Version(3), "The format version should be 3.") } diff --git a/tests/tools/fio/workload_test.go b/tests/tools/fio/workload_test.go index cf02ffee6ff..19d7fa8be0e 100644 --- a/tests/tools/fio/workload_test.go +++ b/tests/tools/fio/workload_test.go @@ -276,7 +276,7 @@ func TestDeleteContentsAtDepth(t *testing.T) { // Broad check: just make sure a 50% probability deleted something. // Extremely improbable that this causes a false failure; // akin to 100 coin flips all landing on the same side. - if !(fileCount > 0 && fileCount < 100) { + if fileCount <= 0 || fileCount >= 100 { t.Error("expected some but not all files to be deleted") } }, diff --git a/tests/tools/fswalker/fswalker.go b/tests/tools/fswalker/fswalker.go index 2919ace4ab9..a0a415afce9 100644 --- a/tests/tools/fswalker/fswalker.go +++ b/tests/tools/fswalker/fswalker.go @@ -13,8 +13,6 @@ import ( "path/filepath" "strings" - //nolint:staticcheck - "github.com/google/fswalker" fspb "github.com/google/fswalker/proto/fswalker" "github.com/pkg/errors" diff --git a/tools/cli2md/cli2md.go b/tools/cli2md/cli2md.go index c10da704566..ab7237bd340 100644 --- a/tools/cli2md/cli2md.go +++ b/tools/cli2md/cli2md.go @@ -251,7 +251,7 @@ func generateSubcommands(w io.Writer, dir, sectionTitle string, cmds []*kingpin. first = false } - subcommandSlug := strings.Replace(c.FullCommand, " ", "-", -1) + subcommandSlug := strings.ReplaceAll(c.FullCommand, " ", "-") helpSummary := strings.SplitN(c.Help, "\n", 2)[0] //nolint:mnd helpSummary = strings.TrimSuffix(helpSummary, ".") fmt.Fprintf(w, "* [`%v`](%v) - %v\n", c.FullCommand, subcommandSlug+"/", helpSummary) //nolint:errcheck diff --git a/tools/gettool/checksums.txt b/tools/gettool/checksums.txt index 7b7983bc6f1..ee18b682b61 100644 --- a/tools/gettool/checksums.txt +++ b/tools/gettool/checksums.txt @@ -7,12 +7,12 @@ https://github.com/git-chglog/git-chglog/releases/download/v0.15.1/git-chglog_0. https://github.com/gohugoio/hugo/releases/download/v0.113.0/hugo_extended_0.113.0_darwin-universal.tar.gz: 1557f896f34743d241e1aecab588be273dde59692b362a9f4488231a2595b2ae https://github.com/gohugoio/hugo/releases/download/v0.113.0/hugo_extended_0.113.0_linux-amd64.tar.gz: e04bccfa81df6c727f1c03bc858eb21d6f95123d311cafe245f4485d289123f3 https://github.com/gohugoio/hugo/releases/download/v0.113.0/hugo_extended_0.113.0_windows-amd64.zip: 3eabfbfad1431939058e6f7e76573c6bac1fee92f3a7b1ac5739c555940f0e0e -https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-darwin-amd64.tar.gz: 0ed6f1a216ddb62e293858196799608d63894bd2ec178114484363ca45cde84b -https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-darwin-arm64.tar.gz: dde51958f0f24d442062b5709b6912d91e235115dfe5887e80b3e5602c9cc09b -https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-amd64.tar.gz: 53695531eeb824b6883c703335cef6f07882f8ba6fedc00ed43853ea07fa1fbd -https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-arm64.tar.gz: e1e47209d7bdd288fd8cfe88548b477df2f7eca81b0e9ec1f9d45604f79185eb -https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-linux-armv6.tar.gz: 0a6565ed98da60b470f5652eb1bf434ae84f39ab0632749398176e1a9c477798 -https://github.com/golangci/golangci-lint/releases/download/v1.62.0/golangci-lint-1.62.0-windows-amd64.zip: 34e980afe44655c395aa65f96953fc4b6a2e58206f1a7370ab88407b187184c8 +https://github.com/golangci/golangci-lint/releases/download/v2.1.2/golangci-lint-2.1.2-darwin-amd64.tar.gz: ed02ba3ad28466d61d2ae2b80cc95671713fa842c353da37842b1b89e36cb3ce +https://github.com/golangci/golangci-lint/releases/download/v2.1.2/golangci-lint-2.1.2-darwin-arm64.tar.gz: 1cff60651d7c95a4248fa72f0dd020bffed1d2dc4dd8c2c77aee89a0731fa615 +https://github.com/golangci/golangci-lint/releases/download/v2.1.2/golangci-lint-2.1.2-linux-amd64.tar.gz: bc16fd1ef25bce2c600de0122600100ab26d6d75388cc5369c5bb916cb2b82e3 +https://github.com/golangci/golangci-lint/releases/download/v2.1.2/golangci-lint-2.1.2-linux-arm64.tar.gz: 46e86f1c4a94236e4d0bb35252c72939bed9f749897aaad54b576d430b1bb6d4 +https://github.com/golangci/golangci-lint/releases/download/v2.1.2/golangci-lint-2.1.2-linux-armv6.tar.gz: a0ddb93965d25d11f973ef3ff226bae3486bb12000a6b1a5ed18657aa13ef8a9 +https://github.com/golangci/golangci-lint/releases/download/v2.1.2/golangci-lint-2.1.2-windows-amd64.zip: 1f920e8af6d596deeb9295153270ad2ced9cfa2085c79e68e09a5d96721b48dd https://github.com/goreleaser/goreleaser/releases/download/v0.176.0/goreleaser_Darwin_arm64.tar.gz: 1f95e6561974f4766d8833438b646b06930563ca9867447ea03edb623d876c75 https://github.com/goreleaser/goreleaser/releases/download/v0.176.0/goreleaser_Darwin_x86_64.tar.gz: 17ecad881a50e32f033da5a200c8417d37cae70f09e925645452937998aca506 https://github.com/goreleaser/goreleaser/releases/download/v0.176.0/goreleaser_Linux_arm64.tar.gz: 8bf2a9b9e84498bfa239f2fe91b2d555642c87ab9d3f5d37f29e6e97116910a3 diff --git a/tools/tools.mk b/tools/tools.mk index e5845149f33..c7e6cc514c6 100644 --- a/tools/tools.mk +++ b/tools/tools.mk @@ -102,7 +102,7 @@ retry:= endif # tool versions -GOLANGCI_LINT_VERSION=1.62.0 +GOLANGCI_LINT_VERSION=2.1.2 CHECKLOCKS_VERSION=release-20241104.0 NODE_VERSION=20.15.1 HUGO_VERSION=0.113.0 From 8c8d20b3171b2d701124b87725a636d868388632 Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Wed, 16 Apr 2025 20:02:42 -0700 Subject: [PATCH 066/206] feat(ui): upgraded htmlui to the latest version (#4505) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 61e15f25e40..50dac8d203b 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250412220712-778c21a64a84 + github.com/kopia/htmluibuild v0.0.1-0.20250416164135-16793194ee70 github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index 28b0f804bb6..8e62742893b 100644 --- a/go.sum +++ b/go.sum @@ -182,8 +182,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250412220712-778c21a64a84 h1:UJCTRN2okJ+ar5L02NguM7cTS3I6wvFxYrH6ihEuLqQ= -github.com/kopia/htmluibuild v0.0.1-0.20250412220712-778c21a64a84/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250416164135-16793194ee70 h1:fKJT9+uw2vrQyCV0wJXHqkDtVf5fBBgMtfl0PK8kY2s= +github.com/kopia/htmluibuild v0.0.1-0.20250416164135-16793194ee70/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From eb2e301b7353f208366f8a2f72cc13f3fb894e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Wed, 16 Apr 2025 23:06:30 -0700 Subject: [PATCH 067/206] chore(ci): utc commit date (#4506) --- tools/tools.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tools.mk b/tools/tools.mk index c7e6cc514c6..30372927e65 100644 --- a/tools/tools.mk +++ b/tools/tools.mk @@ -71,7 +71,7 @@ export REPO_OWNER=$(GITHUB_REPOSITORY:%/kopia=%) endif # e.g. 2021-02-19 06:56:21 -0800 -git_commit_date:=$(shell git show -s --format=%ci HEAD) +git_commit_date:=$(shell git TZ=UTC show -s --date=iso-local --format=%cd HEAD) # compute build date and time from the current commit as yyyyMMdd commit_date_ymd:=$(subst -,,$(word 1, $(git_commit_date))) From 5150b9233403b7ec50ac25c071096d702cdedab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Wed, 16 Apr 2025 23:14:25 -0700 Subject: [PATCH 068/206] fix(build): correct command to get commit date (#4508) Fixes issue introduced in #4506 --- tools/tools.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/tools.mk b/tools/tools.mk index 30372927e65..6f62ef9bf12 100644 --- a/tools/tools.mk +++ b/tools/tools.mk @@ -71,7 +71,7 @@ export REPO_OWNER=$(GITHUB_REPOSITORY:%/kopia=%) endif # e.g. 2021-02-19 06:56:21 -0800 -git_commit_date:=$(shell git TZ=UTC show -s --date=iso-local --format=%cd HEAD) +git_commit_date:=$(shell TZ=UTC git show -s --date=iso-local --format=%cd HEAD) # compute build date and time from the current commit as yyyyMMdd commit_date_ymd:=$(subst -,,$(word 1, $(git_commit_date))) From 09b88d38606a4e77a46d12c48599d9461723dafb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Wed, 16 Apr 2025 23:25:01 -0700 Subject: [PATCH 069/206] chore(general): minor cleanups and other nits (#4507) * use uint8 for clarity * unexport writeContentAsyncAndVerify * fix typo in test function name * remove commented interface functions * use atomic.Int32 * cleanups in socket server activation test * leverage stdlib's maps and slices packages replace uses of `golang.org/x/exp/maps` * nit: leverage `maps.Values` --- cli/command_notification_configure_common.go | 9 ++++-- internal/acl/acl_manager.go | 2 +- internal/cache/content_cache_test.go | 2 +- internal/metrics/prom_cache.go | 19 ++++++++---- internal/pproflogging/pproflogging_test.go | 9 ++++-- internal/user/user_manager.go | 16 ++++------ notification/notifytemplate/repotemplate.go | 5 ++-- notification/sender/notification_message.go | 5 ++-- repo/content/index/id.go | 2 +- repo/grpc_repository_client.go | 4 +-- repo/open.go | 3 +- repo/repository.go | 10 ++----- .../multiclient_test/multiclient_test.go | 2 +- .../robustness_test/robustness_test.go | 2 +- .../socketactivation_test.go | 29 +++++++------------ 15 files changed, 62 insertions(+), 57 deletions(-) diff --git a/cli/command_notification_configure_common.go b/cli/command_notification_configure_common.go index ab7ba48a7aa..69ea76026d9 100644 --- a/cli/command_notification_configure_common.go +++ b/cli/command_notification_configure_common.go @@ -2,10 +2,11 @@ package cli import ( "context" + "maps" + "slices" "github.com/alecthomas/kingpin/v2" "github.com/pkg/errors" - "golang.org/x/exp/maps" "github.com/kopia/kopia/notification" "github.com/kopia/kopia/notification/notifyprofile" @@ -23,7 +24,7 @@ type commonNotificationOptions struct { func (c *commonNotificationOptions) setup(svc appServices, cmd *kingpin.CmdClause) { c.notificationProfileFlag.setup(svc, cmd) cmd.Flag("send-test-notification", "Test the notification").BoolVar(&c.sendTestNotification) - cmd.Flag("min-severity", "Minimum severity").EnumVar(&c.minSeverity, maps.Keys(notification.SeverityToNumber)...) + cmd.Flag("min-severity", "Minimum severity").EnumVar(&c.minSeverity, mapKeys(notification.SeverityToNumber)...) } // configureNotificationAction is a helper function that creates a Kingpin action that @@ -101,3 +102,7 @@ func configureNotificationAction[T any]( }) }) } + +func mapKeys[Map ~map[K]V, K comparable, V any](m Map) []K { + return slices.AppendSeq(make([]K, 0, len(m)), maps.Keys(m)) +} diff --git a/internal/acl/acl_manager.go b/internal/acl/acl_manager.go index d0883755593..a53afc7eec1 100644 --- a/internal/acl/acl_manager.go +++ b/internal/acl/acl_manager.go @@ -3,10 +3,10 @@ package acl import ( "context" + "maps" "strings" "github.com/pkg/errors" - "golang.org/x/exp/maps" "github.com/kopia/kopia/repo" "github.com/kopia/kopia/repo/manifest" diff --git a/internal/cache/content_cache_test.go b/internal/cache/content_cache_test.go index 9069c225f78..4367849e53e 100644 --- a/internal/cache/content_cache_test.go +++ b/internal/cache/content_cache_test.go @@ -3,6 +3,7 @@ package cache_test import ( "bytes" "context" + "slices" "sort" "sync" "testing" @@ -11,7 +12,6 @@ import ( "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "golang.org/x/exp/slices" "github.com/kopia/kopia/internal/blobtesting" "github.com/kopia/kopia/internal/cache" diff --git a/internal/metrics/prom_cache.go b/internal/metrics/prom_cache.go index a3493cb722d..5d979ad9b3c 100644 --- a/internal/metrics/prom_cache.go +++ b/internal/metrics/prom_cache.go @@ -1,11 +1,12 @@ package metrics import ( + "maps" + "slices" "sync" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - "golang.org/x/exp/maps" ) const ( @@ -28,12 +29,12 @@ func getPrometheusCounter(opts prometheus.CounterOpts, labels map[string]string) prom := promCounters[opts.Name] if prom == nil { - prom = promauto.NewCounterVec(opts, maps.Keys(labels)) + prom = promauto.NewCounterVec(opts, mapKeys(labels)) promCounters[opts.Name] = prom } - return prom.WithLabelValues(maps.Values(labels)...) + return prom.WithLabelValues(mapValues(labels)...) } func getPrometheusHistogram(opts prometheus.HistogramOpts, labels map[string]string) prometheus.Observer { //nolint:gocritic @@ -42,10 +43,18 @@ func getPrometheusHistogram(opts prometheus.HistogramOpts, labels map[string]str prom := promHistograms[opts.Name] if prom == nil { - prom = promauto.NewHistogramVec(opts, maps.Keys(labels)) + prom = promauto.NewHistogramVec(opts, mapKeys(labels)) promHistograms[opts.Name] = prom } - return prom.WithLabelValues(maps.Values(labels)...) + return prom.WithLabelValues(mapValues(labels)...) +} + +func mapKeys[Map ~map[K]V, K comparable, V any](m Map) []K { + return slices.AppendSeq(make([]K, 0, len(m)), maps.Keys(m)) +} + +func mapValues[Map ~map[K]V, K comparable, V any](m Map) []V { + return slices.AppendSeq(make([]V, 0, len(m)), maps.Values(m)) } diff --git a/internal/pproflogging/pproflogging_test.go b/internal/pproflogging/pproflogging_test.go index 3aed2824857..dc7e1cb795a 100644 --- a/internal/pproflogging/pproflogging_test.go +++ b/internal/pproflogging/pproflogging_test.go @@ -5,12 +5,13 @@ import ( "context" "fmt" "io" + "maps" "os" "regexp" + "slices" "testing" "github.com/stretchr/testify/require" - "golang.org/x/exp/maps" "github.com/kopia/kopia/repo/logging" ) @@ -163,7 +164,7 @@ func TestDebug_parseProfileConfigs(t *testing.T) { require.ErrorIs(t, tc.expectError, err) require.Len(t, pbs, tc.n) pb, ok := pbs[tc.key] // no negative testing for missing keys (see newProfileConfigs) - require.Equalf(t, !tc.expectMissing, ok, "key %q for set %q expect missing %t", tc.key, maps.Keys(pbs), tc.expectMissing) + require.Equalf(t, !tc.expectMissing, ok, "key %q for set %q expect missing %t", tc.key, mapKeys(pbs), tc.expectMissing) if tc.expectMissing { return } @@ -174,6 +175,10 @@ func TestDebug_parseProfileConfigs(t *testing.T) { } } +func mapKeys[Map ~map[K]V, K comparable, V any](m Map) []K { + return slices.AppendSeq(make([]K, 0, len(m)), maps.Keys(m)) +} + func TestDebug_newProfileConfigs(t *testing.T) { saveLockEnv(t) diff --git a/internal/user/user_manager.go b/internal/user/user_manager.go index a51b44d4061..29d66eebe1c 100644 --- a/internal/user/user_manager.go +++ b/internal/user/user_manager.go @@ -3,8 +3,10 @@ package user import ( "context" + "maps" "regexp" - "sort" + "slices" + "strings" "github.com/pkg/errors" @@ -61,22 +63,16 @@ func LoadProfileMap(ctx context.Context, rep repo.Repository, old map[string]*Pr // ListUserProfiles gets the list of all user profiles in the system. func ListUserProfiles(ctx context.Context, rep repo.Repository) ([]*Profile, error) { - var result []*Profile - users, err := LoadProfileMap(ctx, rep, nil) if err != nil { return nil, err } - for _, v := range users { - result = append(result, v) - } - - sort.Slice(result, func(i, j int) bool { - return result[i].Username < result[j].Username + profs := slices.SortedFunc(maps.Values(users), func(p1, p2 *Profile) int { + return strings.Compare(p1.Username, p2.Username) }) - return result, nil + return profs, nil } // GetUserProfile returns the user profile with a given username. diff --git a/notification/notifytemplate/repotemplate.go b/notification/notifytemplate/repotemplate.go index 311f994956e..50fc10f2794 100644 --- a/notification/notifytemplate/repotemplate.go +++ b/notification/notifytemplate/repotemplate.go @@ -2,11 +2,12 @@ package notifytemplate import ( "context" + "maps" + "slices" "strings" "time" "github.com/pkg/errors" - "golang.org/x/exp/maps" "github.com/kopia/kopia/repo" "github.com/kopia/kopia/repo/manifest" @@ -106,7 +107,7 @@ func ListTemplates(ctx context.Context, rep repo.Repository, prefix string) ([]I } } - return maps.Values(infos), nil + return slices.AppendSeq(make([]Info, 0, len(infos)), maps.Values(infos)), nil } // SetTemplate saves a template in the repository. diff --git a/notification/sender/notification_message.go b/notification/sender/notification_message.go index 8d219ca49f9..02dacfa5e93 100644 --- a/notification/sender/notification_message.go +++ b/notification/sender/notification_message.go @@ -6,11 +6,12 @@ import ( "context" "fmt" "io" + "maps" + "slices" "sort" "strings" "github.com/pkg/errors" - "golang.org/x/exp/maps" ) // Severity represents the severity of a notification message. @@ -80,7 +81,7 @@ func (m Message) ToString() string { fmt.Fprintf(&buf, "Subject: %v\n", m.Subject) - headers := maps.Keys(m.Headers) + headers := slices.AppendSeq(make([]string, 0, len(m.Headers)), maps.Keys(m.Headers)) sort.Strings(headers) diff --git a/repo/content/index/id.go b/repo/content/index/id.go index d058af83be1..52cb4bf0f88 100644 --- a/repo/content/index/id.go +++ b/repo/content/index/id.go @@ -37,7 +37,7 @@ type ID struct { // those 2 could be packed into one byte, but that seems like overkill prefix byte - idLen byte + idLen uint8 } // MarshalJSON implements JSON serialization. diff --git a/repo/grpc_repository_client.go b/repo/grpc_repository_client.go index 0232abcf451..3ff826393b4 100644 --- a/repo/grpc_repository_client.go +++ b/repo/grpc_repository_client.go @@ -732,7 +732,7 @@ func (r *grpcRepositoryClient) doWriteAsync(ctx context.Context, contentID conte r.opt.OnUpload(int64(len(data))) if _, err := inSessionWithoutRetry(ctx, r, func(ctx context.Context, sess *grpcInnerSession) (content.ID, error) { - sess.WriteContentAsyncAndVerify(ctx, contentID, data, prefix, comp, r.asyncWritesWG) + sess.writeContentAsyncAndVerify(ctx, contentID, data, prefix, comp, r.asyncWritesWG) return contentID, nil }); err != nil { return err @@ -777,7 +777,7 @@ func (r *grpcRepositoryClient) WriteContent(ctx context.Context, data gather.Byt return contentID, nil } -func (r *grpcInnerSession) WriteContentAsyncAndVerify(ctx context.Context, contentID content.ID, data []byte, prefix content.IDPrefix, comp compression.HeaderID, eg *errgroup.Group) { +func (r *grpcInnerSession) writeContentAsyncAndVerify(ctx context.Context, contentID content.ID, data []byte, prefix content.IDPrefix, comp compression.HeaderID, eg *errgroup.Group) { ch := r.sendRequest(ctx, &apipb.SessionRequest{ Request: &apipb.SessionRequest_WriteContent{ WriteContent: &apipb.WriteContentRequest{ diff --git a/repo/open.go b/repo/open.go index 2745b252263..137cd984ad2 100644 --- a/repo/open.go +++ b/repo/open.go @@ -7,6 +7,7 @@ import ( "path/filepath" "strings" "sync" + "sync/atomic" "time" "github.com/pkg/errors" @@ -365,7 +366,7 @@ func openWithConfig(ctx context.Context, st blob.Storage, cliOpts ClientOptions, timeNow: cmOpts.TimeNow, cliOpts: cliOpts, configFile: configFile, - nextWriterID: new(int32), + nextWriterID: &atomic.Int32{}, throttler: throttler, metricsRegistry: mr, refCountedCloser: closer, diff --git a/repo/repository.go b/repo/repository.go index 301c4c90110..fc75195001f 100644 --- a/repo/repository.go +++ b/repo/repository.go @@ -95,12 +95,6 @@ type DirectRepositoryWriter interface { DirectRepository BlobStorage() blob.Storage ContentManager() *content.WriteManager - // SetParameters(ctx context.Context, m format.MutableParameters, blobcfg format.BlobStorageConfiguration, requiredFeatures []feature.Required) error - // ChangePassword(ctx context.Context, newPassword string) error - // GetUpgradeLockIntent(ctx context.Context) (*format.UpgradeLockIntent, error) - // SetUpgradeLockIntent(ctx context.Context, l format.UpgradeLockIntent) (*format.UpgradeLockIntent, error) - // CommitUpgrade(ctx context.Context) error - // RollbackUpgrade(ctx context.Context) error } type immutableDirectRepositoryParameters struct { @@ -109,7 +103,7 @@ type immutableDirectRepositoryParameters struct { cliOpts ClientOptions timeNow func() time.Time fmgr *format.Manager - nextWriterID *int32 + nextWriterID *atomic.Int32 throttler throttling.SettableThrottler metricsRegistry *metrics.Registry beforeFlush []RepositoryWriterCallback @@ -282,7 +276,7 @@ func (r *directRepository) NewWriter(ctx context.Context, opt WriteSessionOption // NewDirectWriter returns new DirectRepositoryWriter session for repository. func (r *directRepository) NewDirectWriter(ctx context.Context, opt WriteSessionOptions) (context.Context, DirectRepositoryWriter, error) { - writeManagerID := fmt.Sprintf("writer-%v:%v", atomic.AddInt32(r.nextWriterID, 1), opt.Purpose) + writeManagerID := fmt.Sprintf("writer-%v:%v", r.nextWriterID.Add(1), opt.Purpose) cmgr := content.NewWriteManager(ctx, r.sm, content.SessionOptions{ SessionUser: r.cliOpts.Username, diff --git a/tests/robustness/multiclient_test/multiclient_test.go b/tests/robustness/multiclient_test/multiclient_test.go index 31136f849e3..5b822b96ebd 100644 --- a/tests/robustness/multiclient_test/multiclient_test.go +++ b/tests/robustness/multiclient_test/multiclient_test.go @@ -102,7 +102,7 @@ func TestOneLargeFile(t *testing.T) { th.RunN(ctx, t, numClients, f) } -func TestManySmallFilesAcrossDirecoryTree(t *testing.T) { +func TestManySmallFilesAcrossDirectoryTree(t *testing.T) { // TODO: Test takes too long - need to address performance issues with fio writes const ( fileSize = 4096 diff --git a/tests/robustness/robustness_test/robustness_test.go b/tests/robustness/robustness_test/robustness_test.go index bbfe2a804dd..c1d2bd340d9 100644 --- a/tests/robustness/robustness_test/robustness_test.go +++ b/tests/robustness/robustness_test/robustness_test.go @@ -71,7 +71,7 @@ func TestOneLargeFile(t *testing.T) { require.NoError(t, err) } -func TestManySmallFilesAcrossDirecoryTree(t *testing.T) { +func TestManySmallFilesAcrossDirectoryTree(t *testing.T) { // TODO: Test takes too long - need to address performance issues with fio writes const ( fileSize = 4096 diff --git a/tests/socketactivation_test/socketactivation_test.go b/tests/socketactivation_test/socketactivation_test.go index 793a07ee2e9..a12d2e0ffe9 100644 --- a/tests/socketactivation_test/socketactivation_test.go +++ b/tests/socketactivation_test/socketactivation_test.go @@ -37,9 +37,7 @@ func TestServerControlSocketActivated(t *testing.T) { env.Environment["LISTEN_FDS"] = "1" l1, err := net.Listen("tcp", ":0") - if err != nil { - t.Fatalf("Failed to open Listener") - } + require.NoError(t, err, "Failed to open Listener") defer func() { l1.Close() @@ -57,7 +55,7 @@ func TestServerControlSocketActivated(t *testing.T) { go func() { l1File, err := l1.(*net.TCPListener).File() if err != nil { - t.Logf("ERROR: Failed to get filehandle for socket") + t.Log("ERROR: Failed to get filehandle for socket") close(serverStarted) return @@ -77,14 +75,11 @@ func TestServerControlSocketActivated(t *testing.T) { select { case <-serverStarted: - if sp.BaseURL == "" { - t.Fatalf("Failed to start server") - } - + require.NotEmpty(t, sp.BaseURL, "Failed to start server") t.Logf("server started on %v", sp.BaseURL) case <-time.After(5 * time.Second): - t.Fatalf("server did not start in time") + t.Fatal("server did not start in time") } require.Contains(t, sp.BaseURL, ":"+strconv.Itoa(port)) @@ -97,10 +92,10 @@ func TestServerControlSocketActivated(t *testing.T) { select { case <-serverStopped: - t.Logf("server shut down") + t.Log("server shut down") case <-time.After(15 * time.Second): - t.Fatalf("server did not shutdown in time") + t.Fatal("server did not shutdown in time") } } @@ -120,9 +115,7 @@ func TestServerControlSocketActivatedTooManyFDs(t *testing.T) { env.Environment["LISTEN_FDS"] = "2" l1, err := net.Listen("tcp", ":0") - if err != nil { - t.Fatalf("Failed to open Listener") - } + require.NoError(t, err, "Failed to open Listener") defer func() { l1.Close() @@ -137,7 +130,7 @@ func TestServerControlSocketActivatedTooManyFDs(t *testing.T) { go func() { l1File, err := l1.(*net.TCPListener).File() if err != nil { - t.Logf("Failed to get filehandle for socket") + t.Log("Failed to get filehandle for socket") close(serverStarted) return @@ -145,7 +138,7 @@ func TestServerControlSocketActivatedTooManyFDs(t *testing.T) { l2File, err := l1.(*net.TCPListener).File() if err != nil { - t.Logf("Failed to get 2nd filehandle for socket") + t.Log("Failed to get 2nd filehandle for socket") close(serverStarted) return @@ -164,9 +157,9 @@ func TestServerControlSocketActivatedTooManyFDs(t *testing.T) { select { case stderr := <-serverStarted: require.Contains(t, strings.Join(stderr, ""), "Too many activated sockets found. Expected 1, got 2") - t.Logf("Done") + t.Log("Done") case <-time.After(5 * time.Second): - t.Fatalf("server did not exit in time") + t.Fatal("server did not exit in time") } } From 3712fc4873a7793ad48585a984dc5329629261a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Thu, 17 Apr 2025 10:19:27 -0700 Subject: [PATCH 070/206] chore(ci): enable exptostd linter (#4509) Also, cleanup `x/exp/constraints` usage to address linter warning. Ref: - #4500 - #4507 (contains prior migration from `x/exp` to stdlib packages) --- .golangci.yml | 1 - internal/metrics/metrics_distribution.go | 8 ++++++-- internal/metrics/metrics_thresholds.go | 6 ++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 21e8556ebca..ac164feccfb 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -71,7 +71,6 @@ linters: - gochecknoglobals - depguard - exhaustruct - - exptostd - forcetypeassert - funcorder - gochecknoinits diff --git a/internal/metrics/metrics_distribution.go b/internal/metrics/metrics_distribution.go index 5de5602c8db..391a37ed800 100644 --- a/internal/metrics/metrics_distribution.go +++ b/internal/metrics/metrics_distribution.go @@ -9,8 +9,12 @@ import ( "golang.org/x/exp/constraints" ) +type realNumber interface { + constraints.Float | constraints.Integer +} + // DistributionState captures momentary state of a Distribution. -type DistributionState[T constraints.Float | constraints.Integer] struct { +type DistributionState[T realNumber] struct { Min T `json:"min"` Max T `json:"max"` Sum T `json:"sum"` @@ -65,7 +69,7 @@ func (s *DistributionState[T]) Mean() T { } // Distribution measures distribution/summary of values. -type Distribution[T constraints.Integer | constraints.Float] struct { +type Distribution[T realNumber] struct { mu sync.Mutex state atomic.Pointer[DistributionState[T]] // +checklocksignore bucketThresholds []T // +checklocksignore diff --git a/internal/metrics/metrics_thresholds.go b/internal/metrics/metrics_thresholds.go index f56d3a5b06b..f16afc1fddb 100644 --- a/internal/metrics/metrics_thresholds.go +++ b/internal/metrics/metrics_thresholds.go @@ -2,12 +2,10 @@ package metrics import ( "time" - - "golang.org/x/exp/constraints" ) // Thresholds encapsulates a set of bucket thresholds used in Summary[T]. -type Thresholds[T constraints.Float | constraints.Integer] struct { +type Thresholds[T realNumber] struct { values []T promScale float64 prometheusSuffix string @@ -108,7 +106,7 @@ var CPULatencyThresholds = &Thresholds[time.Duration]{ "_ns", } -func bucketForThresholds[T constraints.Integer | constraints.Float](thresholds []T, d T) int { +func bucketForThresholds[T realNumber](thresholds []T, d T) int { l, r := 0, len(thresholds)-1 for l <= r { From 25588db6121bbb0d95b21971726d3ac2c5f342d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 21:35:17 -0700 Subject: [PATCH 071/206] build(deps): bump github.com/tg123/go-htpasswd from 1.2.3 to 1.2.4 (#4516) Bumps [github.com/tg123/go-htpasswd](https://github.com/tg123/go-htpasswd) from 1.2.3 to 1.2.4. - [Release notes](https://github.com/tg123/go-htpasswd/releases) - [Commits](https://github.com/tg123/go-htpasswd/compare/v1.2.3...v1.2.4) --- updated-dependencies: - dependency-name: github.com/tg123/go-htpasswd dependency-version: 1.2.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 50dac8d203b..75c66d2dc5b 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/stretchr/testify v1.10.0 github.com/studio-b12/gowebdav v0.10.0 - github.com/tg123/go-htpasswd v1.2.3 + github.com/tg123/go-htpasswd v1.2.4 github.com/zalando/go-keyring v0.2.6 github.com/zeebo/blake3 v0.2.4 go.opentelemetry.io/otel v1.35.0 diff --git a/go.sum b/go.sum index 8e62742893b..3552e1346ba 100644 --- a/go.sum +++ b/go.sum @@ -273,8 +273,8 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/studio-b12/gowebdav v0.10.0 h1:Yewz8FFiadcGEu4hxS/AAJQlHelndqln1bns3hcJIYc= github.com/studio-b12/gowebdav v0.10.0/go.mod h1:bHA7t77X/QFExdeAnDzK6vKM34kEZAcE1OX4MfiwjkE= -github.com/tg123/go-htpasswd v1.2.3 h1:ALR6ZBIc2m9u70m+eAWUFt5p43ISbIvAvRFYzZPTOY8= -github.com/tg123/go-htpasswd v1.2.3/go.mod h1:FcIrK0J+6zptgVwK1JDlqyajW/1B4PtuJ/FLWl7nx8A= +github.com/tg123/go-htpasswd v1.2.4 h1:HgH8KKCjdmo7jjXWN9k1nefPBd7Be3tFCTjc2jPraPU= +github.com/tg123/go-htpasswd v1.2.4/go.mod h1:EKThQok9xHkun6NBMynNv6Jmu24A33XdZzzl4Q7H1+0= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= From e3fc6e012d103b905d27ae71a741de2cd104aa46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Tue, 22 Apr 2025 20:55:11 -0700 Subject: [PATCH 072/206] refactor(general): leverage `os.CreateTemp` (#4513) * use `os.CreateTemp` in `tempfile.CreateAutoDelete` * refactor `TestTempFile`: add `VerifyTempfile` test helper * add test for `createUnixFallback` * rename function to `tempfile.CreateAutoDelete` * remove the `dir` parameter to `tempfile.CreateAutoDelete`, only an empty string was passed, apart from test cases. * guard against panic in TestShadowCopy --- internal/bigmap/bigmap_internal.go | 2 +- internal/tempfile/tempfile.go | 10 ---- internal/tempfile/tempfile_linux.go | 10 ++-- .../tempfile/tempfile_linux_fallback_test.go | 16 ++++++ internal/tempfile/tempfile_test.go | 38 +------------- internal/tempfile/tempfile_unix_fallback.go | 12 ++--- internal/tempfile/tempfile_unix_nonlinux.go | 6 +-- internal/tempfile/tempfile_verify_test.go | 48 +++++++++++++++++ internal/tempfile/tempfile_windows.go | 6 +-- .../os_snapshot_windows_test.go | 52 +++++++++++++++---- 10 files changed, 123 insertions(+), 77 deletions(-) create mode 100644 internal/tempfile/tempfile_linux_fallback_test.go create mode 100644 internal/tempfile/tempfile_verify_test.go diff --git a/internal/bigmap/bigmap_internal.go b/internal/bigmap/bigmap_internal.go index f80e2c43566..8f924c18075 100644 --- a/internal/bigmap/bigmap_internal.go +++ b/internal/bigmap/bigmap_internal.go @@ -344,7 +344,7 @@ func (m *internalMap) newMemoryMappedSegment(ctx context.Context) (mmap.MMap, er // +checklocks:m.mu func (m *internalMap) maybeCreateMappedFile(ctx context.Context) (*os.File, error) { - f, err := tempfile.Create("") + f, err := tempfile.CreateAutoDelete() if err != nil { return nil, errors.Wrap(err, "unable to create memory-mapped file") } diff --git a/internal/tempfile/tempfile.go b/internal/tempfile/tempfile.go index 85d687cfb9b..1bd8234695f 100644 --- a/internal/tempfile/tempfile.go +++ b/internal/tempfile/tempfile.go @@ -1,13 +1,3 @@ // Package tempfile provides a cross-platform abstraction for creating private // read-write temporary files which are automatically deleted when closed. package tempfile - -import "os" - -func tempDirOr(dir string) string { - if dir != "" { - return dir - } - - return os.TempDir() -} diff --git a/internal/tempfile/tempfile_linux.go b/internal/tempfile/tempfile_linux.go index a0694f92f24..d0598039383 100644 --- a/internal/tempfile/tempfile_linux.go +++ b/internal/tempfile/tempfile_linux.go @@ -8,9 +8,11 @@ import ( "golang.org/x/sys/unix" ) -// Create creates a temporary file that will be automatically deleted on close. -func Create(dir string) (*os.File, error) { - dir = tempDirOr(dir) +const permissions = 0o600 + +// CreateAutoDelete creates a temporary file that will be automatically deleted on close. +func CreateAutoDelete() (*os.File, error) { + dir := os.TempDir() // on reasonably modern Linux (3.11 and above) O_TMPFILE is supported, // which creates invisible, unlinked file in a given directory. @@ -20,7 +22,7 @@ func Create(dir string) (*os.File, error) { } if errors.Is(err, syscall.EISDIR) || errors.Is(err, syscall.EOPNOTSUPP) { - return createUnixFallback(dir) + return createUnixFallback() } return nil, &os.PathError{ diff --git a/internal/tempfile/tempfile_linux_fallback_test.go b/internal/tempfile/tempfile_linux_fallback_test.go new file mode 100644 index 00000000000..dbc88e48eb9 --- /dev/null +++ b/internal/tempfile/tempfile_linux_fallback_test.go @@ -0,0 +1,16 @@ +//go:build linux +// +build linux + +package tempfile + +import ( + "testing" +) + +// Explicitly test the create fallback function. +// This test only applies to Linux to explicitly test the fallback function. +// In other unix platforms the fallback is the default implementation, so it +// is already tested in the tests for the Create function. +func TestCreateFallback(t *testing.T) { + VerifyTempfile(t, createUnixFallback) +} diff --git a/internal/tempfile/tempfile_test.go b/internal/tempfile/tempfile_test.go index 8c2dd08fc10..5069c964ba1 100644 --- a/internal/tempfile/tempfile_test.go +++ b/internal/tempfile/tempfile_test.go @@ -1,47 +1,11 @@ package tempfile_test import ( - "io" - "os" "testing" - "github.com/stretchr/testify/require" - "github.com/kopia/kopia/internal/tempfile" ) func TestTempFile(t *testing.T) { - td := t.TempDir() - - f, err := tempfile.Create(td) - require.NoError(t, err) - - n, err := f.WriteString("hello") - require.NoError(t, err) - require.Equal(t, 5, n) - - off, err := f.Seek(1, io.SeekStart) - require.Equal(t, int64(1), off) - require.NoError(t, err) - - buf := make([]byte, 4) - n2, err := f.Read(buf) - require.NoError(t, err) - require.Equal(t, 4, n2) - require.Equal(t, []byte("ello"), buf) - - f.Close() - - files, err := os.ReadDir(td) - require.NoError(t, err) - require.Empty(t, files) -} - -func TestCreateSucceedsWhenDirIsNotSpecified(t *testing.T) { - f, err := tempfile.Create("") - - require.NoError(t, err) - - err = f.Close() - require.NoError(t, err) + tempfile.VerifyTempfile(t, tempfile.CreateAutoDelete) } diff --git a/internal/tempfile/tempfile_unix_fallback.go b/internal/tempfile/tempfile_unix_fallback.go index 565e3a6ca6f..f1ac3cb0011 100644 --- a/internal/tempfile/tempfile_unix_fallback.go +++ b/internal/tempfile/tempfile_unix_fallback.go @@ -5,25 +5,19 @@ package tempfile import ( "os" - "path/filepath" - "github.com/google/uuid" "github.com/pkg/errors" ) -const permissions = 0o600 - // createUnixFallback creates a temporary file that does not need to be removed on close. -func createUnixFallback(dir string) (*os.File, error) { - fullPath := filepath.Join(tempDirOr(dir), uuid.NewString()) - - f, err := os.OpenFile(fullPath, os.O_CREATE|os.O_EXCL|os.O_RDWR, permissions) //nolint:gosec +func createUnixFallback() (*os.File, error) { + f, err := os.CreateTemp("", "kt-") if err != nil { return nil, err //nolint:wrapcheck } // immediately remove/unlink the file while we keep the handle open. - if derr := os.Remove(fullPath); derr != nil { + if derr := os.Remove(f.Name()); derr != nil { f.Close() //nolint:errcheck return nil, errors.Wrap(derr, "unable to unlink temporary file") } diff --git a/internal/tempfile/tempfile_unix_nonlinux.go b/internal/tempfile/tempfile_unix_nonlinux.go index b58fff52b20..b0f28acc451 100644 --- a/internal/tempfile/tempfile_unix_nonlinux.go +++ b/internal/tempfile/tempfile_unix_nonlinux.go @@ -7,7 +7,7 @@ import ( "os" ) -// Create creates a temporary file that does not need to be removed on close. -func Create(dir string) (*os.File, error) { - return createUnixFallback(dir) +// CreateAutoDelete creates a temporary file that does not need to be explicitly removed on close. +func CreateAutoDelete() (*os.File, error) { + return createUnixFallback() } diff --git a/internal/tempfile/tempfile_verify_test.go b/internal/tempfile/tempfile_verify_test.go new file mode 100644 index 00000000000..5feeeac1878 --- /dev/null +++ b/internal/tempfile/tempfile_verify_test.go @@ -0,0 +1,48 @@ +package tempfile + +import ( + "io" + "os" + "runtime" + "testing" + + "github.com/stretchr/testify/require" +) + +func VerifyTempfile(t *testing.T, create func() (*os.File, error)) { + t.Helper() + + f, err := create() + require.NoError(t, err) + + n, err := f.WriteString("hello") + require.NoError(t, err) + require.Equal(t, 5, n) + + off, err := f.Seek(1, io.SeekStart) + require.Equal(t, int64(1), off) + require.NoError(t, err) + + buf := make([]byte, 4) + n2, err := f.Read(buf) + require.NoError(t, err) + require.Equal(t, 4, n2) + require.Equal(t, []byte("ello"), buf) + + f.Close() + + if n := f.Name(); n != "" { + var perr *os.PathError + + // there should be no directory entry for this file + _, err := os.Stat(n) + + require.Error(t, err) + require.ErrorAs(t, err, &perr) + if runtime.GOOS == "windows" { + require.ErrorContains(t, err, "The system cannot find the file specified") + } else { + require.ErrorContains(t, err, "no such file or directory") + } + } +} diff --git a/internal/tempfile/tempfile_windows.go b/internal/tempfile/tempfile_windows.go index 8a6b00b5bf6..6d5cc3dbccd 100644 --- a/internal/tempfile/tempfile_windows.go +++ b/internal/tempfile/tempfile_windows.go @@ -9,9 +9,9 @@ import ( "golang.org/x/sys/windows" ) -// Create creates a temporary file that will be automatically deleted on close. -func Create(dir string) (*os.File, error) { - fullpath := filepath.Join(tempDirOr(dir), uuid.NewString()) +// CreateAutoDelete creates a temporary file that will be automatically deleted on close. +func CreateAutoDelete() (*os.File, error) { + fullpath := filepath.Join(os.TempDir(), uuid.NewString()) fname, err := syscall.UTF16PtrFromString(fullpath) if err != nil { diff --git a/tests/os_snapshot_test/os_snapshot_windows_test.go b/tests/os_snapshot_test/os_snapshot_windows_test.go index 0127582d9a3..01ff6b3af5d 100644 --- a/tests/os_snapshot_test/os_snapshot_windows_test.go +++ b/tests/os_snapshot_test/os_snapshot_windows_test.go @@ -2,13 +2,16 @@ package os_snapshot_test import ( "os" + "path/filepath" + "syscall" "testing" + "github.com/google/uuid" "github.com/mxk/go-vss" "github.com/pkg/errors" "github.com/stretchr/testify/require" + "golang.org/x/sys/windows" - "github.com/kopia/kopia/internal/tempfile" "github.com/kopia/kopia/internal/testutil" "github.com/kopia/kopia/tests/clitestutil" "github.com/kopia/kopia/tests/testenv" @@ -21,21 +24,19 @@ func TestShadowCopy(t *testing.T) { } runner := testenv.NewExeRunnerWithBinary(t, kopiaExe) - e := testenv.NewCLITest(t, testenv.RepoFormatNotImportant, runner) + e.RunAndExpectSuccess(t, "repo", "create", "filesystem", "--path", e.RepoDir) + e.RunAndExpectSuccess(t, "policy", "set", "--global", "--enable-volume-shadow-copy=when-available") + // create a file that cannot be accessed and then attempt to create a snapshot root := testutil.TempDirectory(t) - f, err := tempfile.Create(root) - require.NoError(t, err) - _, err = f.WriteString("locked file\n") + f := createAutoDelete(t, root) + _, err := f.WriteString("locked file\n") + require.NoError(t, err) require.NoError(t, f.Sync()) - defer f.Close() - - e.RunAndExpectSuccess(t, "policy", "set", "--global", "--enable-volume-shadow-copy=when-available") - _, err = vss.Get("{00000000-0000-0000-0000-000000000000}") isAdmin := !errors.Is(err, os.ErrPermission) @@ -43,7 +44,7 @@ func TestShadowCopy(t *testing.T) { t.Log("Running as admin, expecting snapshot creation to succeed") e.RunAndExpectSuccess(t, "snap", "create", root) } else { - t.Log("Not running as admin, expecting snapshot creation to fail") + t.Log("Not running as admin, expecting snapshot creation to fail because it cannot access the file that is in use") e.RunAndExpectFailure(t, "snap", "create", root) } @@ -54,11 +55,42 @@ func TestShadowCopy(t *testing.T) { oid := sources[0].Snapshots[0].ObjectID entries := clitestutil.ListDirectory(t, e, oid) + t.Log("sources[0].Snapshots[0].ObjectID entries:", entries) if isAdmin { + require.NotEmpty(t, entries) lines := e.RunAndExpectSuccess(t, "show", entries[0].ObjectID) require.Equal(t, []string{"locked file"}, lines) } else { require.Empty(t, entries) } } + +func createAutoDelete(t *testing.T, dir string) *os.File { + t.Helper() + + fullpath := filepath.Join(dir, uuid.NewString()) + + fname, err := syscall.UTF16PtrFromString(fullpath) + require.NoError(t, err, "constructing file name UTF16Ptr") + + // This call creates a file that's automatically deleted on close. + h, err := syscall.CreateFile( + fname, + windows.GENERIC_READ|windows.GENERIC_WRITE, + 0, + nil, + syscall.OPEN_ALWAYS, + uint32(windows.FILE_FLAG_DELETE_ON_CLOSE), + 0) + + require.NoError(t, err, "creating file") + + f := os.NewFile(uintptr(h), fullpath) + + t.Cleanup(func() { + f.Close() + }) + + return f +} From e38145d2881939d8aaf5c73923b1a1ecd17cb9b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20L=C3=B3pez?= <1953782+julio-lopez@users.noreply.github.com> Date: Tue, 22 Apr 2025 21:36:29 -0700 Subject: [PATCH 073/206] fix(cli): create cache marker in log directories (#4517) - Fixes #2822 - Initial PR: #3147 Thanks to @NickIAm for the initial PR. --- internal/logfile/logfile.go | 5 +++++ internal/logfile/logfile_test.go | 21 ++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/internal/logfile/logfile.go b/internal/logfile/logfile.go index 2589b8f7796..2a3138a955d 100644 --- a/internal/logfile/logfile.go +++ b/internal/logfile/logfile.go @@ -19,6 +19,7 @@ import ( "go.uber.org/zap/zapcore" "github.com/kopia/kopia/cli" + "github.com/kopia/kopia/internal/cachedir" "github.com/kopia/kopia/internal/clock" "github.com/kopia/kopia/internal/ospath" "github.com/kopia/kopia/internal/zaplogutil" @@ -213,6 +214,10 @@ func (c *loggingFlags) setupLogFileBasedLogger(now time.Time, subdir, suffix, lo fmt.Fprintln(os.Stderr, "Unable to create logs directory:", err) } + if err := cachedir.WriteCacheMarker(logDir); err != nil { + fmt.Fprintf(os.Stderr, "Unable to create cache marker in log directory %q: %s", logDir, err) + } + sweepLogWG := &sync.WaitGroup{} doSweep := func() {} diff --git a/internal/logfile/logfile_test.go b/internal/logfile/logfile_test.go index a82621a67de..a2142da288f 100644 --- a/internal/logfile/logfile_test.go +++ b/internal/logfile/logfile_test.go @@ -12,6 +12,7 @@ import ( "github.com/stretchr/testify/require" + "github.com/kopia/kopia/internal/cachedir" "github.com/kopia/kopia/internal/clock" "github.com/kopia/kopia/internal/logfile" "github.com/kopia/kopia/internal/testutil" @@ -133,7 +134,7 @@ func TestLogFileRotation(t *testing.T) { require.NoError(t, err) t.Logf("%v %v", info.Name(), info.Size()) - if info.Mode().IsRegular() { + if info.Mode().IsRegular() && info.Name() != cachedir.CacheDirMarkerFile { gotEntryCount++ } @@ -194,6 +195,20 @@ func TestLogFileMaxTotalSize(t *testing.T) { } } +func TestCacheFileExists(t *testing.T) { + t.Parallel() + + runner := testenv.NewInProcRunner(t) + runner.CustomizeApp = logfile.Attach + env := testenv.NewCLITest(t, testenv.RepoFormatNotImportant, runner) + tmpLogDir := testutil.TempDirectory(t) + + env.RunAndExpectSuccess(t, "repo", "create", "filesystem", "--path", env.RepoDir, "--log-dir", tmpLogDir) + + require.FileExists(t, filepath.Join(tmpLogDir, "cli-logs", cachedir.CacheDirMarkerFile)) + require.FileExists(t, filepath.Join(tmpLogDir, "content-logs", cachedir.CacheDirMarkerFile)) +} + func verifyFileLogFormat(t *testing.T, fname string, re *regexp.Regexp) { t.Helper() @@ -224,6 +239,10 @@ func getTotalDirSize(t *testing.T, dir string) int { var totalSize int for _, ent := range entries { + if ent.Name() == cachedir.CacheDirMarkerFile { + continue + } + info, err := ent.Info() require.NoError(t, err) From 81f65c97b39ba480ab830c5a92e647e8fde7e46c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Apr 2025 17:32:19 -0700 Subject: [PATCH 074/206] build(deps): bump google.golang.org/grpc from 1.71.1 to 1.72.0 in the common-golang-dependencies group (#4515) * build(deps): bump google.golang.org/grpc Bumps the common-golang-dependencies group with 1 update: [google.golang.org/grpc](https://github.com/grpc/grpc-go). Updates `google.golang.org/grpc` from 1.71.1 to 1.72.0 - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.71.1...v1.72.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-version: 1.72.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] * use go-jose v4.0.5 to address GHSA-c6gw-w398-hv78 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: J <1953782+julio-lopez@users.noreply.github.com> --- go.mod | 9 ++++++--- go.sum | 18 ++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 75c66d2dc5b..b524fe334a3 100644 --- a/go.mod +++ b/go.mod @@ -69,14 +69,14 @@ require ( golang.org/x/term v0.31.0 golang.org/x/text v0.24.0 google.golang.org/api v0.229.0 - google.golang.org/grpc v1.71.1 + google.golang.org/grpc v1.72.0 google.golang.org/protobuf v1.36.6 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 ) require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect - cel.dev/expr v0.19.2 // indirect + cel.dev/expr v0.20.0 // indirect cloud.google.com/go v0.118.3 // indirect cloud.google.com/go/auth v0.16.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect @@ -86,7 +86,7 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -103,6 +103,7 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/frankban/quicktest v1.13.1 // indirect github.com/go-ini/ini v1.67.0 // indirect + github.com/go-jose/go-jose/v4 v4.0.5 // indirect github.com/go-json-experiment/json v0.0.0-20250211171154-1ae217ad3535 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -131,7 +132,9 @@ require ( github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rs/xid v1.6.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect + github.com/zeebo/errs v1.4.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect diff --git a/go.sum b/go.sum index 3552e1346ba..d4e2e5a3028 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho= al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= -cel.dev/expr v0.19.2 h1:V354PbqIXr9IQdwy4SYA4xa0HXaWq1BUPAGzugBY5V4= -cel.dev/expr v0.19.2/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI= +cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.118.3 h1:jsypSnrE/w4mJysioGdMBg4MiW/hHx/sArFpaBWHdME= cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc= cloud.google.com/go/auth v0.16.0 h1:Pd8P1s9WkcrBE2n/PhAwKsdrR35V3Sg2II9B+ndM3CU= @@ -41,8 +41,8 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83 github.com/GehirnInc/crypt v0.0.0-20190301055215-6c0105aabd46/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo= github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 h1:IEjq88XO4PuBDcvmjQJcQGg+w+UaafSy8G5Kcb5tBhI= github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5/go.mod h1:exZ0C/1emQJAw5tHOaUDyY1ycttqBAPcxuzf7QbY6ec= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 h1:f2Qw/Ehhimh5uO1fayV0QIW7DShEQqhtUfhYc+cBPlw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0/go.mod h1:2bIszWvQRlJVmJLiuLhukLImRjKPcYdzzsx6darK02A= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= @@ -109,6 +109,8 @@ github.com/frankban/quicktest v1.13.1 h1:xVm/f9seEhZFL9+n5kv5XLrGwy6elc4V9v/XFY2 github.com/frankban/quicktest v1.13.1/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= +github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-json-experiment/json v0.0.0-20250211171154-1ae217ad3535 h1:yE7argOs92u+sSCRgqqe6eF+cDaVhSPlioy1UkA0p/w= github.com/go-json-experiment/json v0.0.0-20250211171154-1ae217ad3535/go.mod h1:BWmvoE1Xia34f3l/ibJweyhrT+aROb/FQ6d+37F0e2s= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -258,6 +260,8 @@ github.com/sanity-io/litter v1.5.8 h1:uM/2lKrWdGbRXDrIq08Lh9XtVYoeGtcQxk9rtQ7+rY github.com/sanity-io/litter v1.5.8/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= +github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -284,6 +288,8 @@ github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI= github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE= +github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= +github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= @@ -415,8 +421,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1: google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e h1:ztQaXfzEXTmCBvbtWYRhJxW+0iJcz2qXfd38/e9l7bA= google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= -google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= +google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 08dd1388021cd1f6d8126ec60bbe189c1471bef9 Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Wed, 23 Apr 2025 23:35:05 -0700 Subject: [PATCH 075/206] refactor(general): cleanup a few tests (#4519) Cleanup robustness tests and `local_fs_test.go` "Mechanical" changes: - Use `require` helpers - Use `testing.T` helpers Note change in functionality: The use of `require` helpers stops tests once a check fails. Before, various checks were using `t.Error`, which fails the test but allows the test to continue its execution. * refactor(general): cleanup robustness/snapmeta/kopia_persister_light_test.go Use `require` helpers Use `testing.T` helpers * refactor(general): cleanup local_fs_test.go * fix import order --- fs/localfs/local_fs_test.go | 99 +++++------------ tests/robustness/snapmeta/index_test.go | 15 +-- .../snapmeta/kopia_persister_light_test.go | 101 +++++++----------- tests/robustness/snapmeta/simple_test.go | 31 ++---- 4 files changed, 77 insertions(+), 169 deletions(-) diff --git a/fs/localfs/local_fs_test.go b/fs/localfs/local_fs_test.go index 81b97f92de4..900f5e26ca5 100644 --- a/fs/localfs/local_fs_test.go +++ b/fs/localfs/local_fs_test.go @@ -29,9 +29,9 @@ func TestSymlink(t *testing.T) { absLink := filepath.Join(tmp, "abslink") relLink := filepath.Join(tmp, "rellink") - assertNoError(t, os.WriteFile(fn, []byte{1, 2, 3}, 0o777)) - assertNoError(t, os.Symlink(fn, absLink)) - assertNoError(t, os.Symlink("./target", relLink)) + require.NoError(t, os.WriteFile(fn, []byte{1, 2, 3}, 0o777)) + require.NoError(t, os.Symlink(fn, absLink)) + require.NoError(t, os.Symlink("./target", relLink)) verifyLink(t, absLink, fn) verifyLink(t, relLink, fn) @@ -68,41 +68,26 @@ func verifyLink(t *testing.T, path, expected string) { //nolint:gocyclo func TestFiles(t *testing.T) { ctx := testlogging.Context(t) - - var err error - tmp := testutil.TempDirectory(t) - var dir fs.Directory - // Try listing directory that does not exist. - _, err = Directory(fmt.Sprintf("/no-such-dir-%v", clock.Now().Nanosecond())) - if err == nil { - t.Errorf("expected error when dir directory that does not exist.") - } + _, err := Directory(fmt.Sprintf("/no-such-dir-%v", clock.Now().Nanosecond())) + require.Error(t, err, "expected error when dir directory that does not exist.") // Now list an empty directory that does exist. - dir, err = Directory(tmp) - if err != nil { - t.Errorf("error when dir empty directory: %v", err) - } + dir, err := Directory(tmp) + require.NoError(t, err, "error when dir empty directory") entries, err := fs.GetAllEntries(ctx, dir) - if err != nil { - t.Errorf("error gettind dir Entries: %v", err) - } - - if len(entries) > 0 { - t.Errorf("expected empty directory, got %v", dir) - } + require.NoError(t, err, "error gettind dir Entries") + require.Empty(t, entries, "expected empty directory") // Now list a directory with 3 files. - assertNoError(t, os.WriteFile(filepath.Join(tmp, "f3"), []byte{1, 2, 3}, 0o777)) - assertNoError(t, os.WriteFile(filepath.Join(tmp, "f2"), []byte{1, 2, 3, 4}, 0o777)) - assertNoError(t, os.WriteFile(filepath.Join(tmp, "f1"), []byte{1, 2, 3, 4, 5}, 0o777)) - - assertNoError(t, os.Mkdir(filepath.Join(tmp, "z"), 0o777)) - assertNoError(t, os.Mkdir(filepath.Join(tmp, "y"), 0o777)) + require.NoError(t, os.WriteFile(filepath.Join(tmp, "f3"), []byte{1, 2, 3}, 0o777)) + require.NoError(t, os.WriteFile(filepath.Join(tmp, "f2"), []byte{1, 2, 3, 4}, 0o777)) + require.NoError(t, os.WriteFile(filepath.Join(tmp, "f1"), []byte{1, 2, 3, 4, 5}, 0o777)) + require.NoError(t, os.Mkdir(filepath.Join(tmp, "z"), 0o777)) + require.NoError(t, os.Mkdir(filepath.Join(tmp, "y"), 0o777)) expected := map[string]fileEnt{ "f1": { @@ -128,14 +113,10 @@ func TestFiles(t *testing.T) { } dir, err = Directory(tmp) - if err != nil { - t.Errorf("error when dir directory with files: %v", err) - } + require.NoError(t, err, "error when dir directory with files") entries, err = fs.GetAllEntries(ctx, dir) - if err != nil { - t.Errorf("error gettind dir Entries: %v", err) - } + require.NoError(t, err, "error gettind dir Entries") goodCount := 0 @@ -201,7 +182,7 @@ func testIterate(t *testing.T, nFiles int) { tmp := testutil.TempDirectory(t) for i := range nFiles { - assertNoError(t, os.WriteFile(filepath.Join(tmp, fmt.Sprintf("f%v", i)), []byte{1, 2, 3}, 0o777)) + require.NoError(t, os.WriteFile(filepath.Join(tmp, fmt.Sprintf("f%v", i)), []byte{1, 2, 3}, 0o777)) } dir, err := Directory(tmp) @@ -249,41 +230,23 @@ func verifyChild(t *testing.T, dir fs.Directory) { t.Helper() ctx := testlogging.Context(t) - child, err := dir.Child(ctx, "f3") - if err != nil { - t.Errorf("child error: %v", err) - } - if _, err = dir.Child(ctx, "f4"); !errors.Is(err, fs.ErrEntryNotFound) { - t.Errorf("unexpected child error: %v", err) - } - - if got, want := child.Name(), "f3"; got != want { - t.Errorf("unexpected child name: %v, want %v", got, want) - } + require.NoError(t, err, "child error") + require.Equal(t, "f3", child.Name(), "unexpected child name") + require.Equal(t, int64(3), child.Size(), "unexpected child size") - if got, want := child.Size(), int64(3); got != want { - t.Errorf("unexpected child size: %v, want %v", got, want) - } + _, err = dir.Child(ctx, "f4") + require.ErrorIs(t, err, fs.ErrEntryNotFound, "unexpected child error") - if _, err = fs.IterateEntriesAndFindChild(ctx, dir, "f4"); !errors.Is(err, fs.ErrEntryNotFound) { - t.Errorf("unexpected child error: %v", err) - } + _, err = fs.IterateEntriesAndFindChild(ctx, dir, "f4") + require.ErrorIs(t, err, fs.ErrEntryNotFound, "unexpected child error") // read child again, this time using IterateEntriesAndFindChild child2, err := fs.IterateEntriesAndFindChild(ctx, dir, "f3") - if err != nil { - t.Errorf("child2 error: %v", err) - } - - if got, want := child2.Name(), "f3"; got != want { - t.Errorf("unexpected child2 name: %v, want %v", got, want) - } - - if got, want := child2.Size(), int64(3); got != want { - t.Errorf("unexpected child2 size: %v, want %v", got, want) - } + require.NoError(t, err, "child2 error") + require.Equal(t, "f3", child2.Name(), "unexpected child name") + require.Equal(t, int64(3), child2.Size(), "unexpected child size") } func TestLocalFilesystemPath(t *testing.T) { @@ -336,11 +299,3 @@ func TestDirPrefix(t *testing.T) { require.Equal(t, want, dirPrefix(input), input) } } - -func assertNoError(t *testing.T, err error) { - t.Helper() - - if err != nil { - t.Errorf("err: %v", err) - } -} diff --git a/tests/robustness/snapmeta/index_test.go b/tests/robustness/snapmeta/index_test.go index 766df5321aa..9805bab9f6b 100644 --- a/tests/robustness/snapmeta/index_test.go +++ b/tests/robustness/snapmeta/index_test.go @@ -5,6 +5,8 @@ package snapmeta import ( "testing" + + "github.com/stretchr/testify/require" ) func TestIndex(t *testing.T) { @@ -18,18 +20,11 @@ func TestIndex(t *testing.T) { idx.AddToIndex(snapIDKey, snapshotIndexName) keys := idx.GetKeys(snapshotIndexName) - if got, want := len(keys), 1; got != want { - t.Fatalf("expected %v keys but got %v", want, got) - } - - if got, want := keys[0], snapIDKey; got != want { - t.Fatalf("expected %v but got %v", want, got) - } + require.Len(t, keys, 1, "unexpected number of keys") + require.Equal(t, snapIDKey, keys[0]) idx.RemoveFromIndex(snapIDKey, snapshotIndexName) keys = idx.GetKeys(snapshotIndexName) - if got, want := len(keys), 0; got != want { - t.Fatalf("expected %v keys but got %v", want, got) - } + require.Empty(t, keys) } diff --git a/tests/robustness/snapmeta/kopia_persister_light_test.go b/tests/robustness/snapmeta/kopia_persister_light_test.go index 280ebffb008..5000430a0fc 100644 --- a/tests/robustness/snapmeta/kopia_persister_light_test.go +++ b/tests/robustness/snapmeta/kopia_persister_light_test.go @@ -4,29 +4,25 @@ package snapmeta import ( - "bytes" "context" - "log" "os" "strconv" "testing" -) -var ( - key = "mykey" - val = []byte("myval") + "github.com/stretchr/testify/require" ) -func TestStoreLoadDelete(t *testing.T) { - ctx := context.Background() +const key = "mykey" - repoPath, err := os.MkdirTemp("", "kopia-test-repo-") - assertNoError(t, err) - - defer os.RemoveAll(repoPath) +var val = []byte("myval") +func TestStoreLoadDelete(t *testing.T) { + repoPath := t.TempDir() kpl := initKPL(t, repoPath) - defer kpl.Cleanup() + + t.Cleanup(kpl.Cleanup) + + ctx := context.Background() kpl.testStoreLoad(ctx, t, key, val) kpl.testDelete(ctx, t, key) @@ -35,13 +31,10 @@ func TestStoreLoadDelete(t *testing.T) { func TestConcurrency(t *testing.T) { ctx := context.Background() - repoPath, err := os.MkdirTemp("", "kopia-test-repo-") - assertNoError(t, err) - - defer os.RemoveAll(repoPath) - + repoPath := t.TempDir() kpl := initKPL(t, repoPath) - defer kpl.Cleanup() + + t.Cleanup(kpl.Cleanup) keys := []string{"key1", "key2", "key3"} vals := [][]byte{[]byte("val1"), []byte("val2"), []byte("val3")} @@ -68,14 +61,12 @@ func TestConcurrency(t *testing.T) { // Store and test that subsequent Load succeeds. func (kpl *KopiaPersisterLight) testStoreLoad(ctx context.Context, t *testing.T, key string, val []byte) { //nolint:thelper err := kpl.Store(ctx, key, val) - assertNoError(t, err) + require.NoError(t, err) - valOut, err := kpl.Load(ctx, key) - assertNoError(t, err) + got, err := kpl.Load(ctx, key) + require.NoError(t, err) - if !bytes.Equal(valOut, val) { - t.Fatal("loaded value does not equal stored value", valOut, val) - } + require.Equal(t, val, got) } // Delete and test that subsequent Load fails. @@ -83,85 +74,67 @@ func (kpl *KopiaPersisterLight) testDelete(ctx context.Context, t *testing.T, ke kpl.Delete(ctx, key) _, err := kpl.Load(ctx, key) - log.Println("err:", err) - if err == nil { - t.Fatal("snapshot was not deleted properly") - } + require.Error(t, err, "snapshot was not deleted properly") } func TestPersistence(t *testing.T) { ctx := context.Background() - repoPath, err := os.MkdirTemp("", "kopia-test-repo-") - assertNoError(t, err) + repoPath := t.TempDir() kpl := initKPL(t, repoPath) // Persistence directory should be set. - if persistDir := kpl.GetPersistDir(); persistDir == "" { - t.Error("could not get persistence directory") - } + persistDir := kpl.GetPersistDir() + require.NotEmpty(t, persistDir, "could not get persistence directory") // These are no-ops and should always succeed. - err = kpl.LoadMetadata() - assertNoError(t, err) + err := kpl.LoadMetadata() + require.NoError(t, err) err = kpl.FlushMetadata() - assertNoError(t, err) + require.NoError(t, err) // Store and cleanup kpl err = kpl.Store(ctx, key, val) - assertNoError(t, err) + require.NoError(t, err) kpl.Cleanup() // Re-initialize and Load kpl = initKPL(t, repoPath) - valOut, err := kpl.Load(ctx, key) - assertNoError(t, err) - - if !bytes.Equal(valOut, val) { - t.Fatal("loaded value does not equal stored value") - } + t.Cleanup(kpl.Cleanup) - kpl.Cleanup() - os.RemoveAll(repoPath) + got, err := kpl.Load(ctx, key) + require.NoError(t, err) + require.Equal(t, val, got, "loaded value is not equal to stored value") } func TestS3Connect(t *testing.T) { - repoPath, err := os.MkdirTemp("", "kopia-test-repo-") - assertNoError(t, err) + repoPath := t.TempDir() // Test the S3 code path by attempting to connect to a nonexistent bucket. t.Setenv(S3BucketNameEnvKey, "does-not-exist") kpl, err := NewPersisterLight("") - assertNoError(t, err) + require.NoError(t, err) - if err := kpl.ConnectOrCreateRepo(repoPath); err == nil { - t.Error("should not be able to connect to nonexistent S3 bucket") - } + err = kpl.ConnectOrCreateRepo(repoPath) + require.Error(t, err, "should not be able to connect to nonexistent S3 bucket") kpl.Cleanup() - os.RemoveAll(repoPath) } -func initKPL(t *testing.T, repoPath string) *KopiaPersisterLight { //nolint:thelper +func initKPL(t *testing.T, repoPath string) *KopiaPersisterLight { + t.Helper() + os.Unsetenv(S3BucketNameEnvKey) kpl, err := NewPersisterLight("") - assertNoError(t, err) + require.NoError(t, err) err = kpl.ConnectOrCreateRepo(repoPath) - assertNoError(t, err) + require.NoError(t, err) return kpl } - -func assertNoError(t *testing.T, err error) { - t.Helper() - - if err != nil { - t.Errorf("err: %v", err) - } -} diff --git a/tests/robustness/snapmeta/simple_test.go b/tests/robustness/snapmeta/simple_test.go index 6233cc6c517..cd36869cd62 100644 --- a/tests/robustness/snapmeta/simple_test.go +++ b/tests/robustness/snapmeta/simple_test.go @@ -4,11 +4,11 @@ package snapmeta import ( - "bytes" "context" - "errors" "testing" + "github.com/stretchr/testify/require" + "github.com/kopia/kopia/tests/robustness" ) @@ -18,35 +18,20 @@ func TestSimpleBasic(t *testing.T) { simple := NewSimple() gotData, err := simple.Load(ctx, "non-existent-key") - if !errors.Is(err, robustness.ErrKeyNotFound) { - t.Fatalf("Did not get expected error: %q", err) - } - - if gotData != nil { - t.Fatalf("Expecting nil data return from a key that does not exist") - } + require.ErrorIs(t, err, robustness.ErrKeyNotFound, "Did not get expected error") + require.Nil(t, gotData, "Expecting nil data return from a key that does not exist") storeKey := "key-to-store" data := []byte("some stored data") simple.Store(ctx, storeKey, data) gotData, err = simple.Load(ctx, storeKey) - if err != nil { - t.Fatalf("Error getting key: %v", err) - } - - if !bytes.Equal(gotData, data) { - t.Fatalf("Did not get the correct data") - } + require.NoError(t, err, "Error getting key") + require.Equal(t, data, gotData, "Did not get the correct data") simple.Delete(ctx, storeKey) gotData, err = simple.Load(ctx, storeKey) - if !errors.Is(err, robustness.ErrKeyNotFound) { - t.Fatalf("Did not get expected error: %q", err) - } - - if gotData != nil { - t.Fatalf("Expecting nil data return from a deleted key") - } + require.ErrorIs(t, err, robustness.ErrKeyNotFound, "Did not get expected error") + require.Nil(t, gotData, "Expecting nil data return from a deleted key") } From f12fafb5169c6b2d7a7f825213c7d2268cb8b313 Mon Sep 17 00:00:00 2001 From: blenderfreaky Date: Thu, 24 Apr 2025 08:37:15 +0200 Subject: [PATCH 076/206] docs(cli): clarify documentation regarding per-user and per-host (#4512) Ref: #4341 --------- Co-authored-by: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> --- cli/command_policy.go | 2 +- cli/command_policy_edit.go | 2 +- cli/command_policy_export.go | 2 +- cli/command_policy_remove.go | 2 +- cli/command_policy_set.go | 2 +- site/content/docs/Getting started/_index.md | 12 +++++++++++- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/cli/command_policy.go b/cli/command_policy.go index 3e31b564fe9..5f112399f73 100644 --- a/cli/command_policy.go +++ b/cli/command_policy.go @@ -40,7 +40,7 @@ type policyTargetFlags struct { } func (c *policyTargetFlags) setup(cmd *kingpin.CmdClause) { - cmd.Arg("target", "Select a particular policy ('user@host','@host','user@host:path' or a local path). Use --global to target the global policy.").StringsVar(&c.targets) + cmd.Arg("target", "Select a particular policy (a per-host policy `@host`, a per-user policy `user@host`, a per-path policy `user@host:path` or a local path). Use --global to target the global policy.").StringsVar(&c.targets) cmd.Flag("global", "Select the global policy.").BoolVar(&c.global) } diff --git a/cli/command_policy_edit.go b/cli/command_policy_edit.go index 20562156674..61b04f1bd76 100644 --- a/cli/command_policy_edit.go +++ b/cli/command_policy_edit.go @@ -57,7 +57,7 @@ type commandPolicyEdit struct { } func (c *commandPolicyEdit) setup(svc appServices, parent commandParent) { - cmd := parent.Command("edit", "Set snapshot policy for a single directory, user@host or a global policy.") + cmd := parent.Command("edit", "Edit policy.") c.policyTargetFlags.setup(cmd) cmd.Action(svc.repositoryWriterAction(c.run)) c.out.setup(svc) diff --git a/cli/command_policy_export.go b/cli/command_policy_export.go index 1bfa92e1fe4..cf243ddda57 100644 --- a/cli/command_policy_export.go +++ b/cli/command_policy_export.go @@ -27,7 +27,7 @@ type commandPolicyExport struct { const exportFilePerms = 0o600 func (c *commandPolicyExport) setup(svc appServices, parent commandParent) { - cmd := parent.Command("export", "Exports the policy to the specified file, or to stdout if none is specified.") + cmd := parent.Command("export", "Exports the policies to the specified file, or to stdout if none is specified.") cmd.Flag("to-file", "File path to export to").StringVar(&c.filePath) cmd.Flag("overwrite", "Overwrite the file if it exists").BoolVar(&c.overwrite) diff --git a/cli/command_policy_remove.go b/cli/command_policy_remove.go index 15052ecf741..3a86df2118a 100644 --- a/cli/command_policy_remove.go +++ b/cli/command_policy_remove.go @@ -15,7 +15,7 @@ type commandPolicyDelete struct { } func (c *commandPolicyDelete) setup(svc appServices, parent commandParent) { - cmd := parent.Command("delete", "Remove snapshot policy for a single directory, user@host or a global policy.").Alias("remove").Alias("rm") + cmd := parent.Command("delete", "Remove policy.").Alias("remove").Alias("rm") c.policyTargetFlags.setup(cmd) cmd.Flag("dry-run", "Do not remove").Short('n').BoolVar(&c.dryRun) cmd.Action(svc.repositoryWriterAction(c.run)) diff --git a/cli/command_policy_set.go b/cli/command_policy_set.go index 46fd744a92d..27868ad5815 100644 --- a/cli/command_policy_set.go +++ b/cli/command_policy_set.go @@ -31,7 +31,7 @@ type commandPolicySet struct { } func (c *commandPolicySet) setup(svc appServices, parent commandParent) { - cmd := parent.Command("set", "Set snapshot policy for a single directory, user@host or a global policy.") + cmd := parent.Command("set", "Set policy.") c.policyTargetFlags.setup(cmd) cmd.Flag(inheritPolicyString, "Enable or disable inheriting policies from the parent").BoolListVar(&c.inherit) diff --git a/site/content/docs/Getting started/_index.md b/site/content/docs/Getting started/_index.md index 294425e357c..3368bb5bac0 100755 --- a/site/content/docs/Getting started/_index.md +++ b/site/content/docs/Getting started/_index.md @@ -38,7 +38,15 @@ After the initial snapshot, for every snapshot afterwards Kopia will rescan the > PRO TIP: If you pick a value for `Snapshot Frequency` when creating a `policy`, then Kopia will automatically take snapshots at that frequency (e.g., every one hour or whatever value you pick), and you do not need to remember to manually run the snapshot. If you do not pick a `Snapshot Frequency`, then Kopia will not automatically take snapshots, and you need to manually run snapshots from the `Snapshots` tab (just click the `Snapshot Now` button as needed). -Note that you can set policies at two levels in `KopiaUI` -- at the `global` level, where the settings are applied by default to all policies that do not define their own settings, or at the individual `policy` level, where the settings are applied only to that particular policy. By default, all new policies are set to inherit settings from the `global` policy. The `global` policy is the one that says `*` for `Username`, `Host`, and `Path`. +Note that you can set policies at four levels in `KopiaUI`: +* at the `global` level (shown with `*` for `Username`, `Host` and `Path`), +* at the per-host `@host` level (shown with `*` for `Username` and `Path`), +* at the per-user `user@host` level (shown with `*` for `Path`), +* and at the individual `Path` level, where the settings are applied only to that particular policy. + +By default, all new policies are set to inherit settings from the `global` policy, as well as from the applicable per-host and per-user policies. More specific policies settings take priority. This means that individual per-path policies settings come first, followed by per-user, then per-host and finally global policy settings. + +For example, say you have a path policy for `foo@bar:/path` which doesn't define setting `xyz`, a per-user policy for `foo@bar` setting `xyz` to `1` and the global policy setting `xyz` to `2`. In this case, the effective value of `xyz` for the policy `foo@bar:/path` will be `1`. > PRO TIP: Kopia does not currently support the ability to save one snapshot to multiple different repositories. However, you can use `KopiaUI` to connect to multiple different repositories simultaneously and create identical policies for each repository, which essentially achieves the same outcome of saving one snapshot to multiple different repositories. Connecting to more than one repository in `KopiaUI` is easy: just right-click the icon of the desktop application and select `Connect To Another Repository...`. Currently, this is only available in the desktop version of `KopiaUI` and not the web-based `KopiaUI`. However, if you are using the web-based `KopiaUI`, you can manually run multiple instances of `KopiaUI` to achieve the same outcome. @@ -286,6 +294,8 @@ Files policy: We can change policy settings using the [`kopia policy set` command](../reference/command-line/common/policy-set/). This command allows you to change the `global` policy or change specific policies for a 'user@host', a '@host', a 'user@host:path', or a particular directory. For example, here we tell Kopia to set the policy to ignore two directories from being included in the snapshot of `jarek@jareks-mbp:/Users/jarek/Projects/Kopia/site`: +> NOTE: When referring to policies, `user@host` and `@host` are used to refer to per-user and per-host policies, respectively. They do NOT refer to all policies defined under that user or host. + ``` $ kopia policy set --add-ignore public/ --add-ignore node_modules/ . Setting policy for jarek@jareks-mbp:/Users/jarek/Projects/Kopia/site From 6cd728394d2e78428b0c2f831887154c3232b2fc Mon Sep 17 00:00:00 2001 From: blenderfreaky Date: Thu, 24 Apr 2025 08:42:29 +0200 Subject: [PATCH 077/206] fix(site): escape flags with backticks (#4479) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(site): escape flags with backticks In the generated markdown docs, flags like `--foo` inside help texts currently get pretty-printed as `–foo` with an em-dash. This change applies backticks via a regex replacement, so that they appear as `--foo` in the docs but remain as --foo in the CLI output. --------- Co-authored-by: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> --- tools/cli2md/cli2md.go | 17 ++++++-- tools/cli2md/cli2md_test.go | 83 +++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 tools/cli2md/cli2md_test.go diff --git a/tools/cli2md/cli2md.go b/tools/cli2md/cli2md.go index ab7237bd340..eda32e7aa3f 100644 --- a/tools/cli2md/cli2md.go +++ b/tools/cli2md/cli2md.go @@ -8,6 +8,7 @@ import ( "log" "os" "path/filepath" + "regexp" "sort" "strings" @@ -31,6 +32,14 @@ const ( dirMode = 0o750 ) +// The group at the start is to avoid matching things like "in-place". +var escapeFlagsRe = regexp.MustCompile(`(^|\s)(--?\w+[-\w]*)`) + +// escapeFlags escapes command-line flag references in help text by wrapping them in backticks. +func escapeFlags(text string) string { + return escapeFlagsRe.ReplaceAllString(text, "$1`$2`") +} + //nolint:gochecknoglobals var overrideDefault = map[string]string{ "config-file": "repository.config", @@ -75,9 +84,9 @@ func emitFlags(w io.Writer, flags []*kingpin.FlagModel) { defaultValue = "`false`" } - fmt.Fprintf(w, "| `--[no-]%v` | %v | %v | %v%v |\n", f.Name, shortFlag, defaultValue, maybeAdvanced, f.Help) //nolint:errcheck + fmt.Fprintf(w, "| `--[no-]%v` | %v | %v | %v%v |\n", f.Name, shortFlag, defaultValue, maybeAdvanced, escapeFlags(f.Help)) //nolint:errcheck } else { - fmt.Fprintf(w, "| `--%v` | %v | %v | %v%v |\n", f.Name, shortFlag, defaultValue, maybeAdvanced, f.Help) //nolint:errcheck + fmt.Fprintf(w, "| `--%v` | %v | %v | %v%v |\n", f.Name, shortFlag, defaultValue, maybeAdvanced, escapeFlags(f.Help)) //nolint:errcheck } } @@ -122,7 +131,7 @@ func emitArgs(w io.Writer, args []*kingpin.ArgModel) { }) for _, f := range args2 { - fmt.Fprintf(w, "| `%v` | %v |\n", f.Name, f.Help) //nolint:errcheck + fmt.Fprintf(w, "| `%v` | %v |\n", f.Name, escapeFlags(f.Help)) //nolint:errcheck } fmt.Fprintf(w, "\n") //nolint:errcheck @@ -297,7 +306,7 @@ hide_summary: true } fmt.Fprintf(f, "```shell\n$ kopia %v%v%v\n```\n\n", cmd.FullCommand, flagSummary, argSummary) //nolint:errcheck - fmt.Fprintf(f, "%v\n\n", cmd.Help) //nolint:errcheck + fmt.Fprintf(f, "%v\n\n", escapeFlags(cmd.Help)) //nolint:errcheck emitFlags(f, cmd.Flags) emitArgs(f, cmd.Args) diff --git a/tools/cli2md/cli2md_test.go b/tools/cli2md/cli2md_test.go new file mode 100644 index 00000000000..ced62f5b60c --- /dev/null +++ b/tools/cli2md/cli2md_test.go @@ -0,0 +1,83 @@ +package main + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestEscapeFlags(t *testing.T) { + cases := []struct { + name string + input string + expected string + }{ + { + name: "empty string", + input: "", + expected: "", + }, + { + name: "basic single flag", + input: "use -flag to enable", + expected: "use `-flag` to enable", + }, + { + name: "double dash flag", + input: "use --long-flag-name to configure", + expected: "use `--long-flag-name` to configure", + }, + { + name: "multiple flags", + input: "use -a or --bee flags", + expected: "use `-a` or `--bee` flags", + }, + { + name: "should not match in-place", + input: "performs in-place modification", + expected: "performs in-place modification", + }, + { + name: "flags with numbers and hyphens", + input: "use --http2-max-streams or -h2-timeout", + expected: "use `--http2-max-streams` or `-h2-timeout`", + }, + { + name: "flag at start of string", + input: "-flag at start", + expected: "`-flag` at start", + }, + { + name: "existing backticks", + input: "use `--existing` and -new flags", + expected: "use `--existing` and `-new` flags", + }, + { + name: "multiple spaces before flag", + input: "test -flag with spaces", + expected: "test `-flag` with spaces", + }, + { + name: "mixed valid and invalid patterns", + input: "test in-place and -valid --flags", + expected: "test in-place and `-valid` `--flags`", + }, + { + name: "separator line", + input: "---------------", + expected: "---------------", + }, + { + name: "too many dashes", + input: "none ---of these --- dashes ----should match", + expected: "none ---of these --- dashes ----should match", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + got := escapeFlags(tc.input) + require.Equal(t, tc.expected, got) + }) + } +} From b0827d128a59312f2b59ffc0c39ce19c9989ea7a Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Fri, 25 Apr 2025 23:47:08 +0200 Subject: [PATCH 078/206] fix(ci): remove gocritic unnecessaryDefer exclusion (#4525) Signed-off-by: Matthieu MOREL --- .golangci.yml | 3 --- repo/blob/filesystem/filesystem_storage_test.go | 2 +- tests/end_to_end_test/restore_test.go | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index ac164feccfb..ceca30b4388 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -133,9 +133,6 @@ linters: - text: "Magic number: 1e" linters: - mnd - - text: "unnecessaryDefer" - linters: - - gocritic - text: "filepathJoin" linters: - gocritic diff --git a/repo/blob/filesystem/filesystem_storage_test.go b/repo/blob/filesystem/filesystem_storage_test.go index 226f108ecc9..946e1860097 100644 --- a/repo/blob/filesystem/filesystem_storage_test.go +++ b/repo/blob/filesystem/filesystem_storage_test.go @@ -336,7 +336,7 @@ func TestFileStorage_New_MkdirAllFailureIsIgnored(t *testing.T) { }, true) require.NoError(t, err) - defer st.Close(ctx) + st.Close(ctx) } func TestFileStorage_New_ChecksDirectoryExistence(t *testing.T) { diff --git a/tests/end_to_end_test/restore_test.go b/tests/end_to_end_test/restore_test.go index cb699b2a9b6..a106e797671 100644 --- a/tests/end_to_end_test/restore_test.go +++ b/tests/end_to_end_test/restore_test.go @@ -809,7 +809,7 @@ func verifyValidZipFile(t *testing.T, fname string) { zr, err := zip.OpenReader(fname) require.NoError(t, err) - defer zr.Close() + zr.Close() } func verifyValidTarFile(t *testing.T, fname string) { From 8a176255c0fbc810b3c5d07a115693d521558e35 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Sat, 26 Apr 2025 22:01:20 +0200 Subject: [PATCH 079/206] fix(general): enable wsl for all go files (#4524) Signed-off-by: Matthieu MOREL --- .golangci.yml | 1 - cli/command_notification_profile_test.go | 1 + cli/command_notification_template_test.go | 1 + cli/command_policy_export_test.go | 9 +++++++++ cli/command_policy_import_test.go | 14 ++++++++++++++ cli/command_repository_upgrade_test.go | 1 + cli/command_server_control_test.go | 2 ++ cli/command_server_notifications_test.go | 1 + cli/command_snapshot_fix_test.go | 1 + fs/ignorefs/ignorefs_test.go | 1 + internal/blobtesting/cleanup.go | 1 + internal/blobtesting/concurrent.go | 4 ++++ internal/blobtesting/faulty.go | 1 + internal/blobtesting/verify.go | 1 + internal/cache/content_cache_test.go | 1 + internal/connection/reconnector_test.go | 8 ++++++++ internal/epoch/epoch_manager_test.go | 4 ++++ internal/logfile/logfile_test.go | 1 + .../parallelwork/parallel_work_queue_test.go | 2 ++ internal/pproflogging/pproflogging_test.go | 8 ++++++++ internal/scheduler/scheduler_test.go | 1 + internal/server/api_policies_test.go | 1 + internal/tempfile/tempfile_verify_test.go | 1 + internal/uitask/uitask_test.go | 5 +++++ internal/user/password_hashings_test.go | 1 + .../sender/jsonsender/jsonsender_test.go | 1 + .../sender/pushover/pushover_sender_test.go | 2 ++ .../sender/testsender/test_sender_test.go | 3 +++ .../sender/webhook/webhook_sender_test.go | 2 ++ repo/blob/gcs/gcs_versioned_test.go | 3 +++ repo/blob/s3/s3_versioned_test.go | 3 +++ repo/blob/sftp/sftp_storage_test.go | 1 + repo/blob/storage_test.go | 3 +++ repo/blob/webdav/webdav_storage_test.go | 2 ++ repo/content/content_index_recovery_test.go | 4 ++++ repo/content/content_manager_test.go | 18 ++++++++++++++++++ repo/content/index/merged_test.go | 1 + repo/content/index/packindex_test.go | 8 ++++++++ .../indexblob/index_blob_manager_v0_test.go | 1 + repo/format/upgrade_lock_test.go | 3 +++ repo/maintenance/content_rewrite_test.go | 2 ++ repo/maintenance/maintenance_quick_test.go | 1 + repo/maintenance/maintenance_safety_test.go | 5 +++++ repo/object/object_manager_test.go | 3 +++ repo/repository_test.go | 9 +++++++++ snapshot/policy/policy_manager_test.go | 1 + snapshot/policy/retention_policy_test.go | 2 ++ snapshot/snapshotfs/snapshot_verifier_test.go | 2 ++ .../snapshotmaintenance_test.go | 1 + snapshot/upload/upload_estimator_test.go | 2 ++ snapshot/upload/upload_test.go | 11 +++++++++++ tests/end_to_end_test/auto_update_test.go | 3 +++ tests/end_to_end_test/compression_test.go | 2 ++ tests/end_to_end_test/ecc_test.go | 4 ++++ .../end_to_end_test/repository_connect_test.go | 5 +++++ tests/end_to_end_test/restore_test.go | 1 + tests/end_to_end_test/shallowrestore_test.go | 1 + tests/end_to_end_test/snapshot_actions_test.go | 1 + tests/end_to_end_test/snapshot_create_test.go | 2 ++ tests/endurance_test/endurance_test.go | 1 + tests/htmlui_e2e_test/context_test.go | 1 + tests/htmlui_e2e_test/htmlui_e2e_test.go | 1 + .../repository_stress_test.go | 1 + tests/robustness/checker/checker.go | 2 ++ tests/robustness/engine/engine_test.go | 1 + .../multiclient_test/framework/harness.go | 3 +++ tests/robustness/multiclient_test/main_test.go | 1 + .../multiclient_test/multiclient_test.go | 1 + .../storagestats/storage_stats.go | 3 +++ .../snapmeta/kopia_persister_light.go | 1 + tests/tools/fio/workload.go | 1 + 71 files changed, 201 insertions(+), 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index ceca30b4388..c0f32daca75 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -119,7 +119,6 @@ linters: - perfsprint - revive - wrapcheck - - wsl - text: "log is a global variable" linters: - gochecknoglobals diff --git a/cli/command_notification_profile_test.go b/cli/command_notification_profile_test.go index 3114d61104f..25dabd3b568 100644 --- a/cli/command_notification_profile_test.go +++ b/cli/command_notification_profile_test.go @@ -97,6 +97,7 @@ func TestNotificationProfile_WebHook(t *testing.T) { testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "notification", "profile", "show", "--profile-name=myotherwebhook", "--json", "--raw"), &opt) var summ notifyprofile.Summary + testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "notification", "profile", "show", "--profile-name=myotherwebhook", "--json"), &summ) require.Equal(t, []string{ diff --git a/cli/command_notification_template_test.go b/cli/command_notification_template_test.go index 19e38775174..9e628455ff6 100644 --- a/cli/command_notification_template_test.go +++ b/cli/command_notification_template_test.go @@ -97,6 +97,7 @@ func TestNotificationTemplates(t *testing.T) { return nil } + return nil } diff --git a/cli/command_policy_export_test.go b/cli/command_policy_export_test.go index e119a66aba8..4257d86db60 100644 --- a/cli/command_policy_export_test.go +++ b/cli/command_policy_export_test.go @@ -57,6 +57,7 @@ func TestExportPolicy(t *testing.T) { // check if we get the new policy var policies3 map[string]*policy.Policy + testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export", id), &policies3) assert.Len(t, policies3, 1, "unexpected number of policies") @@ -64,6 +65,7 @@ func TestExportPolicy(t *testing.T) { // specifying a local id should return the same policy var policies4 map[string]*policy.Policy + testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export", td), &policies4) // note: td, not id assert.Len(t, policies4, 1, "unexpected number of policies") @@ -71,6 +73,7 @@ func TestExportPolicy(t *testing.T) { // exporting without specifying a policy should return all policies var policies5 map[string]*policy.Policy + testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export"), &policies5) assert.Len(t, policies5, 2, "unexpected number of policies") @@ -80,12 +83,14 @@ func TestExportPolicy(t *testing.T) { exportPath := path.Join(td, "exported.json") e.RunAndExpectSuccess(t, "policy", "export", "--to-file", exportPath) + exportedContent, err := os.ReadFile(exportPath) if err != nil { t.Fatalf("unable to read exported file: %v", err) } var policies6 map[string]*policy.Policy + testutil.MustParseJSONLines(t, []string{string(exportedContent)}, &policies6) assert.Equal(t, expectedPolicies, policies6, "unexpected policy") @@ -102,6 +107,7 @@ func TestExportPolicy(t *testing.T) { } var policies7 map[string]*policy.Policy + testutil.MustParseJSONLines(t, []string{string(exportedContent)}, &policies7) // we specified id, so only that policy should be exported @@ -112,10 +118,13 @@ func TestExportPolicy(t *testing.T) { policies8prettyJSON := e.RunAndExpectSuccess(t, "policy", "export", "--json-indent") var policies8pretty map[string]*policy.Policy + testutil.MustParseJSONLines(t, policies8prettyJSON, &policies8pretty) policies8JSON := e.RunAndExpectSuccess(t, "policy", "export") + var policies8 map[string]*policy.Policy + testutil.MustParseJSONLines(t, policies8JSON, &policies8) assert.Equal(t, policies8, policies8pretty, "pretty-printing should not change the content") diff --git a/cli/command_policy_import_test.go b/cli/command_policy_import_test.go index e1700065f11..0589a31ce11 100644 --- a/cli/command_policy_import_test.go +++ b/cli/command_policy_import_test.go @@ -30,7 +30,9 @@ func TestImportPolicy(t *testing.T) { if err != nil { t.Fatalf("unable to marshal policy: %v", err) } + var defaultPolicy *policy.Policy + testutil.MustParseJSONLines(t, []string{string(defaultPolicyJSON)}, &defaultPolicy) specifiedPolicies := map[string]*policy.Policy{ @@ -53,6 +55,7 @@ func TestImportPolicy(t *testing.T) { // change the global policy specifiedPolicies["(global)"].SplitterPolicy.Algorithm = "FIXED-4M" + makePolicyFile() e.RunAndExpectSuccess(t, "policy", "import", "--from-file", policyFilePath) assertPoliciesEqual(t, e, specifiedPolicies) @@ -69,6 +72,7 @@ func TestImportPolicy(t *testing.T) { Algorithm: "FIXED-8M", }, } + makePolicyFile() e.RunAndExpectSuccess(t, "policy", "import", "--from-file", policyFilePath) assertPoliciesEqual(t, e, specifiedPolicies) @@ -76,6 +80,7 @@ func TestImportPolicy(t *testing.T) { // import from a file specifying changes in both policies but limiting import to only one specifiedPolicies["(global)"].CompressionPolicy.CompressorName = "zstd" specifiedPolicies[id].CompressionPolicy.CompressorName = "gzip" + makePolicyFile() e.RunAndExpectSuccess(t, "policy", "import", "--from-file", policyFilePath, "(global)") @@ -84,11 +89,13 @@ func TestImportPolicy(t *testing.T) { assertPoliciesEqual(t, e, specifiedPolicies) specifiedPolicies[id].CompressionPolicy.CompressorName = "gzip" + e.RunAndExpectSuccess(t, "policy", "import", "--from-file", policyFilePath, id) assertPoliciesEqual(t, e, specifiedPolicies) // deleting values should work specifiedPolicies[id].CompressionPolicy.CompressorName = "" + makePolicyFile() e.RunAndExpectSuccess(t, "policy", "import", "--from-file", policyFilePath, id) assertPoliciesEqual(t, e, specifiedPolicies) @@ -106,6 +113,7 @@ func TestImportPolicy(t *testing.T) { }, } specifiedPolicies[id2] = policy2 + makePolicyFile() e.RunAndExpectSuccess(t, "policy", "import", "--from-file", policyFilePath, id2) assertPoliciesEqual(t, e, specifiedPolicies) @@ -130,6 +138,7 @@ func TestImportPolicy(t *testing.T) { // add it back in specifiedPolicies[id2] = policy2 + makePolicyFile() e.RunAndExpectSuccess(t, "policy", "import", "--from-file", policyFilePath) assertPoliciesEqual(t, e, specifiedPolicies) @@ -142,6 +151,7 @@ func TestImportPolicy(t *testing.T) { // --global should be equivalent to (global) specifiedPolicies[id2] = policy2 + makePolicyFile() e.RunAndExpectSuccess(t, "policy", "import", "--from-file", policyFilePath, "--global") delete(specifiedPolicies, id2) // should NOT have been imported @@ -153,6 +163,7 @@ func TestImportPolicy(t *testing.T) { // another sanity check e.RunAndExpectSuccess(t, "policy", "import", "--from-file", policyFilePath) + specifiedPolicies[id2] = policy2 assertPoliciesEqual(t, e, specifiedPolicies) @@ -164,12 +175,15 @@ func TestImportPolicy(t *testing.T) { if err != nil { t.Fatalf("unable to write policy file: %v", err) } + e.RunAndExpectFailure(t, "policy", "import", "--from-file", policyFilePath) } func assertPoliciesEqual(t *testing.T, e *testenv.CLITest, expected map[string]*policy.Policy) { t.Helper() + var policies map[string]*policy.Policy + testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export"), &policies) assert.Equal(t, expected, policies, "unexpected policies") diff --git a/cli/command_repository_upgrade_test.go b/cli/command_repository_upgrade_test.go index 51000996c22..a9a995dd52b 100644 --- a/cli/command_repository_upgrade_test.go +++ b/cli/command_repository_upgrade_test.go @@ -421,6 +421,7 @@ func TestRepositoryUpgrade_checkIndexInfo(t *testing.T) { t.Run(strconv.Itoa(i), func(t *testing.T) { report := cli.CheckIndexInfo(tc.indexInfo0, tc.indexInfo1) require.Len(t, tc.expectRegexs, len(report), "unexpected report length") + for i := range tc.expectRegexs { require.Regexp(t, tc.expectRegexs[i], report[i], "report does not match regular expression") } diff --git a/cli/command_server_control_test.go b/cli/command_server_control_test.go index a9b1307fef5..08927a74ce8 100644 --- a/cli/command_server_control_test.go +++ b/cli/command_server_control_test.go @@ -59,6 +59,7 @@ func TestServerControl(t *testing.T) { require.Eventually(t, func() bool { lines := env.RunAndExpectSuccess(t, "server", "status", "--address", sp.BaseURL, "--server-control-password", sp.ServerControlPassword) t.Logf("lines: %v", lines) + return hasLine(lines, "IDLE: test-user@test-host:"+dir1) && hasLine(lines, "IDLE: test-user@test-host:"+dir2) }, waitTimeout, pollFrequency) @@ -75,6 +76,7 @@ func TestServerControl(t *testing.T) { require.Eventually(t, func() bool { lines := env.RunAndExpectSuccess(t, "server", "status", "--address", sp.BaseURL, "--server-control-password", sp.ServerControlPassword, "--remote") t.Logf("lines: %v", lines) + return hasLine(lines, "IDLE: test-user@test-host:"+dir3) }, waitTimeout, pollFrequency) diff --git a/cli/command_server_notifications_test.go b/cli/command_server_notifications_test.go index c03775e2257..59d0d7ad75e 100644 --- a/cli/command_server_notifications_test.go +++ b/cli/command_server_notifications_test.go @@ -25,6 +25,7 @@ func TestServerNotifications(t *testing.T) { mux.HandleFunc("/notification-webhook", func(w http.ResponseWriter, r *http.Request) { var b bytes.Buffer + io.Copy(&b, r.Body) notificationsReceived <- b.String() diff --git a/cli/command_snapshot_fix_test.go b/cli/command_snapshot_fix_test.go index f57d54e2a60..c4410073094 100644 --- a/cli/command_snapshot_fix_test.go +++ b/cli/command_snapshot_fix_test.go @@ -311,6 +311,7 @@ func TestSnapshotFix(t *testing.T) { env.RunAndExpectFailure(t, append([]string{"snapshot", "fix"}, tc.flags...)...) env.RunAndExpectFailure(t, append(append([]string{"snapshot", "fix"}, tc.flags...), "--commit")...) env.RunAndExpectFailure(t, "snapshot", "verify") + return } diff --git a/fs/ignorefs/ignorefs_test.go b/fs/ignorefs/ignorefs_test.go index 4832f323e84..7d1eef31ee9 100644 --- a/fs/ignorefs/ignorefs_test.go +++ b/fs/ignorefs/ignorefs_test.go @@ -566,6 +566,7 @@ func TestIgnoreFS(t *testing.T) { if tc.setup != nil { tc.setup(root) } + ifs := ignorefs.New(root, tc.policyTree) expectedFiles := addAndSubtractFiles(originalFiles, tc.addedFiles, tc.ignoredFiles) diff --git a/internal/blobtesting/cleanup.go b/internal/blobtesting/cleanup.go index 1885b63ca6b..eef4a4244db 100644 --- a/internal/blobtesting/cleanup.go +++ b/internal/blobtesting/cleanup.go @@ -32,6 +32,7 @@ func CleanupOldData(ctx context.Context, tb testing.TB, st blob.Storage, cleanup return st.DeleteBlob(ctx, it.BlobID) }) } + return nil }) diff --git a/internal/blobtesting/concurrent.go b/internal/blobtesting/concurrent.go index 482bfd46b13..12d32e3794a 100644 --- a/internal/blobtesting/concurrent.go +++ b/internal/blobtesting/concurrent.go @@ -69,6 +69,7 @@ func VerifyConcurrentAccess(t *testing.T, st blob.Storage, options ConcurrentAcc } err := st.GetBlob(ctx, blobID, offset, length, &data) + switch { case err == nil: if got, want := string(data.ToByteSlice()), string(blobID); !strings.HasPrefix(got, want) { @@ -93,6 +94,7 @@ func VerifyConcurrentAccess(t *testing.T, st blob.Storage, options ConcurrentAcc for range options.Iterations { blobID := randomBlobID() data := fmt.Sprintf("%v-%v", blobID, rand.Int63()) + err := st.PutBlob(ctx, blobID, gather.FromSlice([]byte(data)), blob.PutOptions{}) if err != nil { return errors.Wrapf(err, "PutBlob %v returned unexpected error", blobID) @@ -109,6 +111,7 @@ func VerifyConcurrentAccess(t *testing.T, st blob.Storage, options ConcurrentAcc for range options.Iterations { blobID := randomBlobID() err := st.DeleteBlob(ctx, blobID) + switch { case err == nil: // clean success @@ -130,6 +133,7 @@ func VerifyConcurrentAccess(t *testing.T, st blob.Storage, options ConcurrentAcc eg.Go(func() error { for range options.Iterations { blobID := randomBlobID() + prefix := blobID[0:rand.Intn(len(blobID))] if rand.Intn(100) < options.NonExistentListPrefixPercentage { prefix = "zzz" diff --git a/internal/blobtesting/faulty.go b/internal/blobtesting/faulty.go index f3c01df1b65..f36e7360b60 100644 --- a/internal/blobtesting/faulty.go +++ b/internal/blobtesting/faulty.go @@ -95,6 +95,7 @@ func (s *FaultyStorage) ListBlobs(ctx context.Context, prefix blob.ID, callback if ok, err := s.GetNextFault(ctx, MethodListBlobsItem, prefix); ok { return err } + return callback(bm) }) } diff --git a/internal/blobtesting/verify.go b/internal/blobtesting/verify.go index d81418b354f..0a9d26f4d91 100644 --- a/internal/blobtesting/verify.go +++ b/internal/blobtesting/verify.go @@ -106,6 +106,7 @@ func VerifyStorage(ctx context.Context, t *testing.T, r blob.Storage, opts blob. for _, b := range blocks { t.Run(string(b.blk), func(t *testing.T) { t.Parallel() + err := r.PutBlob(ctx, b.blk, gather.FromSlice(newContents), opts) if opts.DoNotRecreate { require.ErrorIsf(t, err, blob.ErrBlobAlreadyExists, "overwrote blob: %v", b) diff --git a/internal/cache/content_cache_test.go b/internal/cache/content_cache_test.go index 4367849e53e..c7b58a8912f 100644 --- a/internal/cache/content_cache_test.go +++ b/internal/cache/content_cache_test.go @@ -209,6 +209,7 @@ func verifyContentCache(t *testing.T, cc cache.ContentCache, cacheStorage blob.S } else { require.ErrorContainsf(t, err, tc.err.Error(), "tc.contentID: %v", tc.contentID) } + if got := v.ToByteSlice(); !bytes.Equal(got, tc.expected) { t.Errorf("unexpected data for %v: %x, wanted %x", tc.contentID, got, tc.expected) } diff --git a/internal/connection/reconnector_test.go b/internal/connection/reconnector_test.go index 563345ff8f9..0a0bd01ded8 100644 --- a/internal/connection/reconnector_test.go +++ b/internal/connection/reconnector_test.go @@ -89,6 +89,7 @@ func TestConnection(t *testing.T) { // still using connection # 1 if cnt == 0 { cnt++ + require.EqualValues(t, 1, cli.(*fakeConnection).id) cli.(*fakeConnection).isClosed = true @@ -106,6 +107,7 @@ func TestConnection(t *testing.T) { r.UsingConnectionNoResult(ctx, "third", func(cli connection.Connection) error { t.Logf("third called with %v", cli.(*fakeConnection).id) require.EqualValues(t, 2, cli.(*fakeConnection).id) + return nil }) @@ -118,6 +120,7 @@ func TestConnection(t *testing.T) { r.UsingConnectionNoResult(ctx, "parallel-2", func(cli connection.Connection) error { t.Logf("parallel-2 called with %v", cli.(*fakeConnection).id) require.EqualValues(t, 2, cli.(*fakeConnection).id) + return nil }) @@ -129,6 +132,7 @@ func TestConnection(t *testing.T) { require.NoError(t, r.UsingConnectionNoResult(ctx, "fourth", func(cli connection.Connection) error { t.Logf("fourth called with %v", cli.(*fakeConnection).id) require.EqualValues(t, 3, cli.(*fakeConnection).id) + return nil })) @@ -146,6 +150,7 @@ func TestConnection(t *testing.T) { require.NoError(t, r.UsingConnectionNoResult(ctx, "sixth", func(cli connection.Connection) error { t.Logf("sixth called with %v", cli.(*fakeConnection).id) require.EqualValues(t, 4, cli.(*fakeConnection).id) + return nil })) @@ -155,6 +160,7 @@ func TestConnection(t *testing.T) { return r.UsingConnectionNoResult(ctx, "parallel-a", func(cli connection.Connection) error { time.Sleep(500 * time.Millisecond) t.Logf("parallel-a called with %v", cli.(*fakeConnection).id) + return nil }) }) @@ -162,6 +168,7 @@ func TestConnection(t *testing.T) { return r.UsingConnectionNoResult(ctx, "parallel-b", func(cli connection.Connection) error { time.Sleep(300 * time.Millisecond) t.Logf("parallel-b called with %v", cli.(*fakeConnection).id) + return nil }) }) @@ -169,6 +176,7 @@ func TestConnection(t *testing.T) { return r.UsingConnectionNoResult(ctx, "parallel-c", func(cli connection.Connection) error { time.Sleep(100 * time.Millisecond) t.Logf("parallel-c called with %v", cli.(*fakeConnection).id) + return nil }) }) diff --git a/internal/epoch/epoch_manager_test.go b/internal/epoch/epoch_manager_test.go index af2edf15bd5..4a3e8897fb0 100644 --- a/internal/epoch/epoch_manager_test.go +++ b/internal/epoch/epoch_manager_test.go @@ -968,6 +968,7 @@ func TestMaybeCompactSingleEpoch(t *testing.T) { } te.mustWriteIndexFiles(ctx, t, newFakeIndexWithEntries(k)) + k++ } @@ -1088,6 +1089,7 @@ func TestMaybeGenerateRangeCheckpoint_CompactionError(t *testing.T) { } te.mustWriteIndexFiles(ctx, t, newFakeIndexWithEntries(k)) + k++ } @@ -1346,6 +1348,7 @@ func TestCleanupMarkers_FailToReadState(t *testing.T) { te.ft.Advance(1 * time.Hour) // force state refresh in CleanupMarkers cancel() + err := te.mgr.CleanupMarkers(ctx) require.Error(t, err) @@ -1391,6 +1394,7 @@ func TestCleanupMarkers_CleanUpManyMarkers(t *testing.T) { const epochsToAdvance = 5 te.mustWriteIndexFiles(ctx, t, newFakeIndexWithEntries(0)) + for i := range epochsToAdvance { te.ft.Advance(p.MinEpochDuration + 1*time.Hour) te.mgr.forceAdvanceEpoch(ctx) diff --git a/internal/logfile/logfile_test.go b/internal/logfile/logfile_test.go index a2142da288f..f4633dcc0ff 100644 --- a/internal/logfile/logfile_test.go +++ b/internal/logfile/logfile_test.go @@ -134,6 +134,7 @@ func TestLogFileRotation(t *testing.T) { require.NoError(t, err) t.Logf("%v %v", info.Name(), info.Size()) + if info.Mode().IsRegular() && info.Name() != cachedir.CacheDirMarkerFile { gotEntryCount++ } diff --git a/internal/parallelwork/parallel_work_queue_test.go b/internal/parallelwork/parallel_work_queue_test.go index b0359263de9..7ef32f7cddd 100644 --- a/internal/parallelwork/parallel_work_queue_test.go +++ b/internal/parallelwork/parallel_work_queue_test.go @@ -111,6 +111,7 @@ func TestWaitForActiveWorkers(t *testing.T) { return nil }) results <- 1 + return nil }) @@ -214,6 +215,7 @@ func TestOnNthCompletion(t *testing.T) { for range n + 1 { go func() { results <- onNthCompletion() + wg.Done() }() } diff --git a/internal/pproflogging/pproflogging_test.go b/internal/pproflogging/pproflogging_test.go index dc7e1cb795a..44ab703c953 100644 --- a/internal/pproflogging/pproflogging_test.go +++ b/internal/pproflogging/pproflogging_test.go @@ -165,9 +165,11 @@ func TestDebug_parseProfileConfigs(t *testing.T) { require.Len(t, pbs, tc.n) pb, ok := pbs[tc.key] // no negative testing for missing keys (see newProfileConfigs) require.Equalf(t, !tc.expectMissing, ok, "key %q for set %q expect missing %t", tc.key, mapKeys(pbs), tc.expectMissing) + if tc.expectMissing { return } + require.Equal(t, 1<<10, pb.buf.Cap()) // bufsize is always 1024 require.Equal(t, 0, pb.buf.Len()) require.Equal(t, tc.expect, pb.flags) @@ -284,19 +286,25 @@ func TestDebug_LoadProfileConfigs(t *testing.T) { t.Run(fmt.Sprintf("%d: %q", i, tc.inArgs), func(t *testing.T) { pmp, err := LoadProfileConfig(ctx, tc.inArgs) require.ErrorIs(t, tc.expectError, err) + if err != nil { return } + val, ok := pmp[tc.profileKey] require.Equalf(t, tc.expectProfileConfigNotExists, !ok, "expecting key %q to %t exist", tc.profileKey, !tc.expectProfileConfigNotExists) + if tc.expectProfileConfigNotExists { return } + flagValue, ok := val.GetValue(tc.profileFlagKey) require.Equal(t, tc.expectProfileFlagExists, ok, "expecting key %q to %t exist", tc.profileKey, tc.expectProfileFlagExists) + if tc.expectProfileFlagExists { return } + require.Equal(t, tc.expectProfileFlagValue, flagValue) }) } diff --git a/internal/scheduler/scheduler_test.go b/internal/scheduler/scheduler_test.go index 8f2f4b7bb85..3220cb8d5ef 100644 --- a/internal/scheduler/scheduler_test.go +++ b/internal/scheduler/scheduler_test.go @@ -125,6 +125,7 @@ func TestSchedulerRefresh(t *testing.T) { s := scheduler.Start(ctx, func(ctx context.Context, now time.Time) []scheduler.Item { t.Logf("now=%v", now) + switch cnt.Add(1) { case 1: return []scheduler.Item{{ diff --git a/internal/server/api_policies_test.go b/internal/server/api_policies_test.go index 13709d7eb13..3f5fb0232ee 100644 --- a/internal/server/api_policies_test.go +++ b/internal/server/api_policies_test.go @@ -172,6 +172,7 @@ func TestPolicies(t *testing.T) { for j, ust := range res.UpcomingSnapshotTimes { require.Equal(t, ust.Truncate(60*time.Second), ust) + if j > 0 { require.Equal(t, 60*time.Second, ust.Sub(res.UpcomingSnapshotTimes[j-1])) } diff --git a/internal/tempfile/tempfile_verify_test.go b/internal/tempfile/tempfile_verify_test.go index 5feeeac1878..d130d3e7a07 100644 --- a/internal/tempfile/tempfile_verify_test.go +++ b/internal/tempfile/tempfile_verify_test.go @@ -39,6 +39,7 @@ func VerifyTempfile(t *testing.T, create func() (*os.File, error)) { require.Error(t, err) require.ErrorAs(t, err, &perr) + if runtime.GOOS == "windows" { require.ErrorContains(t, err, "The system cannot find the file specified") } else { diff --git a/internal/uitask/uitask_test.go b/internal/uitask/uitask_test.go index 033ff2ddd13..edc4d959b09 100644 --- a/internal/uitask/uitask_test.go +++ b/internal/uitask/uitask_test.go @@ -103,6 +103,7 @@ func testUITaskInternal(t *testing.T, ctx context.Context, m *uitask.Manager) { "foo-notice": uitask.NoticeCounter(7), "bar-notice": uitask.NoticeBytesCounter(8), }) + tsk, _ = m.GetTask(tid1a) if diff := cmp.Diff(tsk.Counters, map[string]uitask.CounterValue{ "foo": {1, "", ""}, @@ -273,6 +274,7 @@ func TestUITaskCancel_AfterOnCancel(t *testing.T) { // send my task ID to the goroutine which will cancel our task ch <- tid + canceled := make(chan struct{}) ctrl.OnCancel(func() { @@ -312,8 +314,11 @@ func TestUITaskCancel_BeforeOnCancel(t *testing.T) { // send my task ID to the goroutine which will cancel our task tid = ctrl.CurrentTaskID() ch <- tid + time.Sleep(1 * time.Second) + canceled := make(chan struct{}) + ctrl.OnCancel(func() { verifyTaskList(t, m, map[string]uitask.Status{ tid: uitask.StatusCanceling, diff --git a/internal/user/password_hashings_test.go b/internal/user/password_hashings_test.go index 590903de306..0c57318c902 100644 --- a/internal/user/password_hashings_test.go +++ b/internal/user/password_hashings_test.go @@ -31,6 +31,7 @@ func TestNonZeroDummyHash(t *testing.T) { // password hashers (PB key derivers in the crypto package). func TestSaltLengthIsSupported(t *testing.T) { const badPwd = "password" + var salt [passwordHashSaltLength]byte for _, v := range []int{ScryptHashVersion, Pbkdf2HashVersion} { diff --git a/notification/sender/jsonsender/jsonsender_test.go b/notification/sender/jsonsender/jsonsender_test.go index 80ea05671d5..c5ec927c0a6 100644 --- a/notification/sender/jsonsender/jsonsender_test.go +++ b/notification/sender/jsonsender/jsonsender_test.go @@ -35,6 +35,7 @@ func TestJSONSender(t *testing.T) { Body: "test body 3", Severity: notification.SeverityError, } + require.NoError(t, p.Send(ctx, m1)) // will be ignored require.NoError(t, p.Send(ctx, m2)) require.NoError(t, p.Send(ctx, m3)) diff --git a/notification/sender/pushover/pushover_sender_test.go b/notification/sender/pushover/pushover_sender_test.go index a3c78308a29..2c1a3275ff9 100644 --- a/notification/sender/pushover/pushover_sender_test.go +++ b/notification/sender/pushover/pushover_sender_test.go @@ -22,10 +22,12 @@ func TestPushover(t *testing.T) { mux := http.NewServeMux() var requests []*http.Request + var requestBodies []bytes.Buffer mux.HandleFunc("/some-path", func(w http.ResponseWriter, r *http.Request) { var b bytes.Buffer + io.Copy(&b, r.Body) requestBodies = append(requestBodies, b) diff --git a/notification/sender/testsender/test_sender_test.go b/notification/sender/testsender/test_sender_test.go index 9d0fb5c9db6..13d3584f059 100644 --- a/notification/sender/testsender/test_sender_test.go +++ b/notification/sender/testsender/test_sender_test.go @@ -21,6 +21,7 @@ func TestProvider(t *testing.T) { require.NoError(t, err) require.Equal(t, "Test sender", p.Summary()) + m1 := &sender.Message{ Subject: "test subject 1", } @@ -30,6 +31,7 @@ func TestProvider(t *testing.T) { m3 := &sender.Message{ Subject: "test subject 3", } + p.Send(ctx, m1) p.Send(ctx, m2) p.Send(ctx, m3) @@ -47,6 +49,7 @@ func TestProvider_NotConfigured(t *testing.T) { require.NoError(t, err) require.Equal(t, "Test sender", p.Summary()) + m1 := &sender.Message{ Subject: "test subject 1", } diff --git a/notification/sender/webhook/webhook_sender_test.go b/notification/sender/webhook/webhook_sender_test.go index ae9a4dcfdf6..40d64b410bd 100644 --- a/notification/sender/webhook/webhook_sender_test.go +++ b/notification/sender/webhook/webhook_sender_test.go @@ -21,10 +21,12 @@ func TestWebhook(t *testing.T) { mux := http.NewServeMux() var requests []*http.Request + var requestBodies []bytes.Buffer mux.HandleFunc("/some-path", func(w http.ResponseWriter, r *http.Request) { var b bytes.Buffer + io.Copy(&b, r.Body) requestBodies = append(requestBodies, b) diff --git a/repo/blob/gcs/gcs_versioned_test.go b/repo/blob/gcs/gcs_versioned_test.go index 70e097198a9..f303492849a 100644 --- a/repo/blob/gcs/gcs_versioned_test.go +++ b/repo/blob/gcs/gcs_versioned_test.go @@ -268,6 +268,7 @@ func putBlobs(ctx context.Context, cli blob.Storage, blobID blob.ID, blobs []str func createBucket(t *testing.T, opts bucketOpts) { t.Helper() + ctx := context.Background() cli, err := gcsclient.NewClient(ctx, option.WithCredentialsJSON(opts.credentialsJSON)) @@ -276,6 +277,7 @@ func createBucket(t *testing.T, opts bucketOpts) { attrs := &gcsclient.BucketAttrs{} bucketHandle := cli.Bucket(opts.bucket) + if opts.isLockedBucket { attrs.VersioningEnabled = true bucketHandle = bucketHandle.SetObjectRetention(true) @@ -299,6 +301,7 @@ func createBucket(t *testing.T, opts bucketOpts) { func validateBucket(t *testing.T, opts bucketOpts) { t.Helper() + ctx := context.Background() cli, err := gcsclient.NewClient(ctx, option.WithCredentialsJSON(opts.credentialsJSON)) diff --git a/repo/blob/s3/s3_versioned_test.go b/repo/blob/s3/s3_versioned_test.go index b337f63042e..96f8a3720f2 100644 --- a/repo/blob/s3/s3_versioned_test.go +++ b/repo/blob/s3/s3_versioned_test.go @@ -59,6 +59,7 @@ func TestGetBlobVersions(t *testing.T) { dm, err := deleteBlob(ctx, s, blobName) require.NoError(t, err) + bm = append(bm, dm) var b gather.WriteBuffer @@ -250,6 +251,7 @@ func TestGetBlobWithVersion(t *testing.T) { } var i int + for _, b := range blobs { for _, bv := range b { m := metas[i] @@ -265,6 +267,7 @@ func TestGetBlobWithVersion(t *testing.T) { require.NoError(t, err) require.Equal(t, c, b.ToByteSlice()) + i++ } } diff --git a/repo/blob/sftp/sftp_storage_test.go b/repo/blob/sftp/sftp_storage_test.go index 46862d0b415..77f07a7809f 100644 --- a/repo/blob/sftp/sftp_storage_test.go +++ b/repo/blob/sftp/sftp_storage_test.go @@ -178,6 +178,7 @@ func TestSFTPStorageValid(t *testing.T) { // use context that gets canceled after opening storage to ensure it's not used beyond New(). newctx, cancel := context.WithCancel(ctx) + st, err := createSFTPStorage(newctx, t, sftp.Options{ Path: "/upload", Host: host, diff --git a/repo/blob/storage_test.go b/repo/blob/storage_test.go index 39beaf7bd71..a91b1bdaf1c 100644 --- a/repo/blob/storage_test.go +++ b/repo/blob/storage_test.go @@ -54,6 +54,7 @@ func TestIterateAllPrefixesInParallel(t *testing.T) { }, func(m blob.Metadata) error { mu.Lock() defer mu.Unlock() + got = append(got, m.BlobID) return nil @@ -68,6 +69,7 @@ func TestIterateAllPrefixesInParallel(t *testing.T) { }, func(m blob.Metadata) error { mu.Lock() defer mu.Unlock() + got = append(got, m.BlobID) return nil @@ -83,6 +85,7 @@ func TestIterateAllPrefixesInParallel(t *testing.T) { }, func(m blob.Metadata) error { mu.Lock() defer mu.Unlock() + got = append(got, m.BlobID) return nil diff --git a/repo/blob/webdav/webdav_storage_test.go b/repo/blob/webdav/webdav_storage_test.go index 4c4fd690959..e9ec4e81600 100644 --- a/repo/blob/webdav/webdav_storage_test.go +++ b/repo/blob/webdav/webdav_storage_test.go @@ -88,6 +88,7 @@ func TestWebDAVStorageBuiltInServer(t *testing.T) { if err := os.RemoveAll(tmpDir); err != nil { t.Errorf("can't remove all: %q", tmpDir) } + os.MkdirAll(tmpDir, 0o700) verifyWebDAVStorage(t, server.URL, "user", "password", shardSpec) @@ -138,6 +139,7 @@ func transformMissingPUTs(next http.Handler) http.HandlerFunc { for header, values := range rec.Header() { w.Header()[header] = values } + w.WriteHeader(result.StatusCode) io.Copy(w, result.Body) } diff --git a/repo/content/content_index_recovery_test.go b/repo/content/content_index_recovery_test.go index 18b95224e8c..9fe56543b1e 100644 --- a/repo/content/content_index_recovery_test.go +++ b/repo/content/content_index_recovery_test.go @@ -58,8 +58,10 @@ func (s *contentManagerSuite) TestContentIndexRecovery(t *testing.T) { if err != nil { return err } + totalRecovered += len(infos) t.Logf("recovered %v contents", len(infos)) + return nil }) if err != nil { @@ -85,8 +87,10 @@ func (s *contentManagerSuite) TestContentIndexRecovery(t *testing.T) { if rerr != nil { return rerr } + totalRecovered += len(infos) t.Logf("recovered %v contents", len(infos)) + return nil }) if err != nil { diff --git a/repo/content/content_manager_test.go b/repo/content/content_manager_test.go index 3f4f785c732..ee703db784e 100644 --- a/repo/content/content_manager_test.go +++ b/repo/content/content_manager_test.go @@ -1297,16 +1297,20 @@ func (s *contentManagerSuite) TestHandleWriteErrors(t *testing.T) { defer bm.CloseShared(ctx) var writeRetries []int + var cids []ID + for i, size := range tc.contentSizes { t.Logf(">>>> writing %v", i) cid, retries := writeContentWithRetriesAndVerify(ctx, t, bm, seededRandomData(i, size)) writeRetries = append(writeRetries, retries) cids = append(cids, cid) } + if got, want := flushWithRetries(ctx, t, bm), tc.expectedFlushRetries; got != want { t.Fatalf("invalid # of flush retries %v, wanted %v", got, want) } + if diff := cmp.Diff(writeRetries, tc.expectedWriteRetries); diff != "" { t.Fatalf("invalid # of write retries (-got,+want): %v", diff) } @@ -1345,6 +1349,7 @@ func (s *contentManagerSuite) TestRewriteNonDeleted(t *testing.T) { case 0: t.Logf("flushing and reopening") bm.Flush(ctx) + bm = s.newTestContentManagerWithCustomTime(t, st, fakeNow) defer bm.CloseShared(ctx) case 1: @@ -1356,6 +1361,7 @@ func (s *contentManagerSuite) TestRewriteNonDeleted(t *testing.T) { } content1 := writeContentAndVerify(ctx, t, bm, seededRandomData(10, 100)) + applyStep(action1) require.NoError(t, bm.RewriteContent(ctx, content1)) applyStep(action2) @@ -1378,6 +1384,7 @@ func (s *contentManagerSuite) TestDisableFlush(t *testing.T) { for i := range 500 { writeContentAndVerify(ctx, t, bm, seededRandomData(i, 100)) } + bm.Flush(ctx) // flush will not have effect bm.EnableIndexFlush(ctx) bm.Flush(ctx) // flush will not have effect @@ -1404,6 +1411,7 @@ func (s *contentManagerSuite) TestRewriteDeleted(t *testing.T) { keyTime := map[blob.ID]time.Time{} fakeNow := faketime.AutoAdvance(fakeTime, 1*time.Second) st := blobtesting.NewMapStorage(data, keyTime, fakeNow) + bm := s.newTestContentManagerWithCustomTime(t, st, fakeNow) defer bm.CloseShared(ctx) @@ -1412,6 +1420,7 @@ func (s *contentManagerSuite) TestRewriteDeleted(t *testing.T) { case 0: t.Logf("flushing and reopening") bm.Flush(ctx) + bm = s.newTestContentManagerWithCustomTime(t, st, fakeNow) defer bm.CloseShared(ctx) case 1: @@ -1424,6 +1433,7 @@ func (s *contentManagerSuite) TestRewriteDeleted(t *testing.T) { c1Bytes := seededRandomData(10, 100) content1 := writeContentAndVerify(ctx, t, bm, c1Bytes) + applyStep(action1) require.NoError(t, bm.DeleteContent(ctx, content1)) applyStep(action2) @@ -1431,12 +1441,15 @@ func (s *contentManagerSuite) TestRewriteDeleted(t *testing.T) { if got, want := bm.RewriteContent(ctx, content1), ErrContentNotFound; !errors.Is(got, want) && got != nil { t.Errorf("unexpected error %v, wanted %v", got, want) } + applyStep(action3) + if action1 == 2 { // no flush verifyContentNotFound(ctx, t, bm, content1) } else { verifyDeletedContentRead(ctx, t, bm, content1, c1Bytes) } + dumpContentManagerData(t, data) }) } @@ -1503,6 +1516,7 @@ func (s *contentManagerSuite) TestDeleteAndRecreate(t *testing.T) { defer bm3.CloseShared(ctx) dumpContentManagerData(t, data) + if tc.isVisible { verifyContent(ctx, t, bm3, content1, seededRandomData(10, 100)) } else { @@ -1624,6 +1638,7 @@ func (s *contentManagerSuite) TestIterateContents(t *testing.T) { for _, tc := range cases { t.Run(tc.desc, func(t *testing.T) { var mu sync.Mutex + got := map[ID]bool{} err := bm.IterateContents(ctx, tc.options, func(ci Info) error { @@ -1638,6 +1653,7 @@ func (s *contentManagerSuite) TestIterateContents(t *testing.T) { mu.Lock() got[ci.ContentID] = true mu.Unlock() + return nil }) @@ -1929,6 +1945,7 @@ func (s *contentManagerSuite) verifyVersionCompat(t *testing.T, writeVersion for dataSet[cid] = data } + verifyContentManagerDataSet(ctx, t, mgr, dataSet) // delete random 3 items (map iteration order is random) @@ -1938,6 +1955,7 @@ func (s *contentManagerSuite) verifyVersionCompat(t *testing.T, writeVersion for t.Logf("deleting %v", blobID) require.NoError(t, mgr.DeleteContent(ctx, blobID)) delete(dataSet, blobID) + cnt++ if cnt >= 3 { diff --git a/repo/content/index/merged_test.go b/repo/content/index/merged_test.go index e22d419ce97..609980cf807 100644 --- a/repo/content/index/merged_test.go +++ b/repo/content/index/merged_test.go @@ -54,6 +54,7 @@ func TestMerged(t *testing.T) { t.Errorf("iteration preferred deleted content over non-deleted") } } + return nil })) diff --git a/repo/content/index/packindex_test.go b/repo/content/index/packindex_test.go index 210563c8eaf..dd29b058563 100644 --- a/repo/content/index/packindex_test.go +++ b/repo/content/index/packindex_test.go @@ -226,7 +226,9 @@ func verifyPackedIndexes(t *testing.T, infos []Info, infoMap map[ID]Info, versio } require.Equal(t, want, info2) + cnt++ + return nil })) @@ -253,11 +255,14 @@ func verifyPackedIndexes(t *testing.T, infos []Info, infoMap map[ID]Info, versio for _, prefix := range prefixes { cnt2 := 0 + require.NoError(t, ndx.Iterate(PrefixRange(prefix), func(info2 Info) error { cnt2++ + if !strings.HasPrefix(info2.ContentID.String(), string(prefix)) { t.Errorf("unexpected item %v when iterating prefix %v", info2.ContentID, prefix) } + return nil })) t.Logf("found %v elements with prefix %q", cnt2, prefix) @@ -419,6 +424,7 @@ func fuzzTestIndexOpen(originalData []byte) { if err != nil { return } + cnt := 0 _ = ndx.Iterate(AllIDs, func(cb Info) error { if cnt < 10 { @@ -426,7 +432,9 @@ func fuzzTestIndexOpen(originalData []byte) { _, _ = ndx.GetInfo(cb.ContentID, &tmp) } + cnt++ + return nil }) }) diff --git a/repo/content/indexblob/index_blob_manager_v0_test.go b/repo/content/indexblob/index_blob_manager_v0_test.go index cba55d17a3f..d7629650923 100644 --- a/repo/content/indexblob/index_blob_manager_v0_test.go +++ b/repo/content/indexblob/index_blob_manager_v0_test.go @@ -569,6 +569,7 @@ func undeleteFakeContents(ctx context.Context, t *testing.T, m *ManagerV0, delet } delete(deleted, n) + count-- } diff --git a/repo/format/upgrade_lock_test.go b/repo/format/upgrade_lock_test.go index fb354b7d8b4..384f5ebccef 100644 --- a/repo/format/upgrade_lock_test.go +++ b/repo/format/upgrade_lock_test.go @@ -178,6 +178,7 @@ func TestFormatUpgradeMultipleLocksRollback(t *testing.T) { // the first owner's lock { var backups []string + require.NoError(t, env.RootStorage().ListBlobs(ctx, format.BackupBlobIDPrefix, func(bm blob.Metadata) error { backups = append(backups, string(bm.BlobID)) return nil @@ -242,6 +243,7 @@ func TestFormatUpgradeFailureToBackupFormatBlobOnLock(t *testing.T) { if !allowGets && id == format.BackupBlobID(allowedLock) { return errors.New("unexpected error on get") } + return nil }, nil, func(ctx context.Context) error { @@ -256,6 +258,7 @@ func TestFormatUpgradeFailureToBackupFormatBlobOnLock(t *testing.T) { if !allowPuts || (strings.HasPrefix(string(id), format.BackupBlobIDPrefix) && id != format.BackupBlobID(allowedLock)) { return errors.New("unexpected error") } + return nil }, )) diff --git a/repo/maintenance/content_rewrite_test.go b/repo/maintenance/content_rewrite_test.go index e7e02b8ceee..72611821610 100644 --- a/repo/maintenance/content_rewrite_test.go +++ b/repo/maintenance/content_rewrite_test.go @@ -82,6 +82,7 @@ func (s *formatSpecificTestSuite) TestContentRewrite(t *testing.T) { ow := w.NewObjectWriter(ctx, object.WriterOptions{MetadataCompressor: "zstd-fastest"}) fmt.Fprintf(ow, "%v", uuid.NewString()) _, err := ow.Result() + return err })) } @@ -91,6 +92,7 @@ func (s *formatSpecificTestSuite) TestContentRewrite(t *testing.T) { ow := w.NewObjectWriter(ctx, object.WriterOptions{Prefix: "k", MetadataCompressor: "zstd-fastest"}) fmt.Fprintf(ow, "%v", uuid.NewString()) _, err := ow.Result() + return err })) } diff --git a/repo/maintenance/maintenance_quick_test.go b/repo/maintenance/maintenance_quick_test.go index 428c0356af7..82f666c0ce8 100644 --- a/repo/maintenance/maintenance_quick_test.go +++ b/repo/maintenance/maintenance_quick_test.go @@ -79,6 +79,7 @@ func TestQuickMaintenanceAdvancesEpoch(t *testing.T) { // advance time and write more index to force epoch advancement on maintenance ft.Advance(epochDuration + time.Second) + ow := env.RepositoryWriter.NewObjectWriter(ctx, object.WriterOptions{}) require.NotNil(t, ow) diff --git a/repo/maintenance/maintenance_safety_test.go b/repo/maintenance/maintenance_safety_test.go index ccd34c96e94..05256c7f22d 100644 --- a/repo/maintenance/maintenance_safety_test.go +++ b/repo/maintenance/maintenance_safety_test.go @@ -36,8 +36,10 @@ func (s *formatSpecificTestSuite) TestMaintenanceSafety(t *testing.T) { require.NoError(t, repo.WriteSession(ctx, env.Repository, repo.WriteSessionOptions{}, func(ctx context.Context, w repo.RepositoryWriter) error { ow := w.NewObjectWriter(ctx, object.WriterOptions{Prefix: "y", MetadataCompressor: "zstd-fastest"}) fmt.Fprintf(ow, "hello world") + var err error objectID, err = ow.Result() + return err })) @@ -46,6 +48,7 @@ func (s *formatSpecificTestSuite) TestMaintenanceSafety(t *testing.T) { ow := w.NewObjectWriter(ctx, object.WriterOptions{Prefix: "y", MetadataCompressor: "zstd-fastest"}) fmt.Fprintf(ow, "hello universe") _, err := ow.Result() + return err })) @@ -115,6 +118,7 @@ func verifyObjectReadable(ctx context.Context, t *testing.T, rep repo.Repository r, err := w.OpenObject(ctx, objectID) require.NoError(t, err) r.Close() + return nil })) } @@ -125,6 +129,7 @@ func verifyObjectNotFound(ctx context.Context, t *testing.T, rep repo.Repository require.NoError(t, repo.WriteSession(ctx, rep, repo.WriteSessionOptions{}, func(ctx context.Context, w repo.RepositoryWriter) error { _, err := w.OpenObject(ctx, objectID) require.ErrorIs(t, err, object.ErrObjectNotFound) + return nil })) } diff --git a/repo/object/object_manager_test.go b/repo/object/object_manager_test.go index 0efc4e19d0c..bad35e5e900 100644 --- a/repo/object/object_manager_test.go +++ b/repo/object/object_manager_test.go @@ -444,10 +444,12 @@ func verifyIndirectBlock(ctx context.Context, t *testing.T, om *Manager, oid ID, if !c.HasPrefix() { t.Errorf("expected base content ID to be prefixed, was %v", c) } + info, err := om.contentMgr.ContentInfo(ctx, c) if err != nil { t.Errorf("error getting content info for %v", err.Error()) } + require.Equal(t, expectedComp, info.CompressionHeaderID) } @@ -530,6 +532,7 @@ func TestIndirection(t *testing.T) { if len(c.metadataCompressor) > 0 && c.metadataCompressor != "none" { expectedCompressor = compression.ByName[c.metadataCompressor].HeaderID() } + verifyIndirectBlock(ctx, t, om, result, expectedCompressor) } } diff --git a/repo/repository_test.go b/repo/repository_test.go index 5c410c332ca..c781f0387a4 100644 --- a/repo/repository_test.go +++ b/repo/repository_test.go @@ -452,6 +452,7 @@ func TestInitializeWithBlobCfgRetentionBlob(t *testing.T) { if id == format.KopiaRepositoryBlobID { return blob.ErrBlobNotFound } + return nil }, nil, nil, nil, ), @@ -473,9 +474,11 @@ func TestInitializeWithBlobCfgRetentionBlob(t *testing.T) { if id == format.KopiaBlobCfgBlobID { return nil } + if id == format.KopiaRepositoryBlobID { return blob.ErrBlobNotFound } + return nil }, nil, nil, nil, ), @@ -496,6 +499,7 @@ func TestInitializeWithBlobCfgRetentionBlob(t *testing.T) { if id == format.KopiaBlobCfgBlobID || id == format.KopiaRepositoryBlobID { return blob.ErrBlobNotFound } + return nil }, nil, nil, @@ -504,6 +508,7 @@ func TestInitializeWithBlobCfgRetentionBlob(t *testing.T) { if id == format.KopiaBlobCfgBlobID { return errors.New("unexpected error") } + return nil }, ), @@ -527,6 +532,7 @@ func TestInitializeWithBlobCfgRetentionBlob(t *testing.T) { if id == format.KopiaRepositoryBlobID { return errors.New("unexpected error") } + return nil }, nil, nil, nil, @@ -582,11 +588,14 @@ func TestObjectWritesWithRetention(t *testing.T) { if strings.HasPrefix(string(it.BlobID), prefix) { _, err = versionedMap.TouchBlob(ctx, it.BlobID, 0) require.Error(t, err, "expected error while touching blob %s", it.BlobID) + return nil } } + _, err = versionedMap.TouchBlob(ctx, it.BlobID, 0) require.NoError(t, err, "unexpected error while touching blob %s", it.BlobID) + return nil })) } diff --git a/snapshot/policy/policy_manager_test.go b/snapshot/policy/policy_manager_test.go index 5eaa0dc7140..ada82e93dc7 100644 --- a/snapshot/policy/policy_manager_test.go +++ b/snapshot/policy/policy_manager_test.go @@ -136,6 +136,7 @@ func TestPolicyManagerInheritanceTest(t *testing.T) { if err != nil { t.Fatalf("err: %v", err) } + if diff := cmp.Diff(pol, tc.wantEffective); diff != "" { t.Errorf("got: %v", pol) t.Errorf("want: %v", tc.wantEffective) diff --git a/snapshot/policy/retention_policy_test.go b/snapshot/policy/retention_policy_test.go index 6a168e04ceb..a37ff611e77 100644 --- a/snapshot/policy/retention_policy_test.go +++ b/snapshot/policy/retention_policy_test.go @@ -163,6 +163,7 @@ func TestRetentionPolicyTest(t *testing.T) { for _, tc := range cases { t.Run(fmt.Sprintf("%v", tc), func(t *testing.T) { var manifests []*snapshot.Manifest + var manifests2 []*snapshot.Manifest for ts, want := range tc.timeToExpectedTags { @@ -170,6 +171,7 @@ func TestRetentionPolicyTest(t *testing.T) { if strings.HasPrefix(ts, "incomplete-") { incompleteReason = "some-reason" } + startTime, err := time.Parse(time.RFC3339, strings.TrimPrefix(ts, "incomplete-")) if err != nil { t.Fatal(err) diff --git a/snapshot/snapshotfs/snapshot_verifier_test.go b/snapshot/snapshotfs/snapshot_verifier_test.go index 5febd437128..afbfccc8098 100644 --- a/snapshot/snapshotfs/snapshot_verifier_test.go +++ b/snapshot/snapshotfs/snapshot_verifier_test.go @@ -34,7 +34,9 @@ func TestSnapshotVerifier(t *testing.T) { require.NoError(t, repo.WriteSession(ctx, te.Repository, repo.WriteSessionOptions{}, func(ctx context.Context, w repo.RepositoryWriter) error { snap1, err := u.Upload(ctx, dir1, nil, si1) require.NoError(t, err) + obj1 = snap1.RootObjectID() + return nil })) diff --git a/snapshot/snapshotmaintenance/snapshotmaintenance_test.go b/snapshot/snapshotmaintenance/snapshotmaintenance_test.go index 68eee9f39fa..2e37fa58a00 100644 --- a/snapshot/snapshotmaintenance/snapshotmaintenance_test.go +++ b/snapshot/snapshotmaintenance/snapshotmaintenance_test.go @@ -278,6 +278,7 @@ func (s *formatSpecificTestSuite) TestMaintenanceAutoLiveness(t *testing.T) { dp := maintenance.DefaultParams() dp.Owner = env.Repository.ClientOptions().UsernameAtHost() + return maintenance.SetParams(ctx, w, &dp) })) diff --git a/snapshot/upload/upload_estimator_test.go b/snapshot/upload/upload_estimator_test.go index 8125a32b298..5eb31decc3c 100644 --- a/snapshot/upload/upload_estimator_test.go +++ b/snapshot/upload/upload_estimator_test.go @@ -31,6 +31,7 @@ func (w *mockLogger) Sync() error { func getMockLogger() logging.Logger { ml := &mockLogger{} + return zap.New( zapcore.NewCore( zapcore.NewConsoleEncoder(zapcore.EncoderConfig{ @@ -81,6 +82,7 @@ func expectSuccessfulEstimation( expectedDataSize int64, ) { t.Helper() + var filesCount, totalFileSize int64 done := make(chan struct{}) diff --git a/snapshot/upload/upload_test.go b/snapshot/upload/upload_test.go index 849deff20ce..4945daccd25 100644 --- a/snapshot/upload/upload_test.go +++ b/snapshot/upload/upload_test.go @@ -239,10 +239,13 @@ type entry struct { // findAllEntries recursively iterates over all the dirs and returns list of file entries. func findAllEntries(t *testing.T, ctx context.Context, dir fs.Directory) []entry { t.Helper() + entries := []entry{} + fs.IterateEntries(ctx, dir, func(ctx context.Context, e fs.Entry) error { oid, err := object.ParseID(e.(object.HasObjectID).ObjectID().String()) require.NoError(t, err) + entries = append(entries, entry{ name: e.Name(), objectID: oid, @@ -250,6 +253,7 @@ func findAllEntries(t *testing.T, ctx context.Context, dir fs.Directory) []entry if e.IsDir() { entries = append(entries, findAllEntries(t, ctx, e.(fs.Directory))...) } + return nil }) @@ -258,16 +262,20 @@ func findAllEntries(t *testing.T, ctx context.Context, dir fs.Directory) []entry func verifyMetadataCompressor(t *testing.T, ctx context.Context, rep repo.Repository, entries []entry, comp compression.HeaderID) { t.Helper() + for _, e := range entries { cid, _, ok := e.objectID.ContentID() require.True(t, ok) + if !cid.HasPrefix() { continue } + info, err := rep.ContentInfo(ctx, cid) if err != nil { t.Errorf("failed to get content info: %v", err) } + require.Equal(t, comp, info.CompressionHeaderID) } } @@ -845,6 +853,7 @@ func TestParallelUploadUploadsBlobsInParallel(t *testing.T) { th.faulty.AddFault(blobtesting.MethodPutBlob).Repeat(10).Before(func() { v := currentParallelCalls.Add(1) maxParallelism := maxParallelCalls.Load() + if v > maxParallelism { maxParallelCalls.CompareAndSwap(maxParallelism, v) } @@ -1298,6 +1307,7 @@ func TestParallelUploadOfLargeFiles(t *testing.T) { // and were concatenated for offset := int64(0); offset < f.Size(); offset += chunkSize { verifyContainsOffset(t, entries, chunkSize) + successCount++ } @@ -1660,6 +1670,7 @@ func TestUploadLogging(t *testing.T) { pol := *policy.DefaultPolicy pol.OSSnapshotPolicy.VolumeShadowCopy.Enable = policy.NewOSSnapshotMode(policy.OSSnapshotNever) + if p := tc.globalLoggingPolicy; p != nil { pol.LoggingPolicy = *p } diff --git a/tests/end_to_end_test/auto_update_test.go b/tests/end_to_end_test/auto_update_test.go index 7b4c1375eea..481eb16555e 100644 --- a/tests/end_to_end_test/auto_update_test.go +++ b/tests/end_to_end_test/auto_update_test.go @@ -53,12 +53,14 @@ func TestAutoUpdateEnableTest(t *testing.T) { e.RunAndExpectSuccess(t, args...) updateInfoFile := filepath.Join(e.ConfigDir, ".kopia.config.update-info.json") + _, err := os.Stat(updateInfoFile) if got, want := err == nil, tc.wantEnabled; got != want { t.Errorf("update check enabled: %v, wanted %v", got, want) } e.RunAndExpectSuccess(t, "repo", "disconnect") + if _, err = os.Stat(updateInfoFile); !os.IsNotExist(err) { t.Errorf("update info file was not removed.") } @@ -73,6 +75,7 @@ func TestAutoUpdateEnableTest(t *testing.T) { if got, want := err == nil, tc.wantEnabled; got != want { t.Fatalf("update check enabled: %v, wanted %v", got, want) } + if err == nil { defer f.Close() diff --git a/tests/end_to_end_test/compression_test.go b/tests/end_to_end_test/compression_test.go index 570b66da32f..99d32082104 100644 --- a/tests/end_to_end_test/compression_test.go +++ b/tests/end_to_end_test/compression_test.go @@ -74,7 +74,9 @@ func (s *formatSpecificTestSuite) TestCompression(t *testing.T) { for _, l := range lines { if strings.HasPrefix(l, entries[0].ObjectID) { require.Contains(t, l, "pgzip") + found = true + break } } diff --git a/tests/end_to_end_test/ecc_test.go b/tests/end_to_end_test/ecc_test.go index 5808c696d95..8f095ca2ff7 100644 --- a/tests/end_to_end_test/ecc_test.go +++ b/tests/end_to_end_test/ecc_test.go @@ -100,9 +100,11 @@ func (s *formatSpecificTestSuite) flipOneByteFromEachFile(e *testenv.CLITest) er if err != nil { return err } + if info.IsDir() { return nil } + if info.Name() == "kopia.repository.f" || info.Name() == ".shards" { return nil } @@ -135,9 +137,11 @@ func dirSize(path string) (int64, error) { if err != nil { return err } + if !info.IsDir() { size += info.Size() } + return nil }) diff --git a/tests/end_to_end_test/repository_connect_test.go b/tests/end_to_end_test/repository_connect_test.go index ff218c070c1..fd54fff933f 100644 --- a/tests/end_to_end_test/repository_connect_test.go +++ b/tests/end_to_end_test/repository_connect_test.go @@ -109,6 +109,7 @@ func TestReconnectUsingToken(t *testing.T) { func TestRepoConnectKeyDerivationAlgorithm(t *testing.T) { t.Parallel() + for _, algorithm := range format.SupportedFormatBlobKeyDerivationAlgorithms() { runner := testenv.NewInProcRunner(t) e := testenv.NewCLITest(t, testenv.RepoFormatNotImportant, runner) @@ -121,7 +122,9 @@ func TestRepoConnectKeyDerivationAlgorithm(t *testing.T) { kopiaRepoPath := filepath.Join(e.RepoDir, "kopia.repository.f") dat, err := os.ReadFile(kopiaRepoPath) require.NoError(t, err) + var repoJSON format.KopiaRepositoryJSON + json.Unmarshal(dat, &repoJSON) require.Equal(t, repoJSON.KeyDerivationAlgorithm, algorithm) } @@ -138,7 +141,9 @@ func TestRepoConnectBadKeyDerivationAlgorithm(t *testing.T) { kopiaRepoPath := filepath.Join(e.RepoDir, "kopia.repository.f") dat, err := os.ReadFile(kopiaRepoPath) require.NoError(t, err) + var repoJSON format.KopiaRepositoryJSON + json.Unmarshal(dat, &repoJSON) repoJSON.KeyDerivationAlgorithm = "badalgorithm" diff --git a/tests/end_to_end_test/restore_test.go b/tests/end_to_end_test/restore_test.go index a106e797671..c4828b37c44 100644 --- a/tests/end_to_end_test/restore_test.go +++ b/tests/end_to_end_test/restore_test.go @@ -344,6 +344,7 @@ func TestSnapshotRestore(t *testing.T) { for _, tc := range cases { t.Run(tc.fname, func(t *testing.T) { t.Parallel() + fname := filepath.Join(restoreArchiveDir, tc.fname) e.RunAndExpectSuccess(t, append([]string{"snapshot", "restore", snapID, fname}, tc.args...)...) tc.validator(t, fname) diff --git a/tests/end_to_end_test/shallowrestore_test.go b/tests/end_to_end_test/shallowrestore_test.go index 4fbca7f97ae..c663b3ddbc3 100644 --- a/tests/end_to_end_test/shallowrestore_test.go +++ b/tests/end_to_end_test/shallowrestore_test.go @@ -627,6 +627,7 @@ func findRealFileDir(t *testing.T, original string) (dir, file string) { case file != "" && dir != "": return filepath.SkipDir } + return nil }) require.NoError(t, err) diff --git a/tests/end_to_end_test/snapshot_actions_test.go b/tests/end_to_end_test/snapshot_actions_test.go index cfc0d565edc..1cfc7d8fda9 100644 --- a/tests/end_to_end_test/snapshot_actions_test.go +++ b/tests/end_to_end_test/snapshot_actions_test.go @@ -339,6 +339,7 @@ func TestSnapshotActionsEnable(t *testing.T) { e.RunAndExpectSuccess(t, append([]string{"snapshot", "create", sharedTestDataDir1}, tc.snapshotFlags...)...) _, err := os.Stat(envFile) + didRun := err == nil if didRun != tc.wantRun { t.Errorf("unexpected behavior. did run: %v want run: %v", didRun, tc.wantRun) diff --git a/tests/end_to_end_test/snapshot_create_test.go b/tests/end_to_end_test/snapshot_create_test.go index 15057991c03..400ab9b9358 100644 --- a/tests/end_to_end_test/snapshot_create_test.go +++ b/tests/end_to_end_test/snapshot_create_test.go @@ -530,6 +530,7 @@ func TestSnapshotCreateWithIgnore(t *testing.T) { var expected []string for _, ex := range tc.expected { expected = appendIfMissing(expected, ex) + if !strings.HasSuffix(ex, "/") { for d, _ := path.Split(ex); d != ""; d, _ = path.Split(d) { expected = appendIfMissing(expected, d) @@ -540,6 +541,7 @@ func TestSnapshotCreateWithIgnore(t *testing.T) { sort.Strings(output) sort.Strings(expected) + if diff := pretty.Compare(output, expected); diff != "" { t.Errorf("unexpected directory tree, diff(-got,+want): %v\n", diff) } diff --git a/tests/endurance_test/endurance_test.go b/tests/endurance_test/endurance_test.go index 735cf38b6ae..599fe123883 100644 --- a/tests/endurance_test/endurance_test.go +++ b/tests/endurance_test/endurance_test.go @@ -95,6 +95,7 @@ func TestEndurance(t *testing.T) { for i := range enduranceRunnerCount { t.Run(fmt.Sprintf("Runner-%v", i), func(t *testing.T) { t.Parallel() + defer func() { if t.Failed() { failureCount.Add(1) diff --git a/tests/htmlui_e2e_test/context_test.go b/tests/htmlui_e2e_test/context_test.go index 884d95d7bc5..350324f6071 100644 --- a/tests/htmlui_e2e_test/context_test.go +++ b/tests/htmlui_e2e_test/context_test.go @@ -27,6 +27,7 @@ func (tc *TestContext) expectDialogText(txt string, respond bool) chromedp.Actio return chromedp.ActionFunc(func(c context.Context) error { tc.expectedDialogText = txt tc.dialogResponse = respond + return nil }) } diff --git a/tests/htmlui_e2e_test/htmlui_e2e_test.go b/tests/htmlui_e2e_test/htmlui_e2e_test.go index 7e8854de23a..62c2e017c7d 100644 --- a/tests/htmlui_e2e_test/htmlui_e2e_test.go +++ b/tests/htmlui_e2e_test/htmlui_e2e_test.go @@ -335,6 +335,7 @@ func TestByteRepresentation(t *testing.T) { snap1Path := testutil.TempDirectory(t) var base2 string + var base10 string // create a test snaphot diff --git a/tests/repository_stress_test/repository_stress_test.go b/tests/repository_stress_test/repository_stress_test.go index 52171ff4430..dbe01b9ca5f 100644 --- a/tests/repository_stress_test/repository_stress_test.go +++ b/tests/repository_stress_test/repository_stress_test.go @@ -422,6 +422,7 @@ func listAndReadAllContents(ctx context.Context, r repo.DirectRepositoryWriter, content.IterateOptions{}, func(ci content.Info) error { cid := ci.ContentID + _, err := r.ContentReader().GetContent(ctx, cid) if err != nil { return errors.Wrapf(err, "error reading content %v", cid) diff --git a/tests/robustness/checker/checker.go b/tests/robustness/checker/checker.go index b04c8409eb0..08bc2ccbb45 100644 --- a/tests/robustness/checker/checker.go +++ b/tests/robustness/checker/checker.go @@ -179,6 +179,7 @@ func (chk *Checker) VerifySnapshotMetadata(ctx context.Context) error { if chk.RecoveryMode { if liveSnapsDeleted >= chk.DeleteLimit { log.Printf("delete limit (%v) reached", chk.DeleteLimit) + errCount++ } @@ -188,6 +189,7 @@ func (chk *Checker) VerifySnapshotMetadata(ctx context.Context) error { err = chk.snapshotIssuer.DeleteSnapshot(ctx, liveSnapID, map[string]string{}) if err != nil { log.Printf("error deleting snapshot: %s", err) + errCount++ } diff --git a/tests/robustness/engine/engine_test.go b/tests/robustness/engine/engine_test.go index f6c39a39cce..05a8814c524 100644 --- a/tests/robustness/engine/engine_test.go +++ b/tests/robustness/engine/engine_test.go @@ -160,6 +160,7 @@ func makeTempS3Bucket(t *testing.T) (bucketName string, cleanupCB func()) { break } } + require.NoError(t, err) } } diff --git a/tests/robustness/multiclient_test/framework/harness.go b/tests/robustness/multiclient_test/framework/harness.go index bf66ed0c431..0c7d7662e1f 100644 --- a/tests/robustness/multiclient_test/framework/harness.go +++ b/tests/robustness/multiclient_test/framework/harness.go @@ -59,6 +59,7 @@ func (th *TestHarness) init(ctx context.Context) { log.Printf("Skipping robustness tests because repo-path-prefix is not set") os.Exit(0) } + dataRepoPath := path.Join(*RepoPathPrefix, dataSubPath) metaRepoPath := path.Join(*RepoPathPrefix, metadataSubPath) @@ -314,6 +315,7 @@ func (th *TestHarness) GetDirsToLog(ctx context.Context) []string { if err == nil { dirList = append(dirList, cacheDir) // cache dir for repo under test } + allCacheDirs := getAllCacheDirs(cacheDir) dirList = append(dirList, allCacheDirs...) @@ -324,6 +326,7 @@ func getAllCacheDirs(dir string) []string { if dir == "" { return nil } + var dirs []string // Collect all cache dirs // There are six types of caches, and corresponding dirs. diff --git a/tests/robustness/multiclient_test/main_test.go b/tests/robustness/multiclient_test/main_test.go index 991a753ca6e..a0b59e76228 100644 --- a/tests/robustness/multiclient_test/main_test.go +++ b/tests/robustness/multiclient_test/main_test.go @@ -34,6 +34,7 @@ func TestMain(m *testing.M) { // Perform setup needed to get storage stats. dirs := th.GetDirsToLog(ctx) log.Printf("Logging storage stats for %v", dirs) + err := storagestats.LogStorageStats(ctx, dirs) if err != nil { log.Printf("Error collecting the logs: %s", err.Error()) diff --git a/tests/robustness/multiclient_test/multiclient_test.go b/tests/robustness/multiclient_test/multiclient_test.go index 5b822b96ebd..08304caac49 100644 --- a/tests/robustness/multiclient_test/multiclient_test.go +++ b/tests/robustness/multiclient_test/multiclient_test.go @@ -243,6 +243,7 @@ func tryRandomAction(ctx context.Context, t *testing.T, opts engine.ActionOpts) // with options and masks no-op errors, and asserts when called for any other action. func tryDeleteAction(ctx context.Context, t *testing.T, action engine.ActionKey, actionOpts map[string]string) { t.Helper() + eligibleActionsList := []engine.ActionKey{ engine.DeleteDirectoryContentsActionKey, engine.DeleteRandomSubdirectoryActionKey, diff --git a/tests/robustness/multiclient_test/storagestats/storage_stats.go b/tests/robustness/multiclient_test/storagestats/storage_stats.go index 318e08a671d..f1faf605bbc 100644 --- a/tests/robustness/multiclient_test/storagestats/storage_stats.go +++ b/tests/robustness/multiclient_test/storagestats/storage_stats.go @@ -44,6 +44,7 @@ func LogStorageStats(ctx context.Context, dirs []string) error { logFilePath = getLogFilePath() log.Printf("log file path %s", logFilePath) + err = os.WriteFile(logFilePath, jsonData, 0o644) if err != nil { return fmt.Errorf("error writing log file: %w", err) @@ -65,8 +66,10 @@ func getSize(dirPath string) (int64, error) { if err != nil { return err } + size += info.Size() } + return nil }) diff --git a/tests/robustness/snapmeta/kopia_persister_light.go b/tests/robustness/snapmeta/kopia_persister_light.go index 24135832277..f223d6ab07f 100644 --- a/tests/robustness/snapmeta/kopia_persister_light.go +++ b/tests/robustness/snapmeta/kopia_persister_light.go @@ -49,6 +49,7 @@ func (kpl *KopiaPersisterLight) ConnectOrCreateRepo(repoPath string) error { // SetCacheLimits sets to an existing one if possible. func (kpl *KopiaPersisterLight) SetCacheLimits(repoPath string, cacheOpts *content.CachingOptions) error { bucketName := os.Getenv(S3BucketNameEnvKey) + err := kpl.kc.SetCacheLimits(context.Background(), repoPath, bucketName, cacheOpts) if err != nil { return err diff --git a/tests/tools/fio/workload.go b/tests/tools/fio/workload.go index ecce6e42b6f..ab6b213306e 100644 --- a/tests/tools/fio/workload.go +++ b/tests/tools/fio/workload.go @@ -140,6 +140,7 @@ func (fr *Runner) DeleteContentsAtDepth(relBasePath string, depth int, prob floa for _, entry := range dirEntries { if rand.Float32() < prob { path := filepath.Join(dirPath, entry.Name()) + err = os.RemoveAll(path) if err != nil { return err From 8e27298e57070c32fec2cc3f93c285da4b3e84b9 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Sun, 27 Apr 2025 06:52:22 +0200 Subject: [PATCH 080/206] fix(exclusions): remove unused exclusions (#4521) Signed-off-by: Matthieu MOREL --- .golangci.yml | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index c0f32daca75..05889256518 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -10,19 +10,19 @@ linters: default-signifies-exhaustive: true forbidigo: forbid: - - pattern: filepath.IsAbs # use ospath.IsAbs which supports windows UNC paths - - pattern: ioutil.Discard # use io.Discard + - pattern: filepath.IsAbs # use ospath.IsAbs which supports windows UNC paths + - pattern: ioutil.Discard # use io.Discard - pattern: ioutil.NopCloser # use io.NopCloser - - pattern: ioutil.ReadAll # use io.ReadAll - - pattern: ioutil.ReadDir # use os.ReadDir - - pattern: ioutil.ReadFile # use os.ReadFile - - pattern: ioutil.TempDir # use os.MkdirTemp - - pattern: ioutil.TempFile # use os.CreateTemp + - pattern: ioutil.ReadAll # use io.ReadAll + - pattern: ioutil.ReadDir # use os.ReadDir + - pattern: ioutil.ReadFile # use os.ReadFile + - pattern: ioutil.TempDir # use os.MkdirTemp + - pattern: ioutil.TempFile # use os.CreateTemp - pattern: ioutil.WriteFile # use os.WriteFile - - pattern: time.Now # do not use outside of 'clock' and 'timetrack' packages use clock.Now or timetrack.StartTimer - - pattern: time.Since # use timetrack.Timer.Elapsed() - - pattern: time.Until # never use this - - pattern: Envar\(\" # do not use envar literals, always wrap with EnvName() + - pattern: time.Now # do not use outside of 'clock' and 'timetrack' packages use clock.Now or timetrack.StartTimer + - pattern: time.Since # use timetrack.Timer.Elapsed() + - pattern: time.Until # never use this + - pattern: Envar\(\" # do not use envar literals, always wrap with EnvName() funlen: lines: 100 statements: 60 @@ -68,15 +68,15 @@ linters: default: all disable: - - gochecknoglobals - depguard - exhaustruct - forcetypeassert - funcorder + - gochecknoglobals - gochecknoinits + - gosmopolitan - importas - ireturn # this one may be interesting to control allocations - - gosmopolitan - musttag - nilnil - nlreturn @@ -100,7 +100,7 @@ linters: rules: - path: reporter.go linters: - - musttag + - musttag - path: _test\.go|testing|tests|test_env|fshasher|fault linters: - contextcheck @@ -150,12 +150,6 @@ linters: - text: "error returned from external package is unwrapped: sig: func github.com/kopia/kopia/internal/connection.UsingConnection" linters: - wrapcheck - - text: timeCmpSimplify - linters: - - gocritic - - text: ".*Magic number\\: [01]," - linters: - - mnd - text: "Errors unhandled" linters: - gosec From aa40c14e01e3c3c479158b866fb62087153df1c1 Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Sat, 26 Apr 2025 22:19:16 -0700 Subject: [PATCH 081/206] chore(ci): replace `multierr` with `errors.Join` (#4529) - Replace multierr with errors.Join for error handling - Remove now unused //nolint annotations - Ref: #4527 Signed-off-by: Matthieu MOREL Co-authored-by: Matthieu MOREL --- .golangci.yml | 7 +++++++ go.mod | 2 +- notification/notification_send.go | 10 +++++----- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 05889256518..1e320a3f7de 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -28,6 +28,13 @@ linters: statements: 60 gocognit: min-complexity: 40 + gomodguard: + blocked: + modules: + - go.uber.org/multierr: + recommendations: + - errors + reason: "multierr.Append() can be replaced by native errors.Join()" goconst: min-len: 5 min-occurrences: 3 diff --git a/go.mod b/go.mod index b524fe334a3..e54cd89585e 100644 --- a/go.mod +++ b/go.mod @@ -57,7 +57,6 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 go.opentelemetry.io/otel/sdk v1.35.0 go.opentelemetry.io/otel/trace v1.35.0 - go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 golang.org/x/crypto v0.37.0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 @@ -143,6 +142,7 @@ require ( go.opentelemetry.io/otel/metric v1.35.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect + go.uber.org/multierr v1.11.0 // indirect golang.org/x/time v0.11.0 // indirect google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect diff --git a/notification/notification_send.go b/notification/notification_send.go index a2954612b4f..ff6c68448f9 100644 --- a/notification/notification_send.go +++ b/notification/notification_send.go @@ -5,11 +5,11 @@ import ( "bytes" "context" "encoding/json" + stderrors "errors" "os" "time" "github.com/pkg/errors" - "go.uber.org/multierr" "github.com/kopia/kopia/internal/clock" "github.com/kopia/kopia/notification/notifyprofile" @@ -145,11 +145,11 @@ func SendInternal(ctx context.Context, rep repo.Repository, templateName string, for _, s := range senders { if err := SendTo(ctx, rep, s, templateName, eventArgs, sev, opt); err != nil { - resultErr = multierr.Append(resultErr, err) + resultErr = stderrors.Join(resultErr, err) } } - return resultErr //nolint:wrapcheck + return resultErr } // MakeTemplateArgs wraps event-specific arguments into TemplateArgs object. @@ -202,10 +202,10 @@ func SendTo(ctx context.Context, rep repo.Repository, s sender.Sender, templateN var resultErr error if err := s.Send(ctx, msg); err != nil { - resultErr = multierr.Append(resultErr, errors.Wrap(err, "unable to send notification message")) + resultErr = stderrors.Join(resultErr, errors.Wrap(err, "unable to send notification message")) } - return resultErr //nolint:wrapcheck + return resultErr } // SendTestNotification sends a test notification to the given sender. From 8098f49c90963b2fdde543cf572666a3c7c6bd12 Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Sat, 26 Apr 2025 23:11:36 -0700 Subject: [PATCH 082/206] chore(ci): remove exclusion for unused `ctx` parameters (#4530) Remove unused-parameter exclusion for `ctx` in revive linter. --------- Signed-off-by: Matthieu MOREL Co-authored-by: Matthieu MOREL --- .golangci.yml | 4 ---- cli/app.go | 4 ++-- cli/command_blob_delete.go | 2 +- cli/command_blob_gc.go | 2 +- cli/command_content_delete.go | 2 +- cli/command_content_rewrite.go | 2 +- cli/command_index_optimize.go | 2 +- cli/command_index_recover.go | 2 +- cli/command_manifest_delete.go | 2 +- cli/command_repository_throttle_get.go | 2 +- cli/command_restore.go | 2 +- cli/command_snapshot_estimate.go | 2 +- cli/command_user_hash_password.go | 2 +- fs/entry_dir_iterator.go | 2 +- fs/localfs/local_fs.go | 6 +++--- fs/localfs/local_fs_os.go | 6 +++--- fs/localfs/shallow_fs.go | 8 ++++---- fs/localfs/shallowentry.go | 2 +- fs/virtualfs/virtualfs.go | 8 ++++---- internal/auth/authn.go | 8 ++++---- internal/auth/authn_repo.go | 2 +- internal/auth/authz.go | 4 ++-- internal/auth/authz_acl.go | 2 +- internal/bigmap/bigmap_internal.go | 2 +- internal/bigmap/bigmap_map.go | 2 +- internal/cache/content_cache_passthrough.go | 6 +++--- internal/cache/persistent_lru_cache.go | 2 +- internal/fusemount/fusefs.go | 4 ++-- internal/metrics/metrics_registry.go | 2 +- internal/metrics/metrics_timeseries.go | 2 +- internal/mockfs/mockfs.go | 8 ++++---- internal/mount/mount_fuse.go | 2 +- internal/mount/mount_posix_webdav_helper_darwin.go | 4 ++-- internal/passwordpersist/passwordpersist_file.go | 2 +- internal/repodiag/blob_writer.go | 2 +- internal/server/api_cli.go | 2 +- internal/server/api_estimate.go | 2 +- internal/server/api_mount.go | 2 +- internal/server/api_paths.go | 2 +- internal/server/api_repo.go | 10 +++++----- internal/server/api_restore.go | 2 +- internal/server/api_sources.go | 2 +- internal/server/api_tasks.go | 10 +++++----- internal/server/api_ui_pref.go | 4 ++-- internal/server/server_authz_checks.go | 8 ++++---- internal/webdavmount/webdavmount.go | 6 +++--- notification/sender/email/email_sender.go | 2 +- notification/sender/email/email_sender_options.go | 2 +- notification/sender/jsonsender/jsonsender.go | 2 +- .../sender/pushover/pushover_sender_options.go | 2 +- .../sender/webhook/webhook_sender_options.go | 2 +- repo/blob/b2/b2_storage.go | 12 ++++++------ repo/blob/gcs/gcs_storage.go | 2 +- repo/blob/gdrive/gdrive_storage.go | 2 +- repo/blob/throttling/throttler.go | 2 +- repo/blob/throttling/token_bucket.go | 4 ++-- repo/blob/webdav/webdav_storage.go | 8 ++++---- repo/caching.go | 2 +- repo/connect.go | 2 +- repo/content/committed_content_index_disk_cache.go | 6 +++--- repo/content/committed_content_index_mem_cache.go | 8 ++++---- repo/content/content_manager.go | 2 +- repo/format/content_format.go | 2 +- repo/format/format_blob_cache.go | 10 +++++----- repo/format/format_provider.go | 2 +- repo/grpc_repository_client.go | 6 +++--- repo/manifest/manifest_manager.go | 4 ++-- repo/object/object_manager.go | 2 +- repo/open.go | 2 +- snapshot/restore/local_fs_output.go | 6 +++--- snapshot/restore/tar_output.go | 4 ++-- snapshot/restore/zip_output.go | 2 +- snapshot/snapshotfs/repofs.go | 2 +- snapshot/snapshotfs/snapshot_verifier.go | 2 +- snapshot/upload/upload.go | 2 +- 75 files changed, 134 insertions(+), 138 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 1e320a3f7de..2956e3bb42b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -132,10 +132,6 @@ linters: - text: "tracer is a global variable" linters: - gochecknoglobals - # always allow ctx even when unused - - text: "unused-parameter: parameter 'ctx' seems to be unused" - linters: - - revive - text: "Magic number: 1e" linters: - mnd diff --git a/cli/app.go b/cli/app.go index 813b2588761..3ea2ee3743b 100644 --- a/cli/app.go +++ b/cli/app.go @@ -88,7 +88,7 @@ type appServices interface { maybeRepositoryAction(act func(ctx context.Context, rep repo.Repository) error, mode repositoryAccessMode) func(ctx *kingpin.ParseContext) error baseActionWithContext(act func(ctx context.Context) error) func(ctx *kingpin.ParseContext) error openRepository(ctx context.Context, mustBeConnected bool) (repo.Repository, error) - advancedCommand(ctx context.Context) + advancedCommand() repositoryConfigFileName() string getProgress() *cliProgress getRestoreProgress() RestoreProgress @@ -658,7 +658,7 @@ func (c *App) maybeRunMaintenance(ctx context.Context, rep repo.Repository) erro return errors.Wrap(err, "error running maintenance") } -func (c *App) advancedCommand(ctx context.Context) { +func (c *App) advancedCommand() { if c.AdvancedCommands != "enabled" { _, _ = errorColor.Fprintf(c.stderrWriter, ` This command could be dangerous or lead to repository corruption when used improperly. diff --git a/cli/command_blob_delete.go b/cli/command_blob_delete.go index 3cca3d061be..0dcadd0d6fd 100644 --- a/cli/command_blob_delete.go +++ b/cli/command_blob_delete.go @@ -24,7 +24,7 @@ func (c *commandBlobDelete) setup(svc appServices, parent commandParent) { } func (c *commandBlobDelete) run(ctx context.Context, rep repo.DirectRepositoryWriter) error { - c.svc.advancedCommand(ctx) + c.svc.advancedCommand() for _, b := range c.blobIDs { err := rep.BlobStorage().DeleteBlob(ctx, blob.ID(b)) diff --git a/cli/command_blob_gc.go b/cli/command_blob_gc.go index b331fc908bc..2dd7db808d8 100644 --- a/cli/command_blob_gc.go +++ b/cli/command_blob_gc.go @@ -31,7 +31,7 @@ func (c *commandBlobGC) setup(svc appServices, parent commandParent) { } func (c *commandBlobGC) run(ctx context.Context, rep repo.DirectRepositoryWriter) error { - c.svc.advancedCommand(ctx) + c.svc.advancedCommand() opts := maintenance.DeleteUnreferencedBlobsOptions{ DryRun: c.delete != "yes", diff --git a/cli/command_content_delete.go b/cli/command_content_delete.go index 16e0fc03052..cf24fb90c0d 100644 --- a/cli/command_content_delete.go +++ b/cli/command_content_delete.go @@ -23,7 +23,7 @@ func (c *commandContentDelete) setup(svc appServices, parent commandParent) { } func (c *commandContentDelete) run(ctx context.Context, rep repo.DirectRepositoryWriter) error { - c.svc.advancedCommand(ctx) + c.svc.advancedCommand() contentIDs, err := toContentIDs(c.ids) if err != nil { diff --git a/cli/command_content_rewrite.go b/cli/command_content_rewrite.go index 456565ee4dc..15b9aad3781 100644 --- a/cli/command_content_rewrite.go +++ b/cli/command_content_rewrite.go @@ -41,7 +41,7 @@ func (c *commandContentRewrite) setup(svc appServices, parent commandParent) { } func (c *commandContentRewrite) runContentRewriteCommand(ctx context.Context, rep repo.DirectRepositoryWriter) error { - c.svc.advancedCommand(ctx) + c.svc.advancedCommand() contentIDs, err := toContentIDs(c.contentRewriteIDs) if err != nil { diff --git a/cli/command_index_optimize.go b/cli/command_index_optimize.go index 04e22259ee1..850adfa0cda 100644 --- a/cli/command_index_optimize.go +++ b/cli/command_index_optimize.go @@ -29,7 +29,7 @@ func (c *commandIndexOptimize) setup(svc appServices, parent commandParent) { } func (c *commandIndexOptimize) runOptimizeCommand(ctx context.Context, rep repo.DirectRepositoryWriter) error { - c.svc.advancedCommand(ctx) + c.svc.advancedCommand() contentIDs, err := toContentIDs(c.optimizeDropContents) if err != nil { diff --git a/cli/command_index_recover.go b/cli/command_index_recover.go index f85544dd016..1d3248ed169 100644 --- a/cli/command_index_recover.go +++ b/cli/command_index_recover.go @@ -40,7 +40,7 @@ func (c *commandIndexRecover) setup(svc appServices, parent commandParent) { } func (c *commandIndexRecover) run(ctx context.Context, rep repo.DirectRepositoryWriter) error { - c.svc.advancedCommand(ctx) + c.svc.advancedCommand() var ( processedBlobCount atomic.Int32 diff --git a/cli/command_manifest_delete.go b/cli/command_manifest_delete.go index 44e5abf32fd..9508ff08aaf 100644 --- a/cli/command_manifest_delete.go +++ b/cli/command_manifest_delete.go @@ -23,7 +23,7 @@ func (c *commandManifestDelete) setup(svc appServices, parent commandParent) { } func (c *commandManifestDelete) run(ctx context.Context, rep repo.RepositoryWriter) error { - c.svc.advancedCommand(ctx) + c.svc.advancedCommand() for _, it := range toManifestIDs(c.manifestRemoveItems) { if err := rep.DeleteManifest(ctx, it); err != nil { diff --git a/cli/command_repository_throttle_get.go b/cli/command_repository_throttle_get.go index 28b7059f383..6fb457a38da 100644 --- a/cli/command_repository_throttle_get.go +++ b/cli/command_repository_throttle_get.go @@ -19,7 +19,7 @@ func (c *commandRepositoryThrottleGet) setup(svc appServices, parent commandPare cmd.Action(svc.directRepositoryReadAction(c.run)) } -func (c *commandRepositoryThrottleGet) run(ctx context.Context, rep repo.DirectRepository) error { +func (c *commandRepositoryThrottleGet) run(_ context.Context, rep repo.DirectRepository) error { limits := rep.Throttler().Limits() if err := c.ctg.output(&limits); err != nil { diff --git a/cli/command_restore.go b/cli/command_restore.go index 6a305f0532d..67c86184660 100644 --- a/cli/command_restore.go +++ b/cli/command_restore.go @@ -419,7 +419,7 @@ func (c *commandRestore) run(ctx context.Context, rep repo.Repository) error { } restoreProgress := c.getRestoreProgress() - progressCallback := func(ctx context.Context, stats restore.Stats) { + progressCallback := func(_ context.Context, stats restore.Stats) { restoreProgress.SetCounters(stats) } diff --git a/cli/command_snapshot_estimate.go b/cli/command_snapshot_estimate.go index 7be3fac9351..746a2941025 100644 --- a/cli/command_snapshot_estimate.go +++ b/cli/command_snapshot_estimate.go @@ -59,7 +59,7 @@ func (ep *estimateProgress) Error(ctx context.Context, filename string, err erro } } -func (ep *estimateProgress) Stats(ctx context.Context, st *snapshot.Stats, included, excluded upload.SampleBuckets, excludedDirs []string, final bool) { +func (ep *estimateProgress) Stats(_ context.Context, st *snapshot.Stats, included, excluded upload.SampleBuckets, excludedDirs []string, final bool) { _ = final ep.stats = *st diff --git a/cli/command_user_hash_password.go b/cli/command_user_hash_password.go index 7c9c38332a1..5734e2846e4 100644 --- a/cli/command_user_hash_password.go +++ b/cli/command_user_hash_password.go @@ -30,7 +30,7 @@ func (c *commandServerUserHashPassword) setup(svc appServices, parent commandPar // connected repository. To avoid a future incompatible change where the // 'hash-password' command stops working without a connected repository, // a connected repository is required now. -func (c *commandServerUserHashPassword) runServerUserHashPassword(ctx context.Context, _ repo.RepositoryWriter) error { +func (c *commandServerUserHashPassword) runServerUserHashPassword(_ context.Context, _ repo.RepositoryWriter) error { if c.password == "" { // when password hash is empty, ask for password pwd, err := askConfirmPass(c.out.stdout(), "Enter password to hash: ") diff --git a/fs/entry_dir_iterator.go b/fs/entry_dir_iterator.go index f85577dbc2f..8bcc47df06c 100644 --- a/fs/entry_dir_iterator.go +++ b/fs/entry_dir_iterator.go @@ -11,7 +11,7 @@ type staticIterator struct { func (it *staticIterator) Close() { } -func (it *staticIterator) Next(ctx context.Context) (Entry, error) { +func (it *staticIterator) Next(_ context.Context) (Entry, error) { if it.cur < len(it.entries) { v := it.entries[it.cur] it.cur++ diff --git a/fs/localfs/local_fs.go b/fs/localfs/local_fs.go index f3caa11c0ce..b194a6c0df9 100644 --- a/fs/localfs/local_fs.go +++ b/fs/localfs/local_fs.go @@ -103,7 +103,7 @@ func (f *fileWithMetadata) Entry() (fs.Entry, error) { return newFilesystemFile(newEntry(fi, dirPrefix(f.Name()))), nil } -func (fsf *filesystemFile) Open(ctx context.Context) (fs.Reader, error) { +func (fsf *filesystemFile) Open(_ context.Context) (fs.Reader, error) { f, err := os.Open(fsf.fullPath()) if err != nil { return nil, errors.Wrap(err, "unable to open local file") @@ -112,12 +112,12 @@ func (fsf *filesystemFile) Open(ctx context.Context) (fs.Reader, error) { return &fileWithMetadata{f}, nil } -func (fsl *filesystemSymlink) Readlink(ctx context.Context) (string, error) { +func (fsl *filesystemSymlink) Readlink(_ context.Context) (string, error) { //nolint:wrapcheck return os.Readlink(fsl.fullPath()) } -func (fsl *filesystemSymlink) Resolve(ctx context.Context) (fs.Entry, error) { +func (fsl *filesystemSymlink) Resolve(_ context.Context) (fs.Entry, error) { target, err := filepath.EvalSymlinks(fsl.fullPath()) if err != nil { return nil, errors.Wrapf(err, "cannot resolve symlink for '%q'", fsl.fullPath()) diff --git a/fs/localfs/local_fs_os.go b/fs/localfs/local_fs_os.go index e790b5b3876..d9850590dff 100644 --- a/fs/localfs/local_fs_os.go +++ b/fs/localfs/local_fs_os.go @@ -22,7 +22,7 @@ type filesystemDirectoryIterator struct { currentBatch []os.DirEntry } -func (it *filesystemDirectoryIterator) Next(ctx context.Context) (fs.Entry, error) { +func (it *filesystemDirectoryIterator) Next(_ context.Context) (fs.Entry, error) { for { // we're at the end of the current batch, fetch the next batch if it.currentIndex >= len(it.currentBatch) { @@ -63,7 +63,7 @@ func (it *filesystemDirectoryIterator) Close() { it.dirHandle.Close() //nolint:errcheck } -func (fsd *filesystemDirectory) Iterate(ctx context.Context) (fs.DirectoryIterator, error) { +func (fsd *filesystemDirectory) Iterate(_ context.Context) (fs.DirectoryIterator, error) { fullPath := fsd.fullPath() f, direrr := os.Open(fullPath) //nolint:gosec @@ -76,7 +76,7 @@ func (fsd *filesystemDirectory) Iterate(ctx context.Context) (fs.DirectoryIterat return &filesystemDirectoryIterator{dirHandle: f, childPrefix: childPrefix}, nil } -func (fsd *filesystemDirectory) Child(ctx context.Context, name string) (fs.Entry, error) { +func (fsd *filesystemDirectory) Child(_ context.Context, name string) (fs.Entry, error) { fullPath := fsd.fullPath() st, err := os.Lstat(filepath.Join(fullPath, name)) diff --git a/fs/localfs/shallow_fs.go b/fs/localfs/shallow_fs.go index eec648711f0..ae1923d68b2 100644 --- a/fs/localfs/shallow_fs.go +++ b/fs/localfs/shallow_fs.go @@ -96,21 +96,21 @@ func checkedDirEntryFromPlaceholder(path, php string) (*snapshot.DirEntry, error return dirEntryFromPlaceholder(php) } -func (fsf *shallowFilesystemFile) DirEntryOrNil(ctx context.Context) (*snapshot.DirEntry, error) { +func (fsf *shallowFilesystemFile) DirEntryOrNil(_ context.Context) (*snapshot.DirEntry, error) { path := fsf.fullPath() php := path + ShallowEntrySuffix return checkedDirEntryFromPlaceholder(path, php) } -func (fsd *shallowFilesystemDirectory) DirEntryOrNil(ctx context.Context) (*snapshot.DirEntry, error) { +func (fsd *shallowFilesystemDirectory) DirEntryOrNil(_ context.Context) (*snapshot.DirEntry, error) { path := fsd.fullPath() php := filepath.Join(path+ShallowEntrySuffix, ShallowEntrySuffix) return checkedDirEntryFromPlaceholder(path, php) } -func (fsf *shallowFilesystemFile) Open(ctx context.Context) (fs.Reader, error) { +func (fsf *shallowFilesystemFile) Open(_ context.Context) (fs.Reader, error) { // TODO(rjk): Conceivably, we could implement all of these in terms of the repository. return nil, errors.New("shallowFilesystemFile.Open not supported") } @@ -124,7 +124,7 @@ func (fsd *shallowFilesystemDirectory) Child(ctx context.Context, name string) ( return nil, errors.New("shallowFilesystemDirectory.Child not supported") } -func (fsd *shallowFilesystemDirectory) Iterate(ctx context.Context) (fs.DirectoryIterator, error) { +func (fsd *shallowFilesystemDirectory) Iterate(_ context.Context) (fs.DirectoryIterator, error) { return nil, errors.New("shallowFilesystemDirectory.IterateEntries not supported") } diff --git a/fs/localfs/shallowentry.go b/fs/localfs/shallowentry.go index 35386a61912..c28b22f40f9 100644 --- a/fs/localfs/shallowentry.go +++ b/fs/localfs/shallowentry.go @@ -26,7 +26,7 @@ func TrimShallowSuffix(path string) string { type PlaceholderFilePath string // DirEntryOrNil returns the snapshot.DirEntry corresponding to this PlaceholderFilePath. -func (pf PlaceholderFilePath) DirEntryOrNil(ctx context.Context) (*snapshot.DirEntry, error) { +func (pf PlaceholderFilePath) DirEntryOrNil(_ context.Context) (*snapshot.DirEntry, error) { path := string(pf) if fi, err := os.Lstat(path); err == nil && fi.IsDir() { return dirEntryFromPlaceholder(filepath.Join(path, ShallowEntrySuffix)) diff --git a/fs/virtualfs/virtualfs.go b/fs/virtualfs/virtualfs.go index 6d8b0e7e707..cced8dcff9e 100644 --- a/fs/virtualfs/virtualfs.go +++ b/fs/virtualfs/virtualfs.go @@ -78,7 +78,7 @@ func (sd *staticDirectory) Child(ctx context.Context, name string) (fs.Entry, er return fs.IterateEntriesAndFindChild(ctx, sd, name) } -func (sd *staticDirectory) Iterate(ctx context.Context) (fs.DirectoryIterator, error) { +func (sd *staticDirectory) Iterate(_ context.Context) (fs.DirectoryIterator, error) { return fs.StaticIterator(append([]fs.Entry{}, sd.entries...), nil), nil } @@ -108,13 +108,13 @@ type streamingDirectory struct { var errChildNotSupported = errors.New("streamingDirectory.Child not supported") -func (sd *streamingDirectory) Child(ctx context.Context, _ string) (fs.Entry, error) { +func (sd *streamingDirectory) Child(_ context.Context, _ string) (fs.Entry, error) { return nil, errChildNotSupported } var errIteratorAlreadyUsed = errors.New("cannot use streaming directory iterator more than once") // +checklocksignore: mu -func (sd *streamingDirectory) Iterate(ctx context.Context) (fs.DirectoryIterator, error) { +func (sd *streamingDirectory) Iterate(_ context.Context) (fs.DirectoryIterator, error) { sd.mu.Lock() defer sd.mu.Unlock() @@ -158,7 +158,7 @@ var errReaderAlreadyUsed = errors.New("cannot use streaming file reader more tha // GetReader returns the streaming file's reader. // Note: Caller of this function has to ensure concurrency safety. // The file's reader is set to nil after the first call. -func (vf *virtualFile) GetReader(ctx context.Context) (io.ReadCloser, error) { +func (vf *virtualFile) GetReader(_ context.Context) (io.ReadCloser, error) { if vf.reader == nil { return nil, errReaderAlreadyUsed } diff --git a/internal/auth/authn.go b/internal/auth/authn.go index 26a5c15eae8..8f71181ab6f 100644 --- a/internal/auth/authn.go +++ b/internal/auth/authn.go @@ -25,12 +25,12 @@ type singleUserAuthenticator struct { expectedPasswordBytes []byte } -func (a *singleUserAuthenticator) IsValid(ctx context.Context, _ repo.Repository, username, password string) bool { +func (a *singleUserAuthenticator) IsValid(_ context.Context, _ repo.Repository, username, password string) bool { return subtle.ConstantTimeCompare([]byte(username), a.expectedUsernameBytes)* subtle.ConstantTimeCompare([]byte(password), a.expectedPasswordBytes) == 1 } -func (a *singleUserAuthenticator) Refresh(ctx context.Context) error { +func (a *singleUserAuthenticator) Refresh(_ context.Context) error { return nil } @@ -75,11 +75,11 @@ type htpasswdAuthenticator struct { f *htpasswd.File } -func (a htpasswdAuthenticator) IsValid(ctx context.Context, _ repo.Repository, username, password string) bool { +func (a htpasswdAuthenticator) IsValid(_ context.Context, _ repo.Repository, username, password string) bool { return a.f.Match(username, password) } -func (a htpasswdAuthenticator) Refresh(ctx context.Context) error { +func (a htpasswdAuthenticator) Refresh(_ context.Context) error { return errors.Wrap(a.f.Reload(nil), "error reloading password file") } diff --git a/internal/auth/authn_repo.go b/internal/auth/authn_repo.go index 7ac7ceae114..ca014f3cc26 100644 --- a/internal/auth/authn_repo.go +++ b/internal/auth/authn_repo.go @@ -61,7 +61,7 @@ func (ac *repositoryUserAuthenticator) IsValid(ctx context.Context, rep repo.Rep return valid } -func (ac *repositoryUserAuthenticator) Refresh(ctx context.Context) error { +func (ac *repositoryUserAuthenticator) Refresh(_ context.Context) error { ac.mu.Lock() defer ac.mu.Unlock() diff --git a/internal/auth/authz.go b/internal/auth/authz.go index b2a3177f6f5..7360c66ad77 100644 --- a/internal/auth/authz.go +++ b/internal/auth/authz.go @@ -81,11 +81,11 @@ func (la legacyAuthorizationInfo) ManifestAccessLevel(labels map[string]string) type legacyAuthorizer struct{} -func (legacyAuthorizer) Authorize(ctx context.Context, _ repo.Repository, username string) AuthorizationInfo { +func (legacyAuthorizer) Authorize(_ context.Context, _ repo.Repository, username string) AuthorizationInfo { return legacyAuthorizationInfo{usernameAtHostname: username} } -func (legacyAuthorizer) Refresh(ctx context.Context) error { +func (legacyAuthorizer) Refresh(_ context.Context) error { return nil } diff --git a/internal/auth/authz_acl.go b/internal/auth/authz_acl.go index 2eca3e2c6b1..d6a3e29530d 100644 --- a/internal/auth/authz_acl.go +++ b/internal/auth/authz_acl.go @@ -141,7 +141,7 @@ func (ac *aclCache) Authorize(ctx context.Context, rep repo.Repository, username return aclEntriesAuthorizer{acl.EntriesForUser(ac.aclEntries, u, h), u, h} } -func (ac *aclCache) Refresh(ctx context.Context) error { +func (ac *aclCache) Refresh(_ context.Context) error { ac.mu.Lock() defer ac.mu.Unlock() diff --git a/internal/bigmap/bigmap_internal.go b/internal/bigmap/bigmap_internal.go index 8f924c18075..c1ed80d485d 100644 --- a/internal/bigmap/bigmap_internal.go +++ b/internal/bigmap/bigmap_internal.go @@ -389,7 +389,7 @@ func (m *internalMap) newSegment(ctx context.Context) mmap.MMap { } // Close releases all resources associated with a map. -func (m *internalMap) Close(ctx context.Context) { +func (m *internalMap) Close(_ context.Context) { m.mu.Lock() defer m.mu.Unlock() diff --git a/internal/bigmap/bigmap_map.go b/internal/bigmap/bigmap_map.go index e210c6779ee..cec3dace1a7 100644 --- a/internal/bigmap/bigmap_map.go +++ b/internal/bigmap/bigmap_map.go @@ -51,7 +51,7 @@ func (s *Map) PutIfAbsent(ctx context.Context, key, value []byte) bool { } // Get gets the element from the map and appends the value to the provided buffer. -func (s *Map) Get(ctx context.Context, output, key []byte) (result []byte, ok bool, err error) { +func (s *Map) Get(_ context.Context, output, key []byte) (result []byte, ok bool, err error) { if v, ok := s.inner.Get(output, key); ok { result, err := s.decrypt(key, v) diff --git a/internal/cache/content_cache_passthrough.go b/internal/cache/content_cache_passthrough.go index c98e017039e..b1d6c1e9df8 100644 --- a/internal/cache/content_cache_passthrough.go +++ b/internal/cache/content_cache_passthrough.go @@ -12,7 +12,7 @@ type passthroughContentCache struct { st blob.Storage } -func (c passthroughContentCache) Close(ctx context.Context) {} +func (c passthroughContentCache) Close(_ context.Context) {} func (c passthroughContentCache) GetContent(ctx context.Context, contentID string, blobID blob.ID, offset, length int64, output *gather.WriteBuffer) error { _ = contentID @@ -21,13 +21,13 @@ func (c passthroughContentCache) GetContent(ctx context.Context, contentID strin return c.st.GetBlob(ctx, blobID, offset, length, output) } -func (c passthroughContentCache) PrefetchBlob(ctx context.Context, blobID blob.ID) error { +func (c passthroughContentCache) PrefetchBlob(_ context.Context, blobID blob.ID) error { _ = blobID return nil } -func (c passthroughContentCache) Sync(ctx context.Context, blobPrefix blob.ID) error { +func (c passthroughContentCache) Sync(_ context.Context, blobPrefix blob.ID) error { _ = blobPrefix return nil diff --git a/internal/cache/persistent_lru_cache.go b/internal/cache/persistent_lru_cache.go index eb519f615a8..18e038d6f29 100644 --- a/internal/cache/persistent_lru_cache.go +++ b/internal/cache/persistent_lru_cache.go @@ -211,7 +211,7 @@ func (c *PersistentCache) Put(ctx context.Context, key string, data gather.Bytes } // Close closes the instance of persistent cache possibly waiting for at least one sweep to complete. -func (c *PersistentCache) Close(ctx context.Context) { +func (c *PersistentCache) Close(_ context.Context) { if c == nil { return } diff --git a/internal/fusemount/fusefs.go b/internal/fusemount/fusefs.go index 8ef78fdcd94..0b5c744744b 100644 --- a/internal/fusemount/fusefs.go +++ b/internal/fusemount/fusefs.go @@ -60,7 +60,7 @@ func populateAttributes(a *fuse.Attr, e fs.Entry) { a.Blocks = (a.Size + fakeBlockSize - 1) / fakeBlockSize } -func (n *fuseNode) Getattr(ctx context.Context, _ gofusefs.FileHandle, a *fuse.AttrOut) syscall.Errno { +func (n *fuseNode) Getattr(_ context.Context, _ gofusefs.FileHandle, a *fuse.AttrOut) syscall.Errno { populateAttributes(&a.Attr, n.entry) a.Ino = n.StableAttr().Ino @@ -114,7 +114,7 @@ func (f *fuseFileHandle) Read(ctx context.Context, dest []byte, off int64) (fuse return fuse.ReadResultData(dest[0:n]), gofusefs.OK } -func (f *fuseFileHandle) Release(ctx context.Context) syscall.Errno { +func (f *fuseFileHandle) Release(_ context.Context) syscall.Errno { f.mu.Lock() defer f.mu.Unlock() diff --git a/internal/metrics/metrics_registry.go b/internal/metrics/metrics_registry.go index b07fa231a72..1839a21b3ba 100644 --- a/internal/metrics/metrics_registry.go +++ b/internal/metrics/metrics_registry.go @@ -103,7 +103,7 @@ func (r *Registry) Snapshot(reset bool) Snapshot { } // Close closes the metrics registry. -func (r *Registry) Close(ctx context.Context) error { +func (r *Registry) Close(_ context.Context) error { if r == nil { return nil } diff --git a/internal/metrics/metrics_timeseries.go b/internal/metrics/metrics_timeseries.go index 37fce87c587..5dbf47a7e02 100644 --- a/internal/metrics/metrics_timeseries.go +++ b/internal/metrics/metrics_timeseries.go @@ -53,7 +53,7 @@ type SnapshotValueAggregator[T any] interface { // CreateTimeSeries computes time series which represent aggregations of a given // counters or distributions over a set of snapshots. func CreateTimeSeries[TValue any]( - ctx context.Context, + _ context.Context, snapshots []*Snapshot, valueHandler SnapshotValueAggregator[TValue], opts AggregateMetricsOptions, diff --git a/internal/mockfs/mockfs.go b/internal/mockfs/mockfs.go index 7936978ed1a..d5a390183e0 100644 --- a/internal/mockfs/mockfs.go +++ b/internal/mockfs/mockfs.go @@ -315,7 +315,7 @@ func (imd *Directory) SupportsMultipleIterations() bool { } // Child gets the named child of a directory. -func (imd *Directory) Child(ctx context.Context, name string) (fs.Entry, error) { +func (imd *Directory) Child(_ context.Context, name string) (fs.Entry, error) { e := fs.FindByName(imd.children, name) if e != nil { return e, nil @@ -325,7 +325,7 @@ func (imd *Directory) Child(ctx context.Context, name string) (fs.Entry, error) } // Iterate returns directory iterator. -func (imd *Directory) Iterate(ctx context.Context) (fs.DirectoryIterator, error) { +func (imd *Directory) Iterate(_ context.Context) (fs.DirectoryIterator, error) { if imd.readdirError != nil { return nil, errors.Wrapf(imd.readdirError, "in mockfs Directory.Iterate on directory %s", imd.name) } @@ -361,7 +361,7 @@ func (ifr *fileReader) Entry() (fs.Entry, error) { } // Open opens the file for reading, optionally simulating error. -func (imf *File) Open(ctx context.Context) (fs.Reader, error) { +func (imf *File) Open(_ context.Context) (fs.Reader, error) { r, err := imf.source() if err != nil { return nil, err @@ -398,7 +398,7 @@ func (imsl *Symlink) Resolve(ctx context.Context) (fs.Entry, error) { } // Readlink implements fs.Symlink interface. -func (imsl *Symlink) Readlink(ctx context.Context) (string, error) { +func (imsl *Symlink) Readlink(_ context.Context) (string, error) { return imsl.target, nil } diff --git a/internal/mount/mount_fuse.go b/internal/mount/mount_fuse.go index 44816aaa377..1d811fb22c5 100644 --- a/internal/mount/mount_fuse.go +++ b/internal/mount/mount_fuse.go @@ -89,7 +89,7 @@ func (fc fuseController) MountPath() string { return fc.mountPoint } -func (fc fuseController) Unmount(ctx context.Context) error { +func (fc fuseController) Unmount(_ context.Context) error { if err := fc.fuseConnection.Unmount(); err != nil { return errors.Wrap(err, "unmount error") } diff --git a/internal/mount/mount_posix_webdav_helper_darwin.go b/internal/mount/mount_posix_webdav_helper_darwin.go index a6e7b628ddb..a7c2a7b013f 100644 --- a/internal/mount/mount_posix_webdav_helper_darwin.go +++ b/internal/mount/mount_posix_webdav_helper_darwin.go @@ -7,7 +7,7 @@ import ( "github.com/pkg/errors" ) -func mountWebDavHelper(ctx context.Context, url, path string) error { +func mountWebDavHelper(_ context.Context, url, path string) error { mount := exec.Command("/sbin/mount", "-t", "webdav", "-r", url, path) if err := mount.Run(); err != nil { return errors.Errorf("webdav mount %q on %q failed: %v", url, path, err) @@ -16,7 +16,7 @@ func mountWebDavHelper(ctx context.Context, url, path string) error { return nil } -func unmountWebDevHelper(ctx context.Context, path string) error { +func unmountWebDevHelper(_ context.Context, path string) error { unmount := exec.Command("/usr/sbin/diskutil", "unmount", path) if err := unmount.Run(); err != nil { return errors.Errorf("unmount %q failed: %v", path, err) diff --git a/internal/passwordpersist/passwordpersist_file.go b/internal/passwordpersist/passwordpersist_file.go index 4463f895401..a0699cfe043 100644 --- a/internal/passwordpersist/passwordpersist_file.go +++ b/internal/passwordpersist/passwordpersist_file.go @@ -45,7 +45,7 @@ func (filePasswordStorage) PersistPassword(ctx context.Context, configFile, pass return os.WriteFile(fn, []byte(base64.StdEncoding.EncodeToString([]byte(password))), passwordFileMode) } -func (filePasswordStorage) DeletePassword(ctx context.Context, configFile string) error { +func (filePasswordStorage) DeletePassword(_ context.Context, configFile string) error { err := os.Remove(passwordFileName(configFile)) if err != nil && !os.IsNotExist(err) { return errors.Wrap(err, "error deleting password file") diff --git a/internal/repodiag/blob_writer.go b/internal/repodiag/blob_writer.go index 68a1c93efbf..01b8e402eab 100644 --- a/internal/repodiag/blob_writer.go +++ b/internal/repodiag/blob_writer.go @@ -53,7 +53,7 @@ func (w *BlobWriter) EncryptAndWriteBlobAsync(ctx context.Context, prefix blob.I } // Wait waits for all the writes to complete. -func (w *BlobWriter) Wait(ctx context.Context) error { +func (w *BlobWriter) Wait(_ context.Context) error { w.wg.Wait() return nil } diff --git a/internal/server/api_cli.go b/internal/server/api_cli.go index 3edac5d4292..558158d3fda 100644 --- a/internal/server/api_cli.go +++ b/internal/server/api_cli.go @@ -8,7 +8,7 @@ import ( "github.com/kopia/kopia/internal/serverapi" ) -func handleCLIInfo(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleCLIInfo(_ context.Context, rc requestContext) (interface{}, *apiError) { executable, err := os.Executable() if err != nil { executable = "kopia" diff --git a/internal/server/api_estimate.go b/internal/server/api_estimate.go index 2705638ca94..d708c2bcc42 100644 --- a/internal/server/api_estimate.go +++ b/internal/server/api_estimate.go @@ -24,7 +24,7 @@ type estimateTaskProgress struct { ctrl uitask.Controller } -func (p estimateTaskProgress) Processing(ctx context.Context, dirname string) { +func (p estimateTaskProgress) Processing(_ context.Context, dirname string) { p.ctrl.ReportProgressInfo(dirname) } diff --git a/internal/server/api_mount.go b/internal/server/api_mount.go index e2ef703a6c4..132bfd814e1 100644 --- a/internal/server/api_mount.go +++ b/internal/server/api_mount.go @@ -77,7 +77,7 @@ func handleMountDelete(ctx context.Context, rc requestContext) (interface{}, *ap return &serverapi.Empty{}, nil } -func handleMountList(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleMountList(_ context.Context, rc requestContext) (interface{}, *apiError) { res := &serverapi.MountedSnapshots{ Items: []*serverapi.MountedSnapshot{}, } diff --git a/internal/server/api_paths.go b/internal/server/api_paths.go index afb08db00ba..09fe62212ef 100644 --- a/internal/server/api_paths.go +++ b/internal/server/api_paths.go @@ -10,7 +10,7 @@ import ( "github.com/kopia/kopia/snapshot" ) -func handlePathResolve(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handlePathResolve(_ context.Context, rc requestContext) (interface{}, *apiError) { var req serverapi.ResolvePathRequest if err := json.Unmarshal(rc.body, &req); err != nil { diff --git a/internal/server/api_repo.go b/internal/server/api_repo.go index 04b38de094d..8afd99692ae 100644 --- a/internal/server/api_repo.go +++ b/internal/server/api_repo.go @@ -26,7 +26,7 @@ import ( const syncConnectWaitTime = 5 * time.Second -func handleRepoStatus(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleRepoStatus(_ context.Context, rc requestContext) (interface{}, *apiError) { if rc.rep == nil { return &serverapi.StatusResponse{ Connected: false, @@ -240,7 +240,7 @@ func handleRepoSetDescription(ctx context.Context, rc requestContext) (interface return handleRepoStatus(ctx, rc) } -func handleRepoSupportedAlgorithms(ctx context.Context, _ requestContext) (interface{}, *apiError) { +func handleRepoSupportedAlgorithms(_ context.Context, _ requestContext) (interface{}, *apiError) { res := &serverapi.SupportedAlgorithmsResponse{ DefaultHashAlgorithm: hashing.DefaultAlgorithm, SupportedHashAlgorithms: toAlgorithmInfo(hashing.SupportedAlgorithms(), neverDeprecated), @@ -299,7 +299,7 @@ func sortAlgorithms(a []serverapi.AlgorithmInfo) { }) } -func handleRepoGetThrottle(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleRepoGetThrottle(_ context.Context, rc requestContext) (interface{}, *apiError) { dr, ok := rc.rep.(repo.DirectRepository) if !ok { return nil, requestError(serverapi.ErrorStorageConnection, "no direct storage connection") @@ -308,7 +308,7 @@ func handleRepoGetThrottle(ctx context.Context, rc requestContext) (interface{}, return dr.Throttler().Limits(), nil } -func handleRepoSetThrottle(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleRepoSetThrottle(_ context.Context, rc requestContext) (interface{}, *apiError) { dr, ok := rc.rep.(repo.DirectRepository) if !ok { return nil, requestError(serverapi.ErrorStorageConnection, "no direct storage connection") @@ -387,7 +387,7 @@ func (s *Server) disconnect(ctx context.Context) error { return nil } -func handleRepoSync(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleRepoSync(_ context.Context, rc requestContext) (interface{}, *apiError) { rc.srv.Refresh() return &serverapi.Empty{}, nil diff --git a/internal/server/api_restore.go b/internal/server/api_restore.go index a31d1427d49..4c9642823e9 100644 --- a/internal/server/api_restore.go +++ b/internal/server/api_restore.go @@ -95,7 +95,7 @@ func handleRestore(ctx context.Context, rc requestContext) (interface{}, *apiErr opt := req.Options - opt.ProgressCallback = func(ctx context.Context, s restore.Stats) { + opt.ProgressCallback = func(_ context.Context, s restore.Stats) { ctrl.ReportCounters(restoreCounters(s)) } diff --git a/internal/server/api_sources.go b/internal/server/api_sources.go index 4a0f1e647e6..aaf8124c9c9 100644 --- a/internal/server/api_sources.go +++ b/internal/server/api_sources.go @@ -15,7 +15,7 @@ import ( "github.com/kopia/kopia/snapshot/policy" ) -func handleSourcesList(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleSourcesList(_ context.Context, rc requestContext) (interface{}, *apiError) { _, multiUser := rc.rep.(repo.DirectRepository) resp := &serverapi.SourcesResponse{ diff --git a/internal/server/api_tasks.go b/internal/server/api_tasks.go index cf43adfbde1..47a928aac26 100644 --- a/internal/server/api_tasks.go +++ b/internal/server/api_tasks.go @@ -7,7 +7,7 @@ import ( "github.com/kopia/kopia/internal/uitask" ) -func handleTaskList(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleTaskList(_ context.Context, rc requestContext) (interface{}, *apiError) { tasks := rc.srv.taskManager().ListTasks() if tasks == nil { tasks = []uitask.Info{} @@ -18,7 +18,7 @@ func handleTaskList(ctx context.Context, rc requestContext) (interface{}, *apiEr }, nil } -func handleTaskInfo(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleTaskInfo(_ context.Context, rc requestContext) (interface{}, *apiError) { taskID := rc.muxVar("taskID") t, ok := rc.srv.taskManager().GetTask(taskID) @@ -29,11 +29,11 @@ func handleTaskInfo(ctx context.Context, rc requestContext) (interface{}, *apiEr return t, nil } -func handleTaskSummary(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleTaskSummary(_ context.Context, rc requestContext) (interface{}, *apiError) { return rc.srv.taskManager().TaskSummary(), nil } -func handleTaskLogs(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleTaskLogs(_ context.Context, rc requestContext) (interface{}, *apiError) { taskID := rc.muxVar("taskID") return serverapi.TaskLogResponse{ @@ -41,7 +41,7 @@ func handleTaskLogs(ctx context.Context, rc requestContext) (interface{}, *apiEr }, nil } -func handleTaskCancel(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleTaskCancel(_ context.Context, rc requestContext) (interface{}, *apiError) { rc.srv.taskManager().CancelTask(rc.muxVar("taskID")) return &serverapi.Empty{}, nil diff --git a/internal/server/api_ui_pref.go b/internal/server/api_ui_pref.go index b738a290df2..ae642e65b4b 100644 --- a/internal/server/api_ui_pref.go +++ b/internal/server/api_ui_pref.go @@ -37,7 +37,7 @@ func getUIPreferencesOrEmpty(s serverInterface) (serverapi.UIPreferences, error) return p, nil } -func handleGetUIPreferences(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleGetUIPreferences(_ context.Context, rc requestContext) (interface{}, *apiError) { p, err := getUIPreferencesOrEmpty(rc.srv) if err != nil { return nil, internalServerError(err) @@ -46,7 +46,7 @@ func handleGetUIPreferences(ctx context.Context, rc requestContext) (interface{} return &p, nil } -func handleSetUIPreferences(ctx context.Context, rc requestContext) (interface{}, *apiError) { +func handleSetUIPreferences(_ context.Context, rc requestContext) (interface{}, *apiError) { var p serverapi.UIPreferences // verify the JSON is valid by unmarshaling it diff --git a/internal/server/server_authz_checks.go b/internal/server/server_authz_checks.go index 97a77d41f50..eae68296316 100644 --- a/internal/server/server_authz_checks.go +++ b/internal/server/server_authz_checks.go @@ -58,7 +58,7 @@ func (s *Server) validateCSRFToken(r *http.Request) bool { return false } -func requireUIUser(ctx context.Context, rc requestContext) bool { +func requireUIUser(_ context.Context, rc requestContext) bool { if rc.srv.getAuthenticator() == nil { return true } @@ -72,7 +72,7 @@ func requireUIUser(ctx context.Context, rc requestContext) bool { return user == rc.srv.getOptions().UIUser } -func requireServerControlUser(ctx context.Context, rc requestContext) bool { +func requireServerControlUser(_ context.Context, rc requestContext) bool { if rc.srv.getAuthenticator() == nil { return true } @@ -86,11 +86,11 @@ func requireServerControlUser(ctx context.Context, rc requestContext) bool { return user == rc.srv.getOptions().ServerControlUser } -func anyAuthenticatedUser(ctx context.Context, _ requestContext) bool { +func anyAuthenticatedUser(_ context.Context, _ requestContext) bool { return true } -func handlerWillCheckAuthorization(ctx context.Context, _ requestContext) bool { +func handlerWillCheckAuthorization(_ context.Context, _ requestContext) bool { return true } diff --git a/internal/webdavmount/webdavmount.go b/internal/webdavmount/webdavmount.go index 9bbc170483f..81639d68147 100644 --- a/internal/webdavmount/webdavmount.go +++ b/internal/webdavmount/webdavmount.go @@ -172,15 +172,15 @@ type webdavFS struct { dir fs.Directory } -func (w *webdavFS) Mkdir(ctx context.Context, path string, _ os.FileMode) error { +func (w *webdavFS) Mkdir(_ context.Context, path string, _ os.FileMode) error { return errors.Errorf("can't create %q: read-only filesystem", path) } -func (w *webdavFS) RemoveAll(ctx context.Context, path string) error { +func (w *webdavFS) RemoveAll(_ context.Context, path string) error { return errors.Errorf("can't remove %q: read-only filesystem", path) } -func (w *webdavFS) Rename(ctx context.Context, oldPath, newPath string) error { +func (w *webdavFS) Rename(_ context.Context, oldPath, newPath string) error { return errors.Errorf("can't rename %q to %q: read-only filesystem", oldPath, newPath) } diff --git a/notification/sender/email/email_sender.go b/notification/sender/email/email_sender.go index d8364448834..f5f3aa94d67 100644 --- a/notification/sender/email/email_sender.go +++ b/notification/sender/email/email_sender.go @@ -21,7 +21,7 @@ type emailProvider struct { opt Options } -func (p *emailProvider) Send(ctx context.Context, msg *sender.Message) error { +func (p *emailProvider) Send(_ context.Context, msg *sender.Message) error { var auth smtp.Auth if p.opt.SMTPUsername != "" { diff --git a/notification/sender/email/email_sender_options.go b/notification/sender/email/email_sender_options.go index 35299470a25..e3b8fcc3367 100644 --- a/notification/sender/email/email_sender_options.go +++ b/notification/sender/email/email_sender_options.go @@ -39,7 +39,7 @@ func MergeOptions(ctx context.Context, src Options, dst *Options, isUpdate bool) } // ApplyDefaultsAndValidate applies default values and validates the configuration. -func (o *Options) ApplyDefaultsAndValidate(ctx context.Context) error { +func (o *Options) ApplyDefaultsAndValidate(_ context.Context) error { if o.SMTPPort == 0 { o.SMTPPort = defaultSMTPPort } diff --git a/notification/sender/jsonsender/jsonsender.go b/notification/sender/jsonsender/jsonsender.go index faff566af38..23191fffffd 100644 --- a/notification/sender/jsonsender/jsonsender.go +++ b/notification/sender/jsonsender/jsonsender.go @@ -18,7 +18,7 @@ type jsonSender struct { minSeverity sender.Severity } -func (p *jsonSender) Send(ctx context.Context, msg *sender.Message) error { +func (p *jsonSender) Send(_ context.Context, msg *sender.Message) error { if msg.Severity < p.minSeverity { return nil } diff --git a/notification/sender/pushover/pushover_sender_options.go b/notification/sender/pushover/pushover_sender_options.go index e6065db6856..ce5e217e7c8 100644 --- a/notification/sender/pushover/pushover_sender_options.go +++ b/notification/sender/pushover/pushover_sender_options.go @@ -18,7 +18,7 @@ type Options struct { } // ApplyDefaultsAndValidate applies default values and validates the configuration. -func (o *Options) ApplyDefaultsAndValidate(ctx context.Context) error { +func (o *Options) ApplyDefaultsAndValidate(_ context.Context) error { if o.AppToken == "" { return errors.Errorf("App Token must be provided") } diff --git a/notification/sender/webhook/webhook_sender_options.go b/notification/sender/webhook/webhook_sender_options.go index eaf616d8203..14c59a2a80d 100644 --- a/notification/sender/webhook/webhook_sender_options.go +++ b/notification/sender/webhook/webhook_sender_options.go @@ -18,7 +18,7 @@ type Options struct { } // ApplyDefaultsAndValidate applies default values and validates the configuration. -func (o *Options) ApplyDefaultsAndValidate(ctx context.Context) error { +func (o *Options) ApplyDefaultsAndValidate(_ context.Context) error { if o.Method == "" { o.Method = "POST" } diff --git a/repo/blob/b2/b2_storage.go b/repo/blob/b2/b2_storage.go index dfd9dd819ba..595f3dfacbe 100644 --- a/repo/blob/b2/b2_storage.go +++ b/repo/blob/b2/b2_storage.go @@ -32,7 +32,7 @@ type b2Storage struct { bucket *backblaze.Bucket } -func (s *b2Storage) GetBlob(ctx context.Context, id blob.ID, offset, length int64, output blob.OutputBuffer) error { +func (s *b2Storage) GetBlob(_ context.Context, id blob.ID, offset, length int64, output blob.OutputBuffer) error { fileName := s.getObjectNameString(id) if offset < 0 { @@ -87,7 +87,7 @@ func (s *b2Storage) resolveFileID(fileName string) (string, error) { return "", nil } -func (s *b2Storage) GetMetadata(ctx context.Context, id blob.ID) (blob.Metadata, error) { +func (s *b2Storage) GetMetadata(_ context.Context, id blob.ID) (blob.Metadata, error) { fileName := s.getObjectNameString(id) fileID, err := s.resolveFileID(fileName) @@ -145,7 +145,7 @@ func translateError(err error) error { return err } -func (s *b2Storage) PutBlob(ctx context.Context, id blob.ID, data blob.Bytes, opts blob.PutOptions) error { +func (s *b2Storage) PutBlob(_ context.Context, id blob.ID, data blob.Bytes, opts blob.PutOptions) error { switch { case opts.HasRetentionOptions(): return errors.Wrap(blob.ErrUnsupportedPutBlobOption, "blob-retention") @@ -175,7 +175,7 @@ func (s *b2Storage) PutBlob(ctx context.Context, id blob.ID, data blob.Bytes, op return nil } -func (s *b2Storage) DeleteBlob(ctx context.Context, id blob.ID) error { +func (s *b2Storage) DeleteBlob(_ context.Context, id blob.ID) error { _, err := s.bucket.HideFile(s.getObjectNameString(id)) err = translateError(err) @@ -191,7 +191,7 @@ func (s *b2Storage) getObjectNameString(id blob.ID) string { return s.Prefix + string(id) } -func (s *b2Storage) ListBlobs(ctx context.Context, prefix blob.ID, callback func(blob.Metadata) error) error { +func (s *b2Storage) ListBlobs(_ context.Context, prefix blob.ID, callback func(blob.Metadata) error) error { const maxFileQuery = 1000 fullPrefix := s.getObjectNameString(prefix) @@ -247,7 +247,7 @@ func (s *b2Storage) String() string { } // New creates new B2-backed storage with specified options. -func New(ctx context.Context, opt *Options, isCreate bool) (blob.Storage, error) { +func New(_ context.Context, opt *Options, isCreate bool) (blob.Storage, error) { _ = isCreate if opt.BucketName == "" { diff --git a/repo/blob/gcs/gcs_storage.go b/repo/blob/gcs/gcs_storage.go index 9ad8faa78ab..d32dc705f22 100644 --- a/repo/blob/gcs/gcs_storage.go +++ b/repo/blob/gcs/gcs_storage.go @@ -234,7 +234,7 @@ func (gcs *gcsStorage) DisplayName() string { return fmt.Sprintf("GCS: %v", gcs.BucketName) } -func (gcs *gcsStorage) Close(ctx context.Context) error { +func (gcs *gcsStorage) Close(_ context.Context) error { return errors.Wrap(gcs.storageClient.Close(), "error closing GCS storage") } diff --git a/repo/blob/gdrive/gdrive_storage.go b/repo/blob/gdrive/gdrive_storage.go index 7f4e0e1d740..a397e02fd5d 100644 --- a/repo/blob/gdrive/gdrive_storage.go +++ b/repo/blob/gdrive/gdrive_storage.go @@ -334,7 +334,7 @@ func (gdrive *gdriveStorage) DisplayName() string { return fmt.Sprintf("Google Drive: %v", gdrive.folderID) } -func (gdrive *gdriveStorage) FlushCaches(ctx context.Context) error { +func (gdrive *gdriveStorage) FlushCaches(_ context.Context) error { gdrive.fileIDCache.Clear() return nil } diff --git a/repo/blob/throttling/throttler.go b/repo/blob/throttling/throttler.go index 1fdd6ad264e..f3777bd8674 100644 --- a/repo/blob/throttling/throttler.go +++ b/repo/blob/throttling/throttler.go @@ -52,7 +52,7 @@ func (t *tokenBucketBasedThrottler) BeforeOperation(ctx context.Context, op stri } } -func (t *tokenBucketBasedThrottler) AfterOperation(ctx context.Context, op string) { +func (t *tokenBucketBasedThrottler) AfterOperation(_ context.Context, op string) { switch op { case operationListBlobs: case operationGetBlob, operationGetMetadata: diff --git a/repo/blob/throttling/token_bucket.go b/repo/blob/throttling/token_bucket.go index 47aee1e2a62..0fcffaff9d1 100644 --- a/repo/blob/throttling/token_bucket.go +++ b/repo/blob/throttling/token_bucket.go @@ -68,11 +68,11 @@ func (b *tokenBucket) Take(ctx context.Context, n float64) { } } -func (b *tokenBucket) TakeDuration(ctx context.Context, n float64) time.Duration { +func (b *tokenBucket) TakeDuration(_ context.Context, n float64) time.Duration { return b.sleepDurationBeforeTokenAreAvailable(n, b.now()) } -func (b *tokenBucket) Return(ctx context.Context, n float64) { +func (b *tokenBucket) Return(_ context.Context, n float64) { b.mu.Lock() defer b.mu.Unlock() diff --git a/repo/blob/webdav/webdav_storage.go b/repo/blob/webdav/webdav_storage.go index 94009fc6ba3..213958d0766 100644 --- a/repo/blob/webdav/webdav_storage.go +++ b/repo/blob/webdav/webdav_storage.go @@ -45,7 +45,7 @@ type davStorageImpl struct { cli *gowebdav.Client } -func (d *davStorageImpl) GetBlobFromPath(ctx context.Context, dirPath, path string, offset, length int64, output blob.OutputBuffer) error { +func (d *davStorageImpl) GetBlobFromPath(_ context.Context, dirPath, path string, offset, length int64, output blob.OutputBuffer) error { _ = dirPath output.Reset() @@ -86,7 +86,7 @@ func (d *davStorageImpl) GetBlobFromPath(ctx context.Context, dirPath, path stri return blob.EnsureLengthExactly(output.Length(), length) } -func (d *davStorageImpl) GetMetadataFromPath(ctx context.Context, dirPath, path string) (blob.Metadata, error) { +func (d *davStorageImpl) GetMetadataFromPath(_ context.Context, dirPath, path string) (blob.Metadata, error) { _ = dirPath fi, err := d.cli.Stat(path) @@ -129,7 +129,7 @@ func (d *davStorageImpl) translateError(err error) error { return err } -func (d *davStorageImpl) ReadDir(ctx context.Context, dir string) ([]os.FileInfo, error) { +func (d *davStorageImpl) ReadDir(_ context.Context, dir string) ([]os.FileInfo, error) { entries, err := d.cli.ReadDir(gowebdav.FixSlash(dir)) if err == nil { return entries, nil @@ -258,7 +258,7 @@ func isRetriable(err error) bool { } // New creates new WebDAV-backed storage in a specified URL. -func New(ctx context.Context, opts *Options, isCreate bool) (blob.Storage, error) { +func New(_ context.Context, opts *Options, isCreate bool) (blob.Storage, error) { cli := gowebdav.NewClient(opts.URL, opts.Username, opts.Password) // Since we're handling encrypted data, there's no point compressing it server-side. diff --git a/repo/caching.go b/repo/caching.go index 8aeb5ce318a..c43a85f291d 100644 --- a/repo/caching.go +++ b/repo/caching.go @@ -13,7 +13,7 @@ import ( ) // GetCachingOptions reads caching configuration for a given repository. -func GetCachingOptions(ctx context.Context, configFile string) (*content.CachingOptions, error) { +func GetCachingOptions(_ context.Context, configFile string) (*content.CachingOptions, error) { lc, err := LoadConfigFromFile(configFile) if err != nil { return nil, err diff --git a/repo/connect.go b/repo/connect.go index 48975c9586c..3827bee3b8b 100644 --- a/repo/connect.go +++ b/repo/connect.go @@ -107,7 +107,7 @@ func Disconnect(ctx context.Context, configFile string) error { } // SetClientOptions updates client options stored in the provided configuration file. -func SetClientOptions(ctx context.Context, configFile string, cliOpt ClientOptions) error { +func SetClientOptions(_ context.Context, configFile string, cliOpt ClientOptions) error { lc, err := LoadConfigFromFile(configFile) if err != nil { return err diff --git a/repo/content/committed_content_index_disk_cache.go b/repo/content/committed_content_index_disk_cache.go index 0ea6fdfff9a..cdddca03373 100644 --- a/repo/content/committed_content_index_disk_cache.go +++ b/repo/content/committed_content_index_disk_cache.go @@ -33,7 +33,7 @@ func (c *diskCommittedContentIndexCache) indexBlobPath(indexBlobID blob.ID) stri return filepath.Join(c.dirname, string(indexBlobID)+simpleIndexSuffix) } -func (c *diskCommittedContentIndexCache) openIndex(ctx context.Context, indexBlobID blob.ID) (index.Index, error) { +func (c *diskCommittedContentIndexCache) openIndex(_ context.Context, indexBlobID blob.ID) (index.Index, error) { fullpath := c.indexBlobPath(indexBlobID) f, closeMmap, err := c.mmapOpenWithRetry(fullpath) @@ -96,7 +96,7 @@ func (c *diskCommittedContentIndexCache) mmapOpenWithRetry(path string) (mmap.MM }, nil } -func (c *diskCommittedContentIndexCache) hasIndexBlobID(ctx context.Context, indexBlobID blob.ID) (bool, error) { +func (c *diskCommittedContentIndexCache) hasIndexBlobID(_ context.Context, indexBlobID blob.ID) (bool, error) { _, err := os.Stat(c.indexBlobPath(indexBlobID)) if err == nil { return true, nil @@ -165,7 +165,7 @@ func writeTempFileAtomic(dirname string, data []byte) (string, error) { return tf.Name(), nil } -func (c *diskCommittedContentIndexCache) expireUnused(ctx context.Context, used []blob.ID) error { +func (c *diskCommittedContentIndexCache) expireUnused(_ context.Context, used []blob.ID) error { c.log.Debugw("expireUnused", "except", used, "minSweepAge", c.minSweepAge) diff --git a/repo/content/committed_content_index_mem_cache.go b/repo/content/committed_content_index_mem_cache.go index 2a889d290fa..8416adfb957 100644 --- a/repo/content/committed_content_index_mem_cache.go +++ b/repo/content/committed_content_index_mem_cache.go @@ -20,14 +20,14 @@ type memoryCommittedContentIndexCache struct { v1PerContentOverhead func() int // +checklocksignore } -func (m *memoryCommittedContentIndexCache) hasIndexBlobID(ctx context.Context, indexBlobID blob.ID) (bool, error) { +func (m *memoryCommittedContentIndexCache) hasIndexBlobID(_ context.Context, indexBlobID blob.ID) (bool, error) { m.mu.Lock() defer m.mu.Unlock() return m.contents[indexBlobID] != nil, nil } -func (m *memoryCommittedContentIndexCache) addContentToCache(ctx context.Context, indexBlobID blob.ID, data gather.Bytes) error { +func (m *memoryCommittedContentIndexCache) addContentToCache(_ context.Context, indexBlobID blob.ID, data gather.Bytes) error { m.mu.Lock() defer m.mu.Unlock() @@ -41,7 +41,7 @@ func (m *memoryCommittedContentIndexCache) addContentToCache(ctx context.Context return nil } -func (m *memoryCommittedContentIndexCache) openIndex(ctx context.Context, indexBlobID blob.ID) (index.Index, error) { +func (m *memoryCommittedContentIndexCache) openIndex(_ context.Context, indexBlobID blob.ID) (index.Index, error) { m.mu.Lock() defer m.mu.Unlock() @@ -53,7 +53,7 @@ func (m *memoryCommittedContentIndexCache) openIndex(ctx context.Context, indexB return v, nil } -func (m *memoryCommittedContentIndexCache) expireUnused(ctx context.Context, used []blob.ID) error { +func (m *memoryCommittedContentIndexCache) expireUnused(_ context.Context, used []blob.ID) error { m.mu.Lock() defer m.mu.Unlock() diff --git a/repo/content/content_manager.go b/repo/content/content_manager.go index 3f41c5c87de..1a42460dbbc 100644 --- a/repo/content/content_manager.go +++ b/repo/content/content_manager.go @@ -987,7 +987,7 @@ type SessionOptions struct { } // NewWriteManager returns a session write manager. -func NewWriteManager(ctx context.Context, sm *SharedManager, options SessionOptions, writeManagerID string) *WriteManager { +func NewWriteManager(_ context.Context, sm *SharedManager, options SessionOptions, writeManagerID string) *WriteManager { if options.OnUpload == nil { options.OnUpload = func(int64) {} } diff --git a/repo/format/content_format.go b/repo/format/content_format.go index fc964a174c9..cb0845fd934 100644 --- a/repo/format/content_format.go +++ b/repo/format/content_format.go @@ -46,7 +46,7 @@ func (f *ContentFormat) ResolveFormatVersion() error { } // GetMutableParameters implements FormattingOptionsProvider. -func (f *ContentFormat) GetMutableParameters(ctx context.Context) (MutableParameters, error) { +func (f *ContentFormat) GetMutableParameters(_ context.Context) (MutableParameters, error) { return f.MutableParameters, nil } diff --git a/repo/format/format_blob_cache.go b/repo/format/format_blob_cache.go index bd2ac70e72f..c76d90b9fba 100644 --- a/repo/format/format_blob_cache.go +++ b/repo/format/format_blob_cache.go @@ -56,7 +56,7 @@ type inMemoryCache struct { times map[blob.ID]time.Time } -func (c *inMemoryCache) Get(ctx context.Context, blobID blob.ID) ([]byte, time.Time, bool) { +func (c *inMemoryCache) Get(_ context.Context, blobID blob.ID) ([]byte, time.Time, bool) { c.mu.Lock() defer c.mu.Unlock() @@ -68,7 +68,7 @@ func (c *inMemoryCache) Get(ctx context.Context, blobID blob.ID) ([]byte, time.T return nil, time.Time{}, false } -func (c *inMemoryCache) Put(ctx context.Context, blobID blob.ID, data []byte) (time.Time, error) { +func (c *inMemoryCache) Put(_ context.Context, blobID blob.ID, data []byte) (time.Time, error) { c.mu.Lock() defer c.mu.Unlock() @@ -78,7 +78,7 @@ func (c *inMemoryCache) Put(ctx context.Context, blobID blob.ID, data []byte) (t return c.times[blobID], nil } -func (c *inMemoryCache) Remove(ctx context.Context, ids []blob.ID) { +func (c *inMemoryCache) Remove(_ context.Context, ids []blob.ID) { c.mu.Lock() defer c.mu.Unlock() @@ -92,7 +92,7 @@ type onDiskCache struct { cacheDirectory string } -func (c *onDiskCache) Get(ctx context.Context, blobID blob.ID) ([]byte, time.Time, bool) { +func (c *onDiskCache) Get(_ context.Context, blobID blob.ID) ([]byte, time.Time, bool) { cachedFile := filepath.Join(c.cacheDirectory, string(blobID)) cst, err := os.Stat(cachedFile) @@ -108,7 +108,7 @@ func (c *onDiskCache) Get(ctx context.Context, blobID blob.ID) ([]byte, time.Tim return data, cacheMTime, err == nil } -func (c *onDiskCache) Put(ctx context.Context, blobID blob.ID, data []byte) (time.Time, error) { +func (c *onDiskCache) Put(_ context.Context, blobID blob.ID, data []byte) (time.Time, error) { cachedFile := filepath.Join(c.cacheDirectory, string(blobID)) // optimistically assume cache directory exist, create it if not diff --git a/repo/format/format_provider.go b/repo/format/format_provider.go index f48baa5e276..eff3520ccb6 100644 --- a/repo/format/format_provider.go +++ b/repo/format/format_provider.go @@ -152,7 +152,7 @@ func (f *formattingOptionsProvider) HashFunc() hashing.HashFunc { return f.h } -func (f *formattingOptionsProvider) RepositoryFormatBytes(ctx context.Context) ([]byte, error) { +func (f *formattingOptionsProvider) RepositoryFormatBytes(_ context.Context) ([]byte, error) { if f.SupportsPasswordChange() { return nil, nil } diff --git a/repo/grpc_repository_client.go b/repo/grpc_repository_client.go index 3ff826393b4..82d49a9c5bd 100644 --- a/repo/grpc_repository_client.go +++ b/repo/grpc_repository_client.go @@ -504,7 +504,7 @@ func (r *grpcRepositoryClient) Time() time.Time { return clock.Now() } -func (r *grpcRepositoryClient) Refresh(ctx context.Context) error { +func (r *grpcRepositoryClient) Refresh(_ context.Context) error { return nil } @@ -830,7 +830,7 @@ type grpcCreds struct { password string } -func (c grpcCreds) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { +func (c grpcCreds) GetRequestMetadata(_ context.Context, uri ...string) (map[string]string, error) { _ = uri return map[string]string{ @@ -879,7 +879,7 @@ func openGRPCAPIRepository(ctx context.Context, si *APIServerInfo, password stri } par.registerEarlyCloseFunc( - func(ctx context.Context) error { + func(_ context.Context) error { return errors.Wrap(conn.Close(), "error closing GRPC connection") }) diff --git a/repo/manifest/manifest_manager.go b/repo/manifest/manifest_manager.go index a90c1dbb5f3..445a3fd3800 100644 --- a/repo/manifest/manifest_manager.go +++ b/repo/manifest/manifest_manager.go @@ -68,7 +68,7 @@ type Manager struct { } // Put serializes the provided payload to JSON and persists it. Returns unique identifier that represents the manifest. -func (m *Manager) Put(ctx context.Context, labels map[string]string, payload interface{}) (ID, error) { +func (m *Manager) Put(_ context.Context, labels map[string]string, payload interface{}) (ID, error) { if labels[TypeLabelKey] == "" { return "", errors.New("'type' label is required") } @@ -294,7 +294,7 @@ type ManagerOptions struct { } // NewManager returns new manifest manager for the provided content manager. -func NewManager(ctx context.Context, b contentManager, options ManagerOptions, mr *metrics.Registry) (*Manager, error) { +func NewManager(_ context.Context, b contentManager, options ManagerOptions, mr *metrics.Registry) (*Manager, error) { _ = mr timeNow := options.TimeNow diff --git a/repo/object/object_manager.go b/repo/object/object_manager.go index 58e01b3c91e..a089d6ea0b1 100644 --- a/repo/object/object_manager.go +++ b/repo/object/object_manager.go @@ -214,7 +214,7 @@ func PrefetchBackingContents(ctx context.Context, contentMgr contentManager, obj } // NewObjectManager creates an ObjectManager with the specified content manager and format. -func NewObjectManager(ctx context.Context, bm contentManager, f format.ObjectFormat, mr *metrics.Registry) (*Manager, error) { +func NewObjectManager(_ context.Context, bm contentManager, f format.ObjectFormat, mr *metrics.Registry) (*Manager, error) { _ = mr om := &Manager{ diff --git a/repo/open.go b/repo/open.go index 137cd984ad2..f8ad278b554 100644 --- a/repo/open.go +++ b/repo/open.go @@ -403,7 +403,7 @@ func wrapLockingStorage(st blob.Storage, r format.BlobStorageConfiguration) blob // collect prefixes that need to be locked on put prefixes := GetLockingStoragePrefixes() - return beforeop.NewWrapper(st, nil, nil, nil, func(ctx context.Context, id blob.ID, opts *blob.PutOptions) error { + return beforeop.NewWrapper(st, nil, nil, nil, func(_ context.Context, id blob.ID, opts *blob.PutOptions) error { for _, prefix := range prefixes { if strings.HasPrefix(string(id), prefix) { opts.RetentionMode = r.RetentionMode diff --git a/snapshot/restore/local_fs_output.go b/snapshot/restore/local_fs_output.go index 32b356c785d..9b9c576a09e 100644 --- a/snapshot/restore/local_fs_output.go +++ b/snapshot/restore/local_fs_output.go @@ -142,7 +142,7 @@ func (o *FilesystemOutput) BeginDirectory(ctx context.Context, relativePath stri } // FinishDirectory implements restore.Output interface. -func (o *FilesystemOutput) FinishDirectory(ctx context.Context, relativePath string, e fs.Directory) error { +func (o *FilesystemOutput) FinishDirectory(_ context.Context, relativePath string, e fs.Directory) error { path := filepath.Join(o.TargetPath, filepath.FromSlash(relativePath)) if err := o.setAttributes(path, e, os.FileMode(0)); err != nil { return errors.Wrap(err, "error setting attributes") @@ -159,7 +159,7 @@ func (o *FilesystemOutput) WriteDirEntry(ctx context.Context, relativePath strin } // Close implements restore.Output interface. -func (o *FilesystemOutput) Close(ctx context.Context) error { +func (o *FilesystemOutput) Close(_ context.Context) error { return nil } @@ -180,7 +180,7 @@ func (o *FilesystemOutput) WriteFile(ctx context.Context, relativePath string, f } // FileExists implements restore.Output interface. -func (o *FilesystemOutput) FileExists(ctx context.Context, relativePath string, e fs.File) bool { +func (o *FilesystemOutput) FileExists(_ context.Context, relativePath string, e fs.File) bool { st, err := os.Lstat(filepath.Join(o.TargetPath, relativePath)) if err != nil { return false diff --git a/snapshot/restore/tar_output.go b/snapshot/restore/tar_output.go index f7909e73f66..e8c147b7af3 100644 --- a/snapshot/restore/tar_output.go +++ b/snapshot/restore/tar_output.go @@ -23,7 +23,7 @@ func (o *TarOutput) Parallelizable() bool { } // BeginDirectory implements restore.Output interface. -func (o *TarOutput) BeginDirectory(ctx context.Context, relativePath string, d fs.Directory) error { +func (o *TarOutput) BeginDirectory(_ context.Context, relativePath string, d fs.Directory) error { if relativePath == "" { return nil } @@ -59,7 +59,7 @@ func (o *TarOutput) WriteDirEntry(ctx context.Context, relativePath string, de * } // Close implements restore.Output interface. -func (o *TarOutput) Close(ctx context.Context) error { +func (o *TarOutput) Close(_ context.Context) error { if err := o.tf.Close(); err != nil { return errors.Wrap(err, "error closing tar") } diff --git a/snapshot/restore/zip_output.go b/snapshot/restore/zip_output.go index 232b0bda19e..467d0d4bbeb 100644 --- a/snapshot/restore/zip_output.go +++ b/snapshot/restore/zip_output.go @@ -45,7 +45,7 @@ func (o *ZipOutput) WriteDirEntry(ctx context.Context, relativePath string, de * } // Close implements restore.Output interface. -func (o *ZipOutput) Close(ctx context.Context) error { +func (o *ZipOutput) Close(_ context.Context) error { if err := o.zf.Close(); err != nil { return errors.Wrap(err, "error closing zip") } diff --git a/snapshot/snapshotfs/repofs.go b/snapshot/snapshotfs/repofs.go index 53dda798c16..bc107436398 100644 --- a/snapshot/snapshotfs/repofs.go +++ b/snapshot/snapshotfs/repofs.go @@ -233,7 +233,7 @@ func (rsl *repositorySymlink) Readlink(ctx context.Context) (string, error) { return string(b), nil } -func (rsl *repositorySymlink) Resolve(ctx context.Context) (fs.Entry, error) { +func (rsl *repositorySymlink) Resolve(_ context.Context) (fs.Entry, error) { return nil, errors.New("Symlink.Resolve not implemented in Repofs") } diff --git a/snapshot/snapshotfs/snapshot_verifier.go b/snapshot/snapshotfs/snapshot_verifier.go index 1e95dd0136c..5ce5cd54cb1 100644 --- a/snapshot/snapshotfs/snapshot_verifier.go +++ b/snapshot/snapshotfs/snapshot_verifier.go @@ -178,7 +178,7 @@ func (v *Verifier) InParallel(ctx context.Context, enqueue func(tw *TreeWalker) } // NewVerifier creates a verifier. -func NewVerifier(ctx context.Context, rep repo.Repository, opts VerifierOptions) *Verifier { +func NewVerifier(_ context.Context, rep repo.Repository, opts VerifierOptions) *Verifier { if opts.Parallelism == 0 { opts.Parallelism = runtime.NumCPU() } diff --git a/snapshot/upload/upload.go b/snapshot/upload/upload.go index ed39557ff80..ecf694285ed 100644 --- a/snapshot/upload/upload.go +++ b/snapshot/upload/upload.go @@ -1359,7 +1359,7 @@ func (u *Uploader) wrapIgnorefs(logger logging.Logger, entry fs.Directory, polic return entry } - return ignorefs.New(entry, policyTree, ignorefs.ReportIgnoredFiles(func(ctx context.Context, fname string, md fs.Entry, policyTree *policy.Tree) { + return ignorefs.New(entry, policyTree, ignorefs.ReportIgnoredFiles(func(_ context.Context, fname string, md fs.Entry, policyTree *policy.Tree) { if md.IsDir() { maybeLogEntryProcessed( logger, From 1aa4e85822cdd5db7684bdf66cc0986661358b2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 21:03:55 -0700 Subject: [PATCH 083/206] build(deps): bump the common-golang-dependencies group with 4 updates (#4532) Bumps the common-golang-dependencies group with 4 updates: [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go), [github.com/Azure/azure-sdk-for-go/sdk/storage/azblob](https://github.com/Azure/azure-sdk-for-go), [github.com/minio/minio-go/v7](https://github.com/minio/minio-go) and [google.golang.org/api](https://github.com/googleapis/google-api-go-client). Updates `cloud.google.com/go/storage` from 1.51.0 to 1.52.0 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.51.0...spanner/v1.52.0) Updates `github.com/Azure/azure-sdk-for-go/sdk/storage/azblob` from 1.6.0 to 1.6.1 - [Release notes](https://github.com/Azure/azure-sdk-for-go/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md) - [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azcore/v1.6.0...sdk/azcore/v1.6.1) Updates `github.com/minio/minio-go/v7` from 7.0.90 to 7.0.91 - [Release notes](https://github.com/minio/minio-go/releases) - [Commits](https://github.com/minio/minio-go/compare/v7.0.90...v7.0.91) Updates `google.golang.org/api` from 0.229.0 to 0.230.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.229.0...v0.230.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/storage dependency-version: 1.52.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: github.com/Azure/azure-sdk-for-go/sdk/storage/azblob dependency-version: 1.6.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies - dependency-name: github.com/minio/minio-go/v7 dependency-version: 7.0.91 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies - dependency-name: google.golang.org/api dependency-version: 0.230.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 18 +++++++++--------- go.sum | 48 ++++++++++++++++++++++++------------------------ 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index e54cd89585e..38c3c8a8f16 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,10 @@ go 1.23.0 toolchain go1.23.8 require ( - cloud.google.com/go/storage v1.51.0 + cloud.google.com/go/storage v1.52.0 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 github.com/alecthomas/kingpin/v2 v2.4.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 github.com/chmduquesne/rollinghash v4.0.0+incompatible @@ -34,7 +34,7 @@ require ( github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 - github.com/minio/minio-go/v7 v7.0.90 + github.com/minio/minio-go/v7 v7.0.91 github.com/mocktools/go-smtp-mock/v2 v2.4.0 github.com/mxk/go-vss v1.2.0 github.com/natefinch/atomic v1.0.1 @@ -67,7 +67,7 @@ require ( golang.org/x/sys v0.32.0 golang.org/x/term v0.31.0 golang.org/x/text v0.24.0 - google.golang.org/api v0.229.0 + google.golang.org/api v0.230.0 google.golang.org/grpc v1.72.0 google.golang.org/protobuf v1.36.6 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 @@ -76,16 +76,16 @@ require ( require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect cel.dev/expr v0.20.0 // indirect - cloud.google.com/go v0.118.3 // indirect + cloud.google.com/go v0.120.0 // indirect cloud.google.com/go/auth v0.16.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.4.1 // indirect + cloud.google.com/go/iam v1.5.0 // indirect cloud.google.com/go/monitoring v1.24.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -135,7 +135,7 @@ require ( github.com/xhit/go-str2duration/v2 v2.1.0 // indirect github.com/zeebo/errs v1.4.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect @@ -145,7 +145,7 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/time v0.11.0 // indirect google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index d4e2e5a3028..6f601db0de2 100644 --- a/go.sum +++ b/go.sum @@ -2,24 +2,24 @@ al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXy al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI= cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= -cloud.google.com/go v0.118.3 h1:jsypSnrE/w4mJysioGdMBg4MiW/hHx/sArFpaBWHdME= -cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc= +cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA= +cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= cloud.google.com/go/auth v0.16.0 h1:Pd8P1s9WkcrBE2n/PhAwKsdrR35V3Sg2II9B+ndM3CU= cloud.google.com/go/auth v0.16.0/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= -cloud.google.com/go/iam v1.4.1 h1:cFC25Nv+u5BkTR/BT1tXdoF2daiVbZ1RLx2eqfQ9RMM= -cloud.google.com/go/iam v1.4.1/go.mod h1:2vUEJpUG3Q9p2UdsyksaKpDzlwOrnMzS30isdReIcLM= +cloud.google.com/go/iam v1.5.0 h1:QlLcVMhbLGOjRcGe6VTGGTyQib8dRLK2B/kYNV0+2xs= +cloud.google.com/go/iam v1.5.0/go.mod h1:U+DOtKQltF/LxPEtcDLoobcsZMilSRwR7mgNL7knOpo= cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= -cloud.google.com/go/longrunning v0.6.5 h1:sD+t8DO8j4HKW4QfouCklg7ZC1qC4uzVZt8iz3uTW+Q= -cloud.google.com/go/longrunning v0.6.5/go.mod h1:Et04XK+0TTLKa5IPYryKf5DkpwImy6TluQ1QTLwlKmY= +cloud.google.com/go/longrunning v0.6.6 h1:XJNDo5MUfMM05xK3ewpbSdmt7R2Zw+aQEMbdQR65Rbw= +cloud.google.com/go/longrunning v0.6.6/go.mod h1:hyeGJUrPHcx0u2Uu1UFSoYZLn4lkMrccJig0t4FI7yw= cloud.google.com/go/monitoring v1.24.0 h1:csSKiCJ+WVRgNkRzzz3BPoGjFhjPY23ZTcaenToJxMM= cloud.google.com/go/monitoring v1.24.0/go.mod h1:Bd1PRK5bmQBQNnuGwHBfUamAV1ys9049oEPHnn4pcsc= -cloud.google.com/go/storage v1.51.0 h1:ZVZ11zCiD7b3k+cH5lQs/qcNaoSz3U9I0jgwVzqDlCw= -cloud.google.com/go/storage v1.51.0/go.mod h1:YEJfu/Ki3i5oHC/7jyTgsGZwdQ8P9hqMqvpi5kRKGgc= +cloud.google.com/go/storage v1.52.0 h1:ROpzMW/IwipKtatA69ikxibdzQSiXJrY9f6IgBa9AlA= +cloud.google.com/go/storage v1.52.0/go.mod h1:4wrBAbAYUvYkbrf19ahGm4I5kDQhESSqN3CGEkMGvOY= cloud.google.com/go/trace v1.11.3 h1:c+I4YFjxRQjvAhRmSsmjpASUKq88chOX854ied0K/pE= cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= @@ -30,10 +30,10 @@ github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+ github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 h1:UXT0o77lXQrikd1kgwIPQOUect7EoR/+sbP4wQKdzxM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0/go.mod h1:cTvi54pg19DoT07ekoeMgE/taAwNtCShVeZqA+Iv2xI= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.0 h1:LR0kAX9ykz8G4YgLCaRDVJ3+n43R8MneB5dTy2konZo= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.0/go.mod h1:DWAciXemNf++PQJLeXUB4HHH5OpsAh12HZnu2wXE1jA= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 h1:lhZdRq7TIx0GJQvSyX2Si406vrYsov2FXGp/RnSEtcs= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1/go.mod h1:8cl44BDmi+effbARHMQjgOKA2AYvcohNm7KEt42mSV8= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= @@ -41,8 +41,8 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83 github.com/GehirnInc/crypt v0.0.0-20190301055215-6c0105aabd46/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo= github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 h1:IEjq88XO4PuBDcvmjQJcQGg+w+UaafSy8G5Kcb5tBhI= github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5/go.mod h1:exZ0C/1emQJAw5tHOaUDyY1ycttqBAPcxuzf7QbY6ec= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 h1:f2Qw/Ehhimh5uO1fayV0QIW7DShEQqhtUfhYc+cBPlw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0/go.mod h1:2bIszWvQRlJVmJLiuLhukLImRjKPcYdzzsx6darK02A= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= @@ -208,8 +208,8 @@ github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.90 h1:TmSj1083wtAD0kEYTx7a5pFsv3iRYMsOJ6A4crjA1lE= -github.com/minio/minio-go/v7 v7.0.90/go.mod h1:uvMUcGrpgeSAAI6+sD3818508nUyMULw94j2Nxku/Go= +github.com/minio/minio-go/v7 v7.0.91 h1:tWLZnEfo3OZl5PoXQwcwTAPNNrjyWwOh6cbZitW5JQc= +github.com/minio/minio-go/v7 v7.0.91/go.mod h1:uvMUcGrpgeSAAI6+sD3818508nUyMULw94j2Nxku/Go= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/mocktools/go-smtp-mock/v2 v2.4.0 h1:u0ky0iyNW/LEMKAFRTsDivHyP8dHYxe/cV3FZC3rRjo= @@ -294,8 +294,8 @@ github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0 h1:JRxssobiPg23otYU5SbWtQC//snGVIM3Tx6QRzlQBao= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= @@ -306,8 +306,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0f go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 h1:m639+BofXTvcY1q8CGs4ItwQarYtJPOWmVobfM1HpVI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0/go.mod h1:LjReUci/F4BUyv+y4dwnq3h/26iNOeC3wAIqgvTIZVo= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0 h1:PB3Zrjs1sG1GBX51SXyTSoOTqcDglmsk7nT6tkKPb/k= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0/go.mod h1:U2R3XyVPzn0WX7wOIypPuptulsMcPDPs/oiSVOMVnHY= go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= @@ -413,12 +413,12 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.229.0 h1:p98ymMtqeJ5i3lIBMj5MpR9kzIIgzpHHh8vQ+vgAzx8= -google.golang.org/api v0.229.0/go.mod h1:wyDfmq5g1wYJWn29O22FDWN48P7Xcz0xz+LBpptYvB0= +google.golang.org/api v0.230.0 h1:2u1hni3E+UXAXrONrrkfWpi/V6cyKVAbfGVeGtC3OxM= +google.golang.org/api v0.230.0/go.mod h1:aqvtoMk7YkiXx+6U12arQFExiRV9D/ekvMCwCd/TksQ= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= -google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= -google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= +google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e h1:UdXH7Kzbj+Vzastr5nVfccbmFsmYNygVLSPk1pEfDoY= +google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e/go.mod h1:085qFyf2+XaZlRdCgKNCIZ3afY2p4HHZdoIRpId8F4A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e h1:ztQaXfzEXTmCBvbtWYRhJxW+0iJcz2qXfd38/e9l7bA= google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= From 2d9b7f1e336b812838918014d87e2cb404cbff23 Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Tue, 29 Apr 2025 23:47:41 -0700 Subject: [PATCH 084/206] feat(providers): Azure Blob client certificate authentication (#4535) Allow the use of a client certificate when authenticating to an Azure Blob storage provider. Tests included. Credit: @DeepikaDixit Authored-by: Deepika Dixit --- cli/storage_azure.go | 1 + repo/blob/azure/azure_options.go | 3 + repo/blob/azure/azure_storage.go | 86 ++++++++++++++++----------- repo/blob/azure/azure_storage_test.go | 39 ++++++++++++ 4 files changed, 94 insertions(+), 35 deletions(-) diff --git a/cli/storage_azure.go b/cli/storage_azure.go index b5f0803b821..64b9ba7a30d 100644 --- a/cli/storage_azure.go +++ b/cli/storage_azure.go @@ -25,6 +25,7 @@ func (c *storageAzureFlags) Setup(svc StorageProviderServices, cmd *kingpin.CmdC cmd.Flag("tenant-id", "Azure service principle tenant ID (overrides AZURE_TENANT_ID environment variable)").Envar(svc.EnvName("AZURE_TENANT_ID")).StringVar(&c.azOptions.TenantID) cmd.Flag("client-id", "Azure service principle client ID (overrides AZURE_CLIENT_ID environment variable)").Envar(svc.EnvName("AZURE_CLIENT_ID")).StringVar(&c.azOptions.ClientID) cmd.Flag("client-secret", "Azure service principle client secret (overrides AZURE_CLIENT_SECRET environment variable)").Envar(svc.EnvName("AZURE_CLIENT_SECRET")).StringVar(&c.azOptions.ClientSecret) + cmd.Flag("client-cert", "Azure client certificate (overrides AZURE_CLIENT_CERT environment variable)").Envar(svc.EnvName("AZURE_CLIENT_CERT")).StringVar(&c.azOptions.ClientCert) commonThrottlingFlags(cmd, &c.azOptions.Limits) diff --git a/repo/blob/azure/azure_options.go b/repo/blob/azure/azure_options.go index 80d11a504af..34f7335568c 100644 --- a/repo/blob/azure/azure_options.go +++ b/repo/blob/azure/azure_options.go @@ -28,6 +28,9 @@ type Options struct { ClientID string ClientSecret string + // ClientCert are used for creating ClientCertificateCredentials + ClientCert string + StorageDomain string `json:"storageDomain,omitempty"` throttling.Limits diff --git a/repo/blob/azure/azure_storage.go b/repo/blob/azure/azure_storage.go index 4c4379acf37..85599a2e3cd 100644 --- a/repo/blob/azure/azure_storage.go +++ b/repo/blob/azure/azure_storage.go @@ -365,11 +365,6 @@ func New(ctx context.Context, opt *Options, isCreate bool) (blob.Storage, error) return nil, errors.New("container name must be specified") } - var ( - service *azblob.Client - serviceErr error - ) - storageDomain := opt.StorageDomain if storageDomain == "" { storageDomain = "blob.core.windows.net" @@ -377,36 +372,7 @@ func New(ctx context.Context, opt *Options, isCreate bool) (blob.Storage, error) storageHostname := fmt.Sprintf("%v.%v", opt.StorageAccount, storageDomain) - switch { - // shared access signature - case opt.SASToken != "": - service, serviceErr = azblob.NewClientWithNoCredential( - fmt.Sprintf("https://%s?%s", storageHostname, opt.SASToken), nil) - - // storage account access key - case opt.StorageKey != "": - // create a credentials object. - cred, err := azblob.NewSharedKeyCredential(opt.StorageAccount, opt.StorageKey) - if err != nil { - return nil, errors.Wrap(err, "unable to initialize storage access key credentials") - } - - service, serviceErr = azblob.NewClientWithSharedKeyCredential( - fmt.Sprintf("https://%s/", storageHostname), cred, nil, - ) - // client secret - case opt.TenantID != "" && opt.ClientID != "" && opt.ClientSecret != "": - cred, err := azidentity.NewClientSecretCredential(opt.TenantID, opt.ClientID, opt.ClientSecret, nil) - if err != nil { - return nil, errors.Wrap(err, "unable to initialize client secret credential") - } - - service, serviceErr = azblob.NewClient(fmt.Sprintf("https://%s/", storageHostname), cred, nil) - - default: - return nil, errors.New("one of the storage key, SAS token or client secret must be provided") - } - + service, serviceErr := getAZService(opt, storageHostname) if serviceErr != nil { return nil, errors.Wrap(serviceErr, "opening azure service") } @@ -437,6 +403,56 @@ func New(ctx context.Context, opt *Options, isCreate bool) (blob.Storage, error) return az, nil } +func getAZService(opt *Options, storageHostname string) (*azblob.Client, error) { + var ( + service *azblob.Client + serviceErr error + ) + + switch { + // shared access signature + case opt.SASToken != "": + service, serviceErr = azblob.NewClientWithNoCredential( + fmt.Sprintf("https://%s?%s", storageHostname, opt.SASToken), nil) + // storage account access key + case opt.StorageKey != "": + // create a credentials object. + cred, err := azblob.NewSharedKeyCredential(opt.StorageAccount, opt.StorageKey) + if err != nil { + return nil, errors.Wrap(err, "unable to initialize storage access key credentials") + } + + service, serviceErr = azblob.NewClientWithSharedKeyCredential( + fmt.Sprintf("https://%s/", storageHostname), cred, nil, + ) + // client secret + case opt.TenantID != "" && opt.ClientID != "" && opt.ClientSecret != "": + cred, err := azidentity.NewClientSecretCredential(opt.TenantID, opt.ClientID, opt.ClientSecret, nil) + if err != nil { + return nil, errors.Wrap(err, "unable to initialize client secret credential") + } + + service, serviceErr = azblob.NewClient(fmt.Sprintf("https://%s/", storageHostname), cred, nil) + // client certificate + case opt.TenantID != "" && opt.ClientID != "" && opt.ClientCert != "": + certs, key, certErr := azidentity.ParseCertificates([]byte(opt.ClientCert), nil) + if certErr != nil { + return nil, errors.Wrap(certErr, "failed to read client cert") + } + + cred, credErr := azidentity.NewClientCertificateCredential(opt.TenantID, opt.ClientID, certs, key, nil) + if credErr != nil { + return nil, errors.Wrap(credErr, "unable to initialize client cert credential") + } + + service, serviceErr = azblob.NewClient(fmt.Sprintf("https://%s/", storageHostname), cred, nil) + default: + return nil, errors.New("one of the storage key, SAS token, client secret or client certificate must be provided") + } + + return service, errors.Wrap(serviceErr, "unable to create azure client") +} + func init() { blob.AddSupportedStorage(azStorageType, Options{}, New) } diff --git a/repo/blob/azure/azure_storage_test.go b/repo/blob/azure/azure_storage_test.go index c12909c6c38..47d49778c2a 100644 --- a/repo/blob/azure/azure_storage_test.go +++ b/repo/blob/azure/azure_storage_test.go @@ -33,6 +33,7 @@ const ( testStorageTenantIDEnv = "KOPIA_AZURE_TEST_TENANT_ID" testStorageClientIDEnv = "KOPIA_AZURE_TEST_CLIENT_ID" testStorageClientSecretEnv = "KOPIA_AZURE_TEST_CLIENT_SECRET" + testStorageClientCertEnv = "KOPIA_AZURE_TEST_CLIENT_CERT" ) func getEnvOrSkip(t *testing.T, name string) string { @@ -201,6 +202,44 @@ func TestAzureStorageClientSecret(t *testing.T) { require.NoError(t, providervalidation.ValidateProvider(ctx, st, blobtesting.TestValidationOptions)) } +func TestAzureStorageClientCertificate(t *testing.T) { + t.Parallel() + testutil.ProviderTest(t) + + container := getEnvOrSkip(t, testContainerEnv) + storageAccount := getEnvOrSkip(t, testStorageAccountEnv) + tenantID := getEnvOrSkip(t, testStorageTenantIDEnv) + clientID := getEnvOrSkip(t, testStorageClientIDEnv) + clientCert := getEnvOrSkip(t, testStorageClientCertEnv) + + data := make([]byte, 8) + rand.Read(data) + + ctx := testlogging.Context(t) + + // use context that gets canceled after storage is initialize, + // to verify we do not depend on the original context past initialization. + newctx, cancel := context.WithCancel(ctx) + st, err := azure.New(newctx, &azure.Options{ + Container: container, + StorageAccount: storageAccount, + TenantID: tenantID, + ClientID: clientID, + ClientCert: clientCert, + Prefix: fmt.Sprintf("sastest-%v-%x/", clock.Now().Unix(), data), + }, false) + + require.NoError(t, err) + cancel() + + defer st.Close(ctx) + defer blobtesting.CleanupOldData(ctx, t, st, 0) + + blobtesting.VerifyStorage(ctx, t, st, blob.PutOptions{}) + blobtesting.AssertConnectionInfoRoundTrips(ctx, t, st) + require.NoError(t, providervalidation.ValidateProvider(ctx, st, blobtesting.TestValidationOptions)) +} + func TestAzureStorageInvalidBlob(t *testing.T) { testutil.ProviderTest(t) From 562b81a28ddc760b3cd68bc8e36b3a5cfcda6a10 Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Wed, 30 Apr 2025 00:04:07 -0700 Subject: [PATCH 085/206] fix(general): avoid removing error cause (#4536) Credit: @alexvbg Aleksandr Samarin Authored-by: Aleksandr Samarin --- snapshot/upload/upload.go | 5 ++- snapshot/upload/upload_test.go | 63 ++++++++++++++++------------------ 2 files changed, 32 insertions(+), 36 deletions(-) diff --git a/snapshot/upload/upload.go b/snapshot/upload/upload.go index ecf694285ed..3dd8f0f3e0c 100644 --- a/snapshot/upload/upload.go +++ b/snapshot/upload/upload.go @@ -1203,9 +1203,8 @@ func (u *Uploader) reportErrorAndMaybeCancel(err error, isIgnored bool, dmb *sna atomic.AddInt32(&u.stats.ErrorCount, 1) } - rc := rootCauseError(err) - u.Progress.Error(entryRelativePath, rc, isIgnored) - dmb.AddFailedEntry(entryRelativePath, isIgnored, rc) + u.Progress.Error(entryRelativePath, err, isIgnored) + dmb.AddFailedEntry(entryRelativePath, isIgnored, err) if u.FailFast && !isIgnored { u.Cancel() diff --git a/snapshot/upload/upload_test.go b/snapshot/upload/upload_test.go index 4945daccd25..49b3dc7a299 100644 --- a/snapshot/upload/upload_test.go +++ b/snapshot/upload/upload_test.go @@ -18,7 +18,6 @@ import ( "testing" "time" - "github.com/kylelemons/godebug/pretty" "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -62,6 +61,8 @@ type uploadTestHarness struct { var errTest = errors.New("test error") +type entryPathToError = map[string]error + func (th *uploadTestHarness) cleanup() { os.RemoveAll(th.repoDir) } @@ -420,11 +421,9 @@ func TestUpload_SubDirectoryReadFailureFailFast(t *testing.T) { require.NotEmpty(t, man.IncompleteReason, "snapshot not marked as incomplete") // will have one error because we're canceling early. - verifyErrors(t, man, 1, 0, - []*fs.EntryWithError{ - {EntryPath: "d1", Error: errTest.Error()}, - }, - ) + verifyErrors(t, man, 1, 0, entryPathToError{ + "d1": errTest, + }) } func objectIDsEqual(o1, o2 object.ID) bool { @@ -455,12 +454,10 @@ func TestUpload_SubDirectoryReadFailureIgnoredNoFailFast(t *testing.T) { require.NoError(t, err) // 0 failed, 2 ignored - verifyErrors(t, man, 0, 2, - []*fs.EntryWithError{ - {EntryPath: "d1", Error: errTest.Error()}, - {EntryPath: "d2/d1", Error: errTest.Error()}, - }, - ) + verifyErrors(t, man, 0, 2, entryPathToError{ + "d1": errTest, + "d2/d1": errTest, + }) } func TestUpload_ErrorEntries(t *testing.T) { @@ -549,10 +546,10 @@ func TestUpload_ErrorEntries(t *testing.T) { t.Fatal(err) } - verifyErrors(t, man, tc.wantFatalErrors, tc.wantIgnoredErrors, []*fs.EntryWithError{ - {EntryPath: "d1/some-failed-entry", Error: "some-other-error"}, - {EntryPath: "d1/some-unknown-entry", Error: "unknown or unsupported entry type"}, - {EntryPath: "d2/another-failed-entry", Error: "another-error"}, + verifyErrors(t, man, tc.wantFatalErrors, tc.wantIgnoredErrors, entryPathToError{ + "d1/some-failed-entry": errors.New("some-other-error"), + "d1/some-unknown-entry": errors.New("unknown or unsupported entry type"), + "d2/another-failed-entry": errors.New("another-error"), }) }) } @@ -577,21 +574,24 @@ func TestUpload_SubDirectoryReadFailureNoFailFast(t *testing.T) { // make sure we have 2 errors require.Equal(t, 2, man.RootEntry.DirSummary.FatalErrorCount) - verifyErrors(t, man, - 2, 0, - []*fs.EntryWithError{ - {EntryPath: "d1", Error: errTest.Error()}, - {EntryPath: "d2/d1", Error: errTest.Error()}, - }, - ) + verifyErrors(t, man, 2, 0, entryPathToError{ + "d1": errTest, + "d2/d1": errTest, + }) } -func verifyErrors(t *testing.T, man *snapshot.Manifest, wantFatalErrors, wantIgnoredErrors int, wantErrors []*fs.EntryWithError) { +func verifyErrors(t *testing.T, man *snapshot.Manifest, wantFatalErrors, wantIgnoredErrors int, wantErrors entryPathToError) { t.Helper() require.Equal(t, wantFatalErrors, man.RootEntry.DirSummary.FatalErrorCount, "invalid number of fatal errors") require.Equal(t, wantIgnoredErrors, man.RootEntry.DirSummary.IgnoredErrorCount, "invalid number of ignored errors") - require.Empty(t, pretty.Compare(man.RootEntry.DirSummary.FailedEntries, wantErrors), "unexpected errors, diff(-got,+want)") + + failedEntries := man.RootEntry.DirSummary.FailedEntries + for _, failedEntry := range failedEntries { + wantErr, ok := wantErrors[failedEntry.EntryPath] + require.True(t, ok, "expected error for entry path not found: %s", failedEntry.EntryPath) + require.Contains(t, failedEntry.Error, wantErr.Error()) + } } func TestUpload_SubDirectoryReadFailureSomeIgnoredNoFailFast(t *testing.T) { @@ -626,14 +626,11 @@ func TestUpload_SubDirectoryReadFailureSomeIgnoredNoFailFast(t *testing.T) { man, err := u.Upload(ctx, th.sourceDir, policyTree, snapshot.SourceInfo{}) require.NoError(t, err) - verifyErrors(t, man, - 2, 1, - []*fs.EntryWithError{ - {EntryPath: "d1", Error: errTest.Error()}, - {EntryPath: "d2/d1", Error: errTest.Error()}, - {EntryPath: "d3", Error: errTest.Error()}, - }, - ) + verifyErrors(t, man, 2, 1, entryPathToError{ + "d1": errTest, + "d2/d1": errTest, + "d3": errTest, + }) } type mockProgress struct { From 31a1fd25bac3c61f48cb6244b3e52bfc2054ee36 Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Wed, 30 Apr 2025 10:37:03 -0700 Subject: [PATCH 086/206] style(general): cleanup linter config (#4538) - use 'localmodule' for gci linter config - enabled 'wastedassign' linter - remove unused assignment - prevent re-introducing dependencies - remove unused //nolint directive - disable zerologlint linter --- .golangci.yml | 21 ++++++++++++++++++--- internal/epoch/epoch_manager_test.go | 2 +- internal/testutil/testutil.go | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 2956e3bb42b..881aaf59d60 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -3,6 +3,14 @@ linters: settings: cyclop: max-complexity: 20 + depguard: + rules: + main: + deny: + # v2 of the SDK comprises many modules, which means it cannot be + # denied with a single gomodguard entry + - pkg: "github.com/aws/aws-sdk-go-v2" + desc: "use github.com/minio/minio-go" exhaustive: # indicates that switch statements are to be considered exhaustive if a # 'default' case is present, even if all enum members aren't listed in the @@ -31,6 +39,14 @@ linters: gomodguard: blocked: modules: + - github.com/aws/aws-sdk-go: + recommendations: + - github.com/minio/minio-go + reason: "github.com/aws/aws-sdk-go is not activily developed any longer" + - github.com/rs/zerolog/log: + recommendations: + - "use kopia's logging packages" + reason: "zerolog not currently use" - go.uber.org/multierr: recommendations: - errors @@ -75,7 +91,6 @@ linters: default: all disable: - - depguard - exhaustruct - forcetypeassert - funcorder @@ -99,8 +114,8 @@ linters: - tparallel - usetesting - varnamelen # this one may be interesting, but too much churn - - wastedassign - whitespace + - zerologlint # zerolog not currently used in the codebase exclusions: generated: lax @@ -185,7 +200,7 @@ formatters: sections: - standard - default - - prefix(github.com/kopia/kopia) + - localmodule output: show-stats: false diff --git a/internal/epoch/epoch_manager_test.go b/internal/epoch/epoch_manager_test.go index 4a3e8897fb0..94965c98214 100644 --- a/internal/epoch/epoch_manager_test.go +++ b/internal/epoch/epoch_manager_test.go @@ -441,7 +441,7 @@ func TestNoEpochAdvanceOnIndexRead(t *testing.T) { } te.mgr.Invalidate() - cs, err = te.mgr.Current(ctx) + _, err = te.mgr.Current(ctx) require.NoError(t, err) te.mgr.Flush() // wait for background work diff --git a/internal/testutil/testutil.go b/internal/testutil/testutil.go index 429d08459ba..ee8742848c6 100644 --- a/internal/testutil/testutil.go +++ b/internal/testutil/testutil.go @@ -4,7 +4,7 @@ package testutil import ( "encoding/json" "fmt" - "log" //nolint:depguard + "log" "os" "path/filepath" "reflect" From 6f636ea03ccbaaf5eaf6263fa09dc24266e7931f Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Wed, 30 Apr 2025 11:38:33 -0700 Subject: [PATCH 087/206] style(general): cleanup `forbidigo` linter config (#4540) Update `forbidigo` linter config to remove patterns for deprecated `ioutil` functions and symbols. The usage of deprecated symbols already flagged by the other linters, in particular `staticcheck` (SA1019 rule) --- .golangci.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 881aaf59d60..f30a8c580de 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -19,14 +19,6 @@ linters: forbidigo: forbid: - pattern: filepath.IsAbs # use ospath.IsAbs which supports windows UNC paths - - pattern: ioutil.Discard # use io.Discard - - pattern: ioutil.NopCloser # use io.NopCloser - - pattern: ioutil.ReadAll # use io.ReadAll - - pattern: ioutil.ReadDir # use os.ReadDir - - pattern: ioutil.ReadFile # use os.ReadFile - - pattern: ioutil.TempDir # use os.MkdirTemp - - pattern: ioutil.TempFile # use os.CreateTemp - - pattern: ioutil.WriteFile # use os.WriteFile - pattern: time.Now # do not use outside of 'clock' and 'timetrack' packages use clock.Now or timetrack.StartTimer - pattern: time.Since # use timetrack.Timer.Elapsed() - pattern: time.Until # never use this From c27c5e8c057faa743366a35eb66ab5e776153f19 Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Wed, 30 Apr 2025 15:59:43 -0700 Subject: [PATCH 088/206] refactor(provider): change StartupTimeout type to Duration (#4528) This allows persisting and reading back the timeout as a duration. There are be no backwards compatibility issues, since the field is not currently set, so it is not persisted in the configuration file. --- repo/blob/rclone/rclone_options.go | 19 ++++++++++--------- repo/blob/rclone/rclone_storage.go | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/repo/blob/rclone/rclone_options.go b/repo/blob/rclone/rclone_options.go index 6c9b849b378..f2a16f92c90 100644 --- a/repo/blob/rclone/rclone_options.go +++ b/repo/blob/rclone/rclone_options.go @@ -1,21 +1,22 @@ package rclone import ( + "github.com/kopia/kopia/internal/jsonencoding" "github.com/kopia/kopia/repo/blob/sharded" "github.com/kopia/kopia/repo/blob/throttling" ) // Options defines options for RClone storage. type Options struct { - RemotePath string `json:"remotePath"` // remote:path supported by RClone - RCloneExe string `json:"rcloneExe,omitempty"` // path to rclone executable - RCloneArgs []string `json:"rcloneArgs,omitempty"` // additional rclone arguments - RCloneEnv []string `json:"rcloneEnv,omitempty"` // additional rclone environment variables - StartupTimeout int `json:"startupTimeout,omitempty"` // time to wait for rclone to start - Debug bool `json:"debug,omitempty"` // log rclone output - NoWaitForTransfers bool `json:"noWaitForTransfers,omitempty"` // when set to true, don't wait for transfers to finish when closing - EmbeddedConfig string `json:"embeddedConfig,omitempty"` - AtomicWrites bool `json:"atomicWrites"` + RemotePath string `json:"remotePath"` // remote:path supported by RClone + RCloneExe string `json:"rcloneExe,omitempty"` // path to rclone executable + RCloneArgs []string `json:"rcloneArgs,omitempty"` // additional rclone arguments + RCloneEnv []string `json:"rcloneEnv,omitempty"` // additional rclone environment variables + StartupTimeout jsonencoding.Duration `json:"startupTimeout,omitempty"` // time to wait for rclone to start + Debug bool `json:"debug,omitempty"` // log rclone output + NoWaitForTransfers bool `json:"noWaitForTransfers,omitempty"` // when set to true, don't wait for transfers to finish when closing + EmbeddedConfig string `json:"embeddedConfig,omitempty"` + AtomicWrites bool `json:"atomicWrites"` sharded.Options throttling.Limits diff --git a/repo/blob/rclone/rclone_storage.go b/repo/blob/rclone/rclone_storage.go index 5d96ebbe6cd..e20350755a4 100644 --- a/repo/blob/rclone/rclone_storage.go +++ b/repo/blob/rclone/rclone_storage.go @@ -346,8 +346,8 @@ func New(ctx context.Context, opt *Options, isCreate bool) (blob.Storage, error) osexec.DisableInterruptSignal(r.cmd) startupTimeout := rcloneStartupTimeout - if opt.StartupTimeout != 0 { - startupTimeout = time.Duration(opt.StartupTimeout) * time.Second + if opt.StartupTimeout.Duration != 0 { + startupTimeout = opt.StartupTimeout.Duration } rcloneUrls, err := r.runRCloneAndWaitForServerAddress(ctx, r.cmd, startupTimeout) From e0213248853cc49bb3f1d2bb092e109610925eab Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Wed, 30 Apr 2025 17:58:10 -0700 Subject: [PATCH 089/206] feat(ui): upgraded htmlui to the latest version (#4544) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 38c3c8a8f16..82c0e1a3b9d 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250416164135-16793194ee70 + github.com/kopia/htmluibuild v0.0.1-0.20250501002021-b7bbed5a3b1a github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index 6f601db0de2..ec4b7c05bc1 100644 --- a/go.sum +++ b/go.sum @@ -184,8 +184,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250416164135-16793194ee70 h1:fKJT9+uw2vrQyCV0wJXHqkDtVf5fBBgMtfl0PK8kY2s= -github.com/kopia/htmluibuild v0.0.1-0.20250416164135-16793194ee70/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250501002021-b7bbed5a3b1a h1:p96ObSmHRYxCd5cDlYN9gzHDTK47JDGOy/aIVkMFZ9w= +github.com/kopia/htmluibuild v0.0.1-0.20250501002021-b7bbed5a3b1a/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From 30079e40778b730590d65d74a31fbc764dc6a1fd Mon Sep 17 00:00:00 2001 From: ashmrtn <3891298+ashmrtn@users.noreply.github.com> Date: Wed, 30 Apr 2025 22:49:33 -0700 Subject: [PATCH 090/206] feat(repository): role assumption for S3 storage (#4182) * Use an AssumeRole credential provider if a role was specified * Use minio's assumerole call * Update assume role test --------- Co-authored-by: Vaibhav Kamra --- repo/blob/s3/s3_options.go | 9 ++++++++- repo/blob/s3/s3_storage.go | 23 +++++++++++++++++++++++ repo/blob/s3/s3_storage_test.go | 21 +++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/repo/blob/s3/s3_options.go b/repo/blob/s3/s3_options.go index 626afb51e90..d427cc86d5d 100644 --- a/repo/blob/s3/s3_options.go +++ b/repo/blob/s3/s3_options.go @@ -21,7 +21,14 @@ type Options struct { AccessKeyID string `json:"accessKeyID"` SecretAccessKey string `json:"secretAccessKey" kopia:"sensitive"` - SessionToken string `json:"sessionToken" kopia:"sensitive"` + SessionToken string `json:"sessionToken" kopia:"sensitive"` + + // Used for assume role authentication. + RoleARN string `json:"roleARN"` + SessionName string `json:"sessionName"` + RoleDuration time.Duration `json:"duration"` + RoleEndpoint string `json:"roleEndpoint"` + RoleRegion string `json:"roleRegion"` // Region is an optional region to pass in authorization header. Region string `json:"region,omitempty"` diff --git a/repo/blob/s3/s3_storage.go b/repo/blob/s3/s3_storage.go index fcfb24407e3..493c51196ab 100644 --- a/repo/blob/s3/s3_storage.go +++ b/repo/blob/s3/s3_storage.go @@ -362,6 +362,29 @@ func newStorage(ctx context.Context, opt *Options) (*s3Storage, error) { }, ) + // If a role was specified, use the assume role credential provider + if opt.RoleARN != "" { + assumeRoleOpts := credentials.STSAssumeRoleOptions{ + AccessKey: opt.AccessKeyID, + SecretKey: opt.SecretAccessKey, + RoleSessionName: opt.SessionName, + SessionToken: opt.SessionToken, + RoleARN: opt.RoleARN, + DurationSeconds: int(opt.RoleDuration.Seconds()), + Location: opt.RoleRegion, + } + + var err error + + creds, err = credentials.NewSTSAssumeRole( + opt.RoleEndpoint, + assumeRoleOpts, + ) + if err != nil { + return nil, errors.Wrap(err, "getting assume role credentials") + } + } + return newStorageWithCredentials(ctx, creds, opt) } diff --git a/repo/blob/s3/s3_storage_test.go b/repo/blob/s3/s3_storage_test.go index 577013cdaeb..53e3911d202 100644 --- a/repo/blob/s3/s3_storage_test.go +++ b/repo/blob/s3/s3_storage_test.go @@ -359,6 +359,27 @@ func TestS3StorageMinio(t *testing.T) { testStorage(t, options, true, blob.PutOptions{}) } +func TestS3StorageCustomCredentials(t *testing.T) { + t.Parallel() + + // skip the test if AWS creds are not provided + getEnv(testAccessKeyIDEnv, "") + getEnv(testSecretAccessKeyEnv, "") + + options := &Options{ + Endpoint: getEnv(testEndpointEnv, awsEndpoint), + BucketName: getEnvOrSkip(t, testBucketEnv), + RoleARN: getEnvOrSkip(t, testRoleEnv), + RoleRegion: getEnvOrSkip(t, testRegionEnv), + SessionName: "test-assume-role", + RoleEndpoint: awsStsEndpointUSWest2, + RoleDuration: time.Minute * 15, + } + + getOrCreateBucket(t, options) + testStorage(t, options, false, blob.PutOptions{}) +} + func TestS3StorageMinioSelfSignedCert(t *testing.T) { t.Parallel() testutil.ProviderTest(t) From 86afca6c1faa917b77b5ace9fcc8fa0dd6b5c5da Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Wed, 30 Apr 2025 22:55:35 -0700 Subject: [PATCH 091/206] fix(server): add empty line between headers and body in email payload (#4545) Add empty line between headers and body in email payload. Fix tests - Original change: #4414 - Fixes: #4420 --------- Authored-by: Alexandr Kostiuchenko --- notification/sender/email/email_sender.go | 2 +- notification/sender/email/email_sender_test.go | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/notification/sender/email/email_sender.go b/notification/sender/email/email_sender.go index f5f3aa94d67..a22f9f342b2 100644 --- a/notification/sender/email/email_sender.go +++ b/notification/sender/email/email_sender.go @@ -47,7 +47,7 @@ func (p *emailProvider) Send(_ context.Context, msg *sender.Message) error { headers = append(headers, fmt.Sprintf("%v: %v", k, v)) } - msgPayload = []byte(strings.Join(headers, "\r\n") + "\r\n" + msg.Body) + msgPayload = []byte(strings.Join(headers, "\r\n") + "\r\n\r\n" + msg.Body) //nolint:wrapcheck return smtp.SendMail( diff --git a/notification/sender/email/email_sender_test.go b/notification/sender/email/email_sender_test.go index 9df55f49fac..6473ba5d861 100644 --- a/notification/sender/email/email_sender_test.go +++ b/notification/sender/email/email_sender_test.go @@ -34,8 +34,7 @@ func TestEmailProvider(t *testing.T) { require.Equal(t, "SMTP server: \"localhost\", Mail from: \"some-user@example.com\" Mail to: \"another-user@example.com\" Format: \"html\"", p.Summary()) - require.NoError(t, p.Send(ctx, &sender.Message{Subject: "Test", Body: ` -This is a test. + require.NoError(t, p.Send(ctx, &sender.Message{Subject: "Test", Body: `This is a test. * one * two @@ -98,8 +97,7 @@ func TestEmailProvider_Text(t *testing.T) { require.Equal(t, "SMTP server: \"localhost\", Mail from: \"some-user@example.com\" Mail to: \"another-user@example.com\" Format: \"txt\"", p.Summary()) - require.NoError(t, p.Send(ctx, &sender.Message{Subject: "Test", Body: ` -This is a test. + require.NoError(t, p.Send(ctx, &sender.Message{Subject: "Test", Body: `This is a test. * one * two From 1c5c4e256839dabec00eb86ee4801dfd198efe4c Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Thu, 1 May 2025 15:35:11 -0700 Subject: [PATCH 092/206] refactor(cli): cleanup `cli.repositoryAccessMode` (#4541) Remove `repositoryAccessMode.mustBeConnected` It is always true. Rename `repositoryAccessMode.disableMaintenance` to `allowMaintenance`. This explicitly conveys when maintenance is allowed to run. It is related to accessing a repository in 'read-only' mode. --- cli/app.go | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/cli/app.go b/cli/app.go index 3ea2ee3743b..28c7aba3c9b 100644 --- a/cli/app.go +++ b/cli/app.go @@ -463,28 +463,19 @@ func (c *App) directRepositoryWriteAction(act func(ctx context.Context, rep repo Purpose: "cli:" + c.currentActionName(), OnUpload: c.progress.UploadedBytes, }, func(ctx context.Context, dw repo.DirectRepositoryWriter) error { return act(ctx, dw) }) - }), repositoryAccessMode{ - mustBeConnected: true, - disableMaintenance: true, - }) + }), repositoryAccessMode{}) } func (c *App) directRepositoryReadAction(act func(ctx context.Context, rep repo.DirectRepository) error) func(ctx *kingpin.ParseContext) error { return c.maybeRepositoryAction(assertDirectRepository(func(ctx context.Context, rep repo.DirectRepository) error { return act(ctx, rep) - }), repositoryAccessMode{ - mustBeConnected: true, - disableMaintenance: true, - }) + }), repositoryAccessMode{}) } func (c *App) repositoryReaderAction(act func(ctx context.Context, rep repo.Repository) error) func(ctx *kingpin.ParseContext) error { return c.maybeRepositoryAction(func(ctx context.Context, rep repo.Repository) error { return act(ctx, rep) - }, repositoryAccessMode{ - mustBeConnected: true, - disableMaintenance: true, - }) + }, repositoryAccessMode{}) } func (c *App) repositoryWriterAction(act func(ctx context.Context, rep repo.RepositoryWriter) error) func(ctx *kingpin.ParseContext) error { @@ -496,7 +487,7 @@ func (c *App) repositoryWriterAction(act func(ctx context.Context, rep repo.Repo return act(ctx, w) }) }, repositoryAccessMode{ - mustBeConnected: true, + allowMaintenance: true, }) } @@ -549,8 +540,7 @@ func (c *App) runAppWithContext(command *kingpin.CmdClause, cb func(ctx context. } type repositoryAccessMode struct { - mustBeConnected bool - disableMaintenance bool + allowMaintenance bool } func (c *App) baseActionWithContext(act func(ctx context.Context) error) func(ctx *kingpin.ParseContext) error { @@ -569,8 +559,10 @@ func (c *App) baseActionWithContext(act func(ctx context.Context) error) func(ct func (c *App) maybeRepositoryAction(act func(ctx context.Context, rep repo.Repository) error, mode repositoryAccessMode) func(ctx *kingpin.ParseContext) error { return c.baseActionWithContext(func(ctx context.Context) error { - rep, err := c.openRepository(ctx, mode.mustBeConnected) - if err != nil && mode.mustBeConnected { + const requireConnected = true + + rep, err := c.openRepository(ctx, requireConnected) + if err != nil { return errors.Wrap(err, "open repository") } @@ -578,7 +570,7 @@ func (c *App) maybeRepositoryAction(act func(ctx context.Context, rep repo.Repos err = act(ctx, rep) - if rep != nil && err == nil && !mode.disableMaintenance { + if rep != nil && err == nil && mode.allowMaintenance { if merr := c.maybeRunMaintenance(ctx, rep); merr != nil { log(ctx).Errorf("error running maintenance: %v", merr) } @@ -595,7 +587,7 @@ func (c *App) maybeRepositoryAction(act func(ctx context.Context, rep repo.Repos ) } - if rep != nil && mode.mustBeConnected { + if rep != nil { if cerr := rep.Close(ctx); cerr != nil { return errors.Wrap(cerr, "unable to close repository") } From 14bcbcb07eccccb166d084c873653f16ae27ae66 Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Thu, 1 May 2025 15:37:22 -0700 Subject: [PATCH 093/206] fix(cli): add flag for rclone's startup timeout (#4543) - add flag for rclone startup timeout - rename const --- cli/storage_rclone.go | 1 + repo/blob/rclone/rclone_storage.go | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cli/storage_rclone.go b/cli/storage_rclone.go index 29975004f0b..b289825cf6e 100644 --- a/cli/storage_rclone.go +++ b/cli/storage_rclone.go @@ -28,6 +28,7 @@ func (c *storageRcloneFlags) Setup(_ StorageProviderServices, cmd *kingpin.CmdCl cmd.Flag("rclone-nowait-for-transfers", "Don't wait for transfers when closing storage").Hidden().BoolVar(&c.opt.NoWaitForTransfers) cmd.Flag("list-parallelism", "Set list parallelism").Hidden().IntVar(&c.opt.ListParallelism) cmd.Flag("atomic-writes", "Assume provider writes are atomic").Default("true").BoolVar(&c.opt.AtomicWrites) + cmd.Flag("rclone-startup-timeout", "Time in seconds to wait for rclone to start").Default("15s").DurationVar(&c.opt.StartupTimeout.Duration) commonThrottlingFlags(cmd, &c.opt.Limits) } diff --git a/repo/blob/rclone/rclone_storage.go b/repo/blob/rclone/rclone_storage.go index e20350755a4..def876aa824 100644 --- a/repo/blob/rclone/rclone_storage.go +++ b/repo/blob/rclone/rclone_storage.go @@ -31,8 +31,8 @@ const ( defaultRCloneExe = "rclone" - // rcloneStartupTimeout is the time we wait for rclone to print the https address it's serving at. - rcloneStartupTimeout = 15 * time.Second + // defaultRcloneStartupTimeout is the time we wait for rclone to print the https address it's serving at. + defaultRcloneStartupTimeout = 15 * time.Second ) var log = logging.Module("rclone") @@ -345,7 +345,7 @@ func New(ctx context.Context, opt *Options, isCreate bool) (blob.Storage, error) // https://github.com/kopia/kopia/issues/1934 osexec.DisableInterruptSignal(r.cmd) - startupTimeout := rcloneStartupTimeout + startupTimeout := defaultRcloneStartupTimeout if opt.StartupTimeout.Duration != 0 { startupTimeout = opt.StartupTimeout.Duration } From 0418b6c3758a3562ae8ef92916ce3068585ca556 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 18:34:18 -0700 Subject: [PATCH 094/206] build(deps): bump the github-actions group with 2 updates (#4548) Bumps the github-actions group with 2 updates: [actions/download-artifact](https://github.com/actions/download-artifact) and [github/codeql-action](https://github.com/github/codeql-action). Updates `actions/download-artifact` from 4.2.1 to 4.3.0 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/95815c38cf2ff2164869cbab79da8d1f422bc89e...d3f86a106a0bac45b974a628896c90dbdf5c8093) Updates `github/codeql-action` from 3.28.13 to 3.28.16 - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/1b549b9259bda1cb5ddde3b41741a82a2d15a841...28deaeda66b76a05916b6923827895f2b14ab387) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: 4.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: github/codeql-action dependency-version: 3.28.16 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/make.yml | 4 ++-- .github/workflows/ossf-scorecard.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/make.yml b/.github/workflows/make.yml index d148da17d0a..2c560d8bb1d 100644 --- a/.github/workflows/make.yml +++ b/.github/workflows/make.yml @@ -137,13 +137,13 @@ jobs: - name: Install Linux-specific packages run: "sudo apt-get install -y createrepo-c" - name: Download Artifacts - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: pattern: kopia-* merge-multiple: true path: dist - name: Download Kopia Binaries - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: pattern: kopia_binaries-* merge-multiple: true diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index ac16ae3a76f..49d05748855 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -39,7 +39,7 @@ jobs: - # Upload the results to GitHub's code scanning dashboard. name: "Upload to results to dashboard" - uses: github/codeql-action/upload-sarif@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 + uses: github/codeql-action/upload-sarif@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16 with: sarif_file: results.sarif - From ce611cec336c35215c908c223299012a2a739030 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 18:36:09 -0700 Subject: [PATCH 095/206] build(deps): bump codecov/codecov-action from 5.4.0 to 5.4.2 (#4549) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.4.0 to 5.4.2. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/0565863a31f2c772f9f0395002a31e3f06189574...ad3126e916f78f00edff4ed0317cf185271ccc2d) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-version: 5.4.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/code-coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index 0583d74d063..092697775ed 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -24,7 +24,7 @@ jobs: - name: Run Tests run: make test-with-coverage - name: Upload Coverage - uses: codecov/codecov-action@0565863a31f2c772f9f0395002a31e3f06189574 # v5.4.0 + uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2 with: files: coverage.txt - name: Upload Logs From 34180795abe01d81152c8d61b206a7f4667b192e Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Thu, 1 May 2025 19:14:07 -0700 Subject: [PATCH 096/206] feat(ui): upgraded htmlui to the latest version (#4551) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 82c0e1a3b9d..56706e3a446 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250501002021-b7bbed5a3b1a + github.com/kopia/htmluibuild v0.0.1-0.20250502013900-9ddd3cdab3fc github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index ec4b7c05bc1..ade269c28a2 100644 --- a/go.sum +++ b/go.sum @@ -184,8 +184,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250501002021-b7bbed5a3b1a h1:p96ObSmHRYxCd5cDlYN9gzHDTK47JDGOy/aIVkMFZ9w= -github.com/kopia/htmluibuild v0.0.1-0.20250501002021-b7bbed5a3b1a/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250502013900-9ddd3cdab3fc h1:Ok5ifVV/rVVkA1kO9lElEbJRhjqZuPhP+yC9TZqec/4= +github.com/kopia/htmluibuild v0.0.1-0.20250502013900-9ddd3cdab3fc/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From c7d5071a3afe09c2edd02a41b47234a6d0b729e6 Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Fri, 2 May 2025 07:47:50 -0700 Subject: [PATCH 097/206] fix(providers): human-friendly persistence of role durantion (#4546) --- repo/blob/s3/s3_options.go | 11 ++++++----- repo/blob/s3/s3_storage_test.go | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/repo/blob/s3/s3_options.go b/repo/blob/s3/s3_options.go index d427cc86d5d..d860d461574 100644 --- a/repo/blob/s3/s3_options.go +++ b/repo/blob/s3/s3_options.go @@ -3,6 +3,7 @@ package s3 import ( "time" + "github.com/kopia/kopia/internal/jsonencoding" "github.com/kopia/kopia/repo/blob/throttling" ) @@ -24,11 +25,11 @@ type Options struct { SessionToken string `json:"sessionToken" kopia:"sensitive"` // Used for assume role authentication. - RoleARN string `json:"roleARN"` - SessionName string `json:"sessionName"` - RoleDuration time.Duration `json:"duration"` - RoleEndpoint string `json:"roleEndpoint"` - RoleRegion string `json:"roleRegion"` + RoleARN string `json:"roleARN"` + SessionName string `json:"sessionName"` + RoleDuration jsonencoding.Duration `json:"duration"` + RoleEndpoint string `json:"roleEndpoint"` + RoleRegion string `json:"roleRegion"` // Region is an optional region to pass in authorization header. Region string `json:"region,omitempty"` diff --git a/repo/blob/s3/s3_storage_test.go b/repo/blob/s3/s3_storage_test.go index 53e3911d202..ee73b5d1b71 100644 --- a/repo/blob/s3/s3_storage_test.go +++ b/repo/blob/s3/s3_storage_test.go @@ -20,6 +20,7 @@ import ( "github.com/kopia/kopia/internal/blobtesting" "github.com/kopia/kopia/internal/gather" + "github.com/kopia/kopia/internal/jsonencoding" "github.com/kopia/kopia/internal/providervalidation" "github.com/kopia/kopia/internal/testlogging" "github.com/kopia/kopia/internal/testutil" @@ -373,7 +374,7 @@ func TestS3StorageCustomCredentials(t *testing.T) { RoleRegion: getEnvOrSkip(t, testRegionEnv), SessionName: "test-assume-role", RoleEndpoint: awsStsEndpointUSWest2, - RoleDuration: time.Minute * 15, + RoleDuration: jsonencoding.Duration{Duration: time.Minute * 15}, } getOrCreateBucket(t, options) From f5d3e09bda1f2079c23e3772266fa1ec3a648a2f Mon Sep 17 00:00:00 2001 From: ashmrtn <3891298+ashmrtn@users.noreply.github.com> Date: Fri, 2 May 2025 09:36:08 -0700 Subject: [PATCH 098/206] Allow external callers to name jsonencoding type (#4552) As jsonencoding is used to pass some config parameters, move it to a package that callers external to kopia can name. This ensures they can actually configure those parameters if needed. --- repo/blob/rclone/rclone_options.go | 2 +- repo/blob/s3/s3_options.go | 2 +- repo/blob/s3/s3_storage_test.go | 2 +- {internal => repo}/jsonencoding/jsonencoding.go | 0 {internal => repo}/jsonencoding/jsonencoding_test.go | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename {internal => repo}/jsonencoding/jsonencoding.go (100%) rename {internal => repo}/jsonencoding/jsonencoding_test.go (97%) diff --git a/repo/blob/rclone/rclone_options.go b/repo/blob/rclone/rclone_options.go index f2a16f92c90..bd551f88e84 100644 --- a/repo/blob/rclone/rclone_options.go +++ b/repo/blob/rclone/rclone_options.go @@ -1,9 +1,9 @@ package rclone import ( - "github.com/kopia/kopia/internal/jsonencoding" "github.com/kopia/kopia/repo/blob/sharded" "github.com/kopia/kopia/repo/blob/throttling" + "github.com/kopia/kopia/repo/jsonencoding" ) // Options defines options for RClone storage. diff --git a/repo/blob/s3/s3_options.go b/repo/blob/s3/s3_options.go index d860d461574..9b2473b9d2e 100644 --- a/repo/blob/s3/s3_options.go +++ b/repo/blob/s3/s3_options.go @@ -3,8 +3,8 @@ package s3 import ( "time" - "github.com/kopia/kopia/internal/jsonencoding" "github.com/kopia/kopia/repo/blob/throttling" + "github.com/kopia/kopia/repo/jsonencoding" ) // Options defines options for S3-based storage. diff --git a/repo/blob/s3/s3_storage_test.go b/repo/blob/s3/s3_storage_test.go index ee73b5d1b71..ce76e80c258 100644 --- a/repo/blob/s3/s3_storage_test.go +++ b/repo/blob/s3/s3_storage_test.go @@ -20,7 +20,6 @@ import ( "github.com/kopia/kopia/internal/blobtesting" "github.com/kopia/kopia/internal/gather" - "github.com/kopia/kopia/internal/jsonencoding" "github.com/kopia/kopia/internal/providervalidation" "github.com/kopia/kopia/internal/testlogging" "github.com/kopia/kopia/internal/testutil" @@ -28,6 +27,7 @@ import ( "github.com/kopia/kopia/internal/tlsutil" "github.com/kopia/kopia/repo/blob" "github.com/kopia/kopia/repo/blob/retrying" + "github.com/kopia/kopia/repo/jsonencoding" ) const ( diff --git a/internal/jsonencoding/jsonencoding.go b/repo/jsonencoding/jsonencoding.go similarity index 100% rename from internal/jsonencoding/jsonencoding.go rename to repo/jsonencoding/jsonencoding.go diff --git a/internal/jsonencoding/jsonencoding_test.go b/repo/jsonencoding/jsonencoding_test.go similarity index 97% rename from internal/jsonencoding/jsonencoding_test.go rename to repo/jsonencoding/jsonencoding_test.go index 0ae101fceea..de805961d21 100644 --- a/internal/jsonencoding/jsonencoding_test.go +++ b/repo/jsonencoding/jsonencoding_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" - "github.com/kopia/kopia/internal/jsonencoding" + "github.com/kopia/kopia/repo/jsonencoding" ) type MyStruct struct { From 12409c727961111a0acd98f9a34a7b21748fd440 Mon Sep 17 00:00:00 2001 From: Rohit-BM18 Date: Mon, 5 May 2025 23:59:52 -0400 Subject: [PATCH 099/206] feat(cli): --stats-only flag for the diff command (#4557) Adds a `--stats-only` flag to the `diff` command to reduce output verbosity. When `kopia diff` is invoked with the `--stats-only` flag it only outputs the aggregate statistics of changes. --- cli/command_diff.go | 4 +- internal/diff/diff.go | 39 ++++++++++--------- internal/diff/diff_test.go | 16 ++++---- tests/end_to_end_test/restore_test.go | 4 +- tests/recovery/recovery_test/recovery_test.go | 4 +- 5 files changed, 39 insertions(+), 28 deletions(-) diff --git a/cli/command_diff.go b/cli/command_diff.go index c3d9f6e2b9f..c8033dce14c 100644 --- a/cli/command_diff.go +++ b/cli/command_diff.go @@ -18,6 +18,7 @@ type commandDiff struct { diffFirstObjectPath string diffSecondObjectPath string diffCompareFiles bool + diffStatsOnly bool diffCommandCommand string out textOutput @@ -28,6 +29,7 @@ func (c *commandDiff) setup(svc appServices, parent commandParent) { cmd.Arg("object-path1", "First object/path").Required().StringVar(&c.diffFirstObjectPath) cmd.Arg("object-path2", "Second object/path").Required().StringVar(&c.diffSecondObjectPath) cmd.Flag("files", "Compare files by launching diff command for all pairs of (old,new)").Short('f').BoolVar(&c.diffCompareFiles) + cmd.Flag("stats-only", "Displays only aggregate statistics of the changes between two repository objects").BoolVar(&c.diffStatsOnly) cmd.Flag("diff-command", "Displays differences between two repository objects (files or directories)").Default(defaultDiffCommand()).Envar(svc.EnvName("KOPIA_DIFF")).StringVar(&c.diffCommandCommand) cmd.Action(svc.repositoryReaderAction(c.run)) @@ -52,7 +54,7 @@ func (c *commandDiff) run(ctx context.Context, rep repo.Repository) error { return errors.New("arguments to diff must both be directories or both non-directories") } - d, err := diff.NewComparer(c.out.stdout()) + d, err := diff.NewComparer(c.out.stdout(), c.diffStatsOnly) if err != nil { return errors.Wrap(err, "error creating comparer") } diff --git a/internal/diff/diff.go b/internal/diff/diff.go index 39fe0be661d..dc571c7ff9d 100644 --- a/internal/diff/diff.go +++ b/internal/diff/diff.go @@ -48,6 +48,7 @@ type Comparer struct { stats Stats out io.Writer tmpDir string + statsOnly bool DiffCommand string DiffArguments []string } @@ -122,14 +123,14 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin if e1 == nil { if dir2, isDir2 := e2.(fs.Directory); isDir2 { - c.output("added directory %v\n", path) + c.output(c.statsOnly, "added directory %v\n", path) c.stats.DirectoryEntries.Added++ return c.compareDirectories(ctx, nil, dir2, path) } - c.output("added file %v (%v bytes)\n", path, e2.Size()) + c.output(c.statsOnly, "added file %v (%v bytes)\n", path, e2.Size()) c.stats.FileEntries.Added++ @@ -144,14 +145,14 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin if e2 == nil { if dir1, isDir1 := e1.(fs.Directory); isDir1 { - c.output("removed directory %v\n", path) + c.output(c.statsOnly, "removed directory %v\n", path) c.stats.DirectoryEntries.Removed++ return c.compareDirectories(ctx, dir1, nil, path) } - c.output("removed file %v (%v bytes)\n", path, e1.Size()) + c.output(c.statsOnly, "removed file %v (%v bytes)\n", path, e1.Size()) c.stats.FileEntries.Removed++ @@ -172,7 +173,7 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin if isDir1 { if !isDir2 { // right is a non-directory, left is a directory - c.output("changed %v from directory to non-directory\n", path) + c.output(c.statsOnly, "changed %v from directory to non-directory\n", path) return nil } @@ -181,14 +182,14 @@ func (c *Comparer) compareEntry(ctx context.Context, e1, e2 fs.Entry, path strin if isDir2 { // left is non-directory, right is a directory - c.output("changed %v from non-directory to a directory\n", path) + c.output(c.statsOnly, "changed %v from non-directory to a directory\n", path) return nil } if f1, ok := e1.(fs.File); ok { if f2, ok := e2.(fs.File); ok { - c.output("changed %v at %v (size %v -> %v)\n", path, e2.ModTime().String(), e1.Size(), e2.Size()) + c.output(c.statsOnly, "changed %v at %v (size %v -> %v)\n", path, e2.ModTime().String(), e1.Size(), e2.Size()) c.stats.FileEntries.Modified++ @@ -242,10 +243,10 @@ func (c *Comparer) compareEntryMetadata(e1, e2 fs.Entry, fullpath string) { case e1 == e2: // in particular e1 == nil && e2 == nil return case e1 == nil: - c.output("%v does not exist in source directory\n", fullpath) + c.output(c.statsOnly, "%v does not exist in source directory\n", fullpath) return case e2 == nil: - c.output("%v does not exist in destination directory\n", fullpath) + c.output(c.statsOnly, "%v does not exist in destination directory\n", fullpath) return } @@ -254,32 +255,32 @@ func (c *Comparer) compareEntryMetadata(e1, e2 fs.Entry, fullpath string) { if m1, m2 := e1.Mode(), e2.Mode(); m1 != m2 { changed = true - c.output("%v modes differ: %v %v\n", fullpath, m1, m2) + c.output(c.statsOnly, "%v modes differ: %v %v\n", fullpath, m1, m2) } if s1, s2 := e1.Size(), e2.Size(); s1 != s2 { changed = true - c.output("%v sizes differ: %v %v\n", fullpath, s1, s2) + c.output(c.statsOnly, "%v sizes differ: %v %v\n", fullpath, s1, s2) } if mt1, mt2 := e1.ModTime(), e2.ModTime(); !mt1.Equal(mt2) { changed = true - c.output("%v modification times differ: %v %v\n", fullpath, mt1, mt2) + c.output(c.statsOnly, "%v modification times differ: %v %v\n", fullpath, mt1, mt2) } o1, o2 := e1.Owner(), e2.Owner() if o1.UserID != o2.UserID { changed = true - c.output("%v owner users differ: %v %v\n", fullpath, o1.UserID, o2.UserID) + c.output(c.statsOnly, "%v owner users differ: %v %v\n", fullpath, o1.UserID, o2.UserID) } if o1.GroupID != o2.GroupID { changed = true - c.output("%v owner groups differ: %v %v\n", fullpath, o1.GroupID, o2.GroupID) + c.output(c.statsOnly, "%v owner groups differ: %v %v\n", fullpath, o1.GroupID, o2.GroupID) } _, isDir1 := e1.(fs.Directory) @@ -391,16 +392,18 @@ func (c *Comparer) Stats() Stats { return c.stats } -func (c *Comparer) output(msg string, args ...interface{}) { - fmt.Fprintf(c.out, msg, args...) //nolint:errcheck +func (c *Comparer) output(statsOnly bool, msg string, args ...interface{}) { + if !statsOnly { + fmt.Fprintf(c.out, msg, args...) //nolint:errcheck + } } // NewComparer creates a comparer for a given repository that will output the results to a given writer. -func NewComparer(out io.Writer) (*Comparer, error) { +func NewComparer(out io.Writer, statsOnly bool) (*Comparer, error) { tmp, err := os.MkdirTemp("", "kopia") if err != nil { return nil, errors.Wrap(err, "error creating temp directory") } - return &Comparer{out: out, tmpDir: tmp}, nil + return &Comparer{out: out, tmpDir: tmp, statsOnly: statsOnly}, nil } diff --git a/internal/diff/diff_test.go b/internal/diff/diff_test.go index 30deb20e290..1b758ad0bcb 100644 --- a/internal/diff/diff_test.go +++ b/internal/diff/diff_test.go @@ -17,6 +17,8 @@ import ( "github.com/kopia/kopia/repo/object" ) +const statsOnly = false + var ( _ fs.Entry = (*testFile)(nil) _ fs.Directory = (*testDirectory)(nil) @@ -110,7 +112,7 @@ func TestCompareEmptyDirectories(t *testing.T) { dir1 := createTestDirectory("testDir1", dirModTime, dirOwnerInfo, dirMode, dirObjectID1) dir2 := createTestDirectory("testDir2", dirModTime, dirOwnerInfo, dirMode, dirObjectID2) - c, err := diff.NewComparer(&buf) + c, err := diff.NewComparer(&buf, statsOnly) require.NoError(t, err) t.Cleanup(func() { @@ -165,7 +167,7 @@ func TestCompareIdenticalDirectories(t *testing.T) { expectedStats := diff.Stats{} - c, err := diff.NewComparer(&buf) + c, err := diff.NewComparer(&buf, statsOnly) require.NoError(t, err) t.Cleanup(func() { @@ -214,7 +216,7 @@ func TestCompareDifferentDirectories(t *testing.T) { &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime, name: "file4.txt"}, content: "klmnopqrstuvwxyz2"}, ) - c, err := diff.NewComparer(&buf) + c, err := diff.NewComparer(&buf, statsOnly) require.NoError(t, err) t.Cleanup(func() { @@ -275,7 +277,7 @@ func TestCompareDifferentDirectories_DirTimeDiff(t *testing.T) { expectedStats := diff.Stats{} expectedStats.DirectoryEntries.Modified = 1 - c, err := diff.NewComparer(&buf) + c, err := diff.NewComparer(&buf, statsOnly) require.NoError(t, err) t.Cleanup(func() { @@ -324,7 +326,7 @@ func TestCompareDifferentDirectories_FileTimeDiff(t *testing.T) { &testFile{testBaseEntry: testBaseEntry{modtime: fileModTime2, name: "file1.txt", oid: OID2}, content: "abcdefghij"}, ) - c, err := diff.NewComparer(&buf) + c, err := diff.NewComparer(&buf, statsOnly) require.NoError(t, err) t.Cleanup(func() { @@ -382,7 +384,7 @@ func TestCompareFileWithIdenticalContentsButDiffFileMetadata(t *testing.T) { &testFile{testBaseEntry: testBaseEntry{name: "file1.txt", modtime: fileModTime2, oid: object.ID{}, owner: fileOwnerinfo2, mode: 0o777}, content: "abcdefghij"}, ) - c, err := diff.NewComparer(&buf) + c, err := diff.NewComparer(&buf, statsOnly) require.NoError(t, err) t.Cleanup(func() { @@ -442,7 +444,7 @@ func TestCompareIdenticalDirectoriesWithDiffDirectoryMetadata(t *testing.T) { dirObjectID, &testFile{testBaseEntry: testBaseEntry{name: "file1.txt", modtime: fileModTime}, content: "abcdefghij"}, ) - c, err := diff.NewComparer(&buf) + c, err := diff.NewComparer(&buf, statsOnly) require.NoError(t, err) t.Cleanup(func() { diff --git a/tests/end_to_end_test/restore_test.go b/tests/end_to_end_test/restore_test.go index c4828b37c44..e2d5843fbdd 100644 --- a/tests/end_to_end_test/restore_test.go +++ b/tests/end_to_end_test/restore_test.go @@ -177,6 +177,8 @@ func TestRestoreCommand(t *testing.T) { func compareDirs(t *testing.T, source, restoreDir string) { t.Helper() + const statsOnly = false + // Restored contents should match source s, err := localfs.Directory(source) require.NoError(t, err) @@ -192,7 +194,7 @@ func compareDirs(t *testing.T, source, restoreDir string) { require.NoError(t, err) if !assert.Equal(t, wantHash, gotHash, "restored directory hash does not match source's hash") { - cmp, err := diff.NewComparer(os.Stderr) + cmp, err := diff.NewComparer(os.Stderr, statsOnly) require.NoError(t, err) cmp.DiffCommand = "cmp" diff --git a/tests/recovery/recovery_test/recovery_test.go b/tests/recovery/recovery_test/recovery_test.go index d588669be73..d0b5479b8ff 100644 --- a/tests/recovery/recovery_test/recovery_test.go +++ b/tests/recovery/recovery_test/recovery_test.go @@ -297,7 +297,9 @@ func CompareDirs(t *testing.T, source, destination string) { ctx := context.Background() - c, err := diff.NewComparer(&buf) + const statsOnly = false + + c, err := diff.NewComparer(&buf, statsOnly) require.NoError(t, err) t.Cleanup(func() { From cec539bc6332309d9de96e79bd10d922954208f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 21:04:29 -0700 Subject: [PATCH 100/206] build(deps): bump the common-golang-dependencies group with 9 updates (#4558) Bumps the common-golang-dependencies group with 9 updates: | Package | From | To | | --- | --- | --- | | [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) | `1.52.0` | `1.53.0` | | [golang.org/x/crypto](https://github.com/golang/crypto) | `0.37.0` | `0.38.0` | | [golang.org/x/net](https://github.com/golang/net) | `0.39.0` | `0.40.0` | | [golang.org/x/oauth2](https://github.com/golang/oauth2) | `0.29.0` | `0.30.0` | | [golang.org/x/sync](https://github.com/golang/sync) | `0.13.0` | `0.14.0` | | [golang.org/x/sys](https://github.com/golang/sys) | `0.32.0` | `0.33.0` | | [golang.org/x/term](https://github.com/golang/term) | `0.31.0` | `0.32.0` | | [golang.org/x/text](https://github.com/golang/text) | `0.24.0` | `0.25.0` | | [google.golang.org/api](https://github.com/googleapis/google-api-go-client) | `0.230.0` | `0.231.0` | Updates `cloud.google.com/go/storage` from 1.52.0 to 1.53.0 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.52.0...spanner/v1.53.0) Updates `golang.org/x/crypto` from 0.37.0 to 0.38.0 - [Commits](https://github.com/golang/crypto/compare/v0.37.0...v0.38.0) Updates `golang.org/x/net` from 0.39.0 to 0.40.0 - [Commits](https://github.com/golang/net/compare/v0.39.0...v0.40.0) Updates `golang.org/x/oauth2` from 0.29.0 to 0.30.0 - [Commits](https://github.com/golang/oauth2/compare/v0.29.0...v0.30.0) Updates `golang.org/x/sync` from 0.13.0 to 0.14.0 - [Commits](https://github.com/golang/sync/compare/v0.13.0...v0.14.0) Updates `golang.org/x/sys` from 0.32.0 to 0.33.0 - [Commits](https://github.com/golang/sys/compare/v0.32.0...v0.33.0) Updates `golang.org/x/term` from 0.31.0 to 0.32.0 - [Commits](https://github.com/golang/term/compare/v0.31.0...v0.32.0) Updates `golang.org/x/text` from 0.24.0 to 0.25.0 - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.24.0...v0.25.0) Updates `google.golang.org/api` from 0.230.0 to 0.231.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.230.0...v0.231.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/storage dependency-version: 1.53.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/crypto dependency-version: 0.38.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/net dependency-version: 0.40.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/oauth2 dependency-version: 0.30.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/sync dependency-version: 0.14.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/sys dependency-version: 0.33.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/term dependency-version: 0.32.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: golang.org/x/text dependency-version: 0.25.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: google.golang.org/api dependency-version: 0.231.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 28 +++++++++++++-------------- go.sum | 60 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/go.mod b/go.mod index 56706e3a446..98128f74b8f 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.0 toolchain go1.23.8 require ( - cloud.google.com/go/storage v1.52.0 + cloud.google.com/go/storage v1.53.0 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 @@ -58,16 +58,16 @@ require ( go.opentelemetry.io/otel/sdk v1.35.0 go.opentelemetry.io/otel/trace v1.35.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.37.0 + golang.org/x/crypto v0.38.0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 golang.org/x/mod v0.24.0 - golang.org/x/net v0.39.0 - golang.org/x/oauth2 v0.29.0 - golang.org/x/sync v0.13.0 - golang.org/x/sys v0.32.0 - golang.org/x/term v0.31.0 - golang.org/x/text v0.24.0 - google.golang.org/api v0.230.0 + golang.org/x/net v0.40.0 + golang.org/x/oauth2 v0.30.0 + golang.org/x/sync v0.14.0 + golang.org/x/sys v0.33.0 + golang.org/x/term v0.32.0 + golang.org/x/text v0.25.0 + google.golang.org/api v0.231.0 google.golang.org/grpc v1.72.0 google.golang.org/protobuf v1.36.6 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 @@ -76,11 +76,11 @@ require ( require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect cel.dev/expr v0.20.0 // indirect - cloud.google.com/go v0.120.0 // indirect - cloud.google.com/go/auth v0.16.0 // indirect + cloud.google.com/go v0.120.1 // indirect + cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.5.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect cloud.google.com/go/monitoring v1.24.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect @@ -145,7 +145,7 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/time v0.11.0 // indirect google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250425173222-7b384671a197 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index ade269c28a2..70fe68cc51b 100644 --- a/go.sum +++ b/go.sum @@ -2,24 +2,24 @@ al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXy al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI= cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= -cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA= -cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= -cloud.google.com/go/auth v0.16.0 h1:Pd8P1s9WkcrBE2n/PhAwKsdrR35V3Sg2II9B+ndM3CU= -cloud.google.com/go/auth v0.16.0/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= +cloud.google.com/go v0.120.1 h1:Z+5V7yd383+9617XDCyszmK5E4wJRJL+tquMfDj9hLM= +cloud.google.com/go v0.120.1/go.mod h1:56Vs7sf/i2jYM6ZL9NYlC82r04PThNcPS5YgFmb0rp8= +cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= +cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= -cloud.google.com/go/iam v1.5.0 h1:QlLcVMhbLGOjRcGe6VTGGTyQib8dRLK2B/kYNV0+2xs= -cloud.google.com/go/iam v1.5.0/go.mod h1:U+DOtKQltF/LxPEtcDLoobcsZMilSRwR7mgNL7knOpo= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= -cloud.google.com/go/longrunning v0.6.6 h1:XJNDo5MUfMM05xK3ewpbSdmt7R2Zw+aQEMbdQR65Rbw= -cloud.google.com/go/longrunning v0.6.6/go.mod h1:hyeGJUrPHcx0u2Uu1UFSoYZLn4lkMrccJig0t4FI7yw= +cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= cloud.google.com/go/monitoring v1.24.0 h1:csSKiCJ+WVRgNkRzzz3BPoGjFhjPY23ZTcaenToJxMM= cloud.google.com/go/monitoring v1.24.0/go.mod h1:Bd1PRK5bmQBQNnuGwHBfUamAV1ys9049oEPHnn4pcsc= -cloud.google.com/go/storage v1.52.0 h1:ROpzMW/IwipKtatA69ikxibdzQSiXJrY9f6IgBa9AlA= -cloud.google.com/go/storage v1.52.0/go.mod h1:4wrBAbAYUvYkbrf19ahGm4I5kDQhESSqN3CGEkMGvOY= +cloud.google.com/go/storage v1.53.0 h1:gg0ERZwL17pJ+Cz3cD2qS60w1WMDnwcm5YPAIQBHUAw= +cloud.google.com/go/storage v1.53.0/go.mod h1:7/eO2a/srr9ImZW9k5uufcNahT2+fPb8w5it1i5boaA= cloud.google.com/go/trace v1.11.3 h1:c+I4YFjxRQjvAhRmSsmjpASUKq88chOX854ied0K/pE= cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= @@ -331,8 +331,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -351,10 +351,10 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= -golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= -golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -362,8 +362,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -379,8 +379,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -390,8 +390,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= -golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= +golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -401,8 +401,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -413,14 +413,14 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.230.0 h1:2u1hni3E+UXAXrONrrkfWpi/V6cyKVAbfGVeGtC3OxM= -google.golang.org/api v0.230.0/go.mod h1:aqvtoMk7YkiXx+6U12arQFExiRV9D/ekvMCwCd/TksQ= +google.golang.org/api v0.231.0 h1:LbUD5FUl0C4qwia2bjXhCMH65yz1MLPzA/0OYEsYY7Q= +google.golang.org/api v0.231.0/go.mod h1:H52180fPI/QQlUc0F4xWfGZILdv09GCWKt2bcsn164A= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= -google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e h1:UdXH7Kzbj+Vzastr5nVfccbmFsmYNygVLSPk1pEfDoY= -google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e/go.mod h1:085qFyf2+XaZlRdCgKNCIZ3afY2p4HHZdoIRpId8F4A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e h1:ztQaXfzEXTmCBvbtWYRhJxW+0iJcz2qXfd38/e9l7bA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/api v0.0.0-20250425173222-7b384671a197 h1:9DuBh3k1jUho2DHdxH+kbJwthIAq02vGvZNrD2ggF+Y= +google.golang.org/genproto/googleapis/api v0.0.0-20250425173222-7b384671a197/go.mod h1:Cd8IzgPo5Akum2c9R6FsXNaZbH3Jpa2gpHlW89FqlyQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197 h1:29cjnHVylHwTzH66WfFZqgSQgnxzvWE+jvBwpZCLRxY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= From 5c11822d165a7a782249c7b7a83dfa62d89978a3 Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Fri, 9 May 2025 23:01:18 -0700 Subject: [PATCH 101/206] chore(cli): rename function to setListBlobsParallelismFromFlags (#4564) --- cli/command_maintenance_set.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/command_maintenance_set.go b/cli/command_maintenance_set.go index 4dbd6e81a69..752b42866ca 100644 --- a/cli/command_maintenance_set.go +++ b/cli/command_maintenance_set.go @@ -93,7 +93,7 @@ func (c *commandMaintenanceSet) setLogCleanupParametersFromFlags(ctx context.Con } } -func (c *commandMaintenanceSet) setDeleteUnreferencedBlobsParams(ctx context.Context, p *maintenance.Params, changed *bool) { +func (c *commandMaintenanceSet) setListBlobsParallelismFromFlags(ctx context.Context, p *maintenance.Params, changed *bool) { if v := c.listParallelism; v != -1 { p.ListParallelism = v *changed = true @@ -172,7 +172,7 @@ func (c *commandMaintenanceSet) run(ctx context.Context, rep repo.DirectReposito c.setMaintenanceEnabledAndIntervalFromFlags(ctx, &p.QuickCycle, "quick", c.maintenanceSetEnableQuick, c.maintenanceSetQuickFrequency, &changedParams) c.setMaintenanceEnabledAndIntervalFromFlags(ctx, &p.FullCycle, "full", c.maintenanceSetEnableFull, c.maintenanceSetFullFrequency, &changedParams) c.setLogCleanupParametersFromFlags(ctx, p, &changedParams) - c.setDeleteUnreferencedBlobsParams(ctx, p, &changedParams) + c.setListBlobsParallelismFromFlags(ctx, p, &changedParams) c.setMaintenanceObjectLockExtendFromFlags(ctx, p, &changedParams) if pauseDuration := c.maintenanceSetPauseQuick; pauseDuration != -1 { From 00e2db70ee2c9a15030253ed4515094963111302 Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Sun, 11 May 2025 22:15:34 -0700 Subject: [PATCH 102/206] feat(ui): upgraded htmlui to the latest version (#4565) * feat(ui): upgraded htmlui to the latest version * fixed TestByteRepresentation test --------- Co-authored-by: Jarek Kowalski --- go.mod | 2 +- go.sum | 4 ++-- tests/htmlui_e2e_test/htmlui_e2e_test.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 98128f74b8f..02f40f22fba 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250502013900-9ddd3cdab3fc + github.com/kopia/htmluibuild v0.0.1-0.20250512023648-1673d2ca803d github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index 70fe68cc51b..307f1c610a5 100644 --- a/go.sum +++ b/go.sum @@ -184,8 +184,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250502013900-9ddd3cdab3fc h1:Ok5ifVV/rVVkA1kO9lElEbJRhjqZuPhP+yC9TZqec/4= -github.com/kopia/htmluibuild v0.0.1-0.20250502013900-9ddd3cdab3fc/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250512023648-1673d2ca803d h1:4X/MmgpbeQS68e5hyPv2sDopOyHGVmLBWMrrEakJCk4= +github.com/kopia/htmluibuild v0.0.1-0.20250512023648-1673d2ca803d/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= diff --git a/tests/htmlui_e2e_test/htmlui_e2e_test.go b/tests/htmlui_e2e_test/htmlui_e2e_test.go index 62c2e017c7d..8c4050b7859 100644 --- a/tests/htmlui_e2e_test/htmlui_e2e_test.go +++ b/tests/htmlui_e2e_test/htmlui_e2e_test.go @@ -356,7 +356,7 @@ func TestByteRepresentation(t *testing.T) { tc.log("clicking on snapshots tab"), chromedp.Click("a[data-testid='tab-snapshots']", chromedp.BySearch), // getting text from the third column of the first row indicating the size of the snapshot - chromedp.Text(`#root > div > table > tbody > tr:nth-child(1) > td:nth-child(3)`, &base2, chromedp.ByQuery), + chromedp.Text(`#root table > tbody > tr:nth-child(1) > td:nth-child(3)`, &base2, chromedp.ByQuery), tc.captureScreenshot("snapshot-base-2"), tc.log("clicking on preferences tab"), @@ -369,7 +369,7 @@ func TestByteRepresentation(t *testing.T) { tc.log("clicking on snapshots tab"), chromedp.Click("a[data-testid='tab-snapshots']", chromedp.BySearch), // getting text from the third column of the first row indicating the size of the snapshot - chromedp.Text(`#root > div > table > tbody > tr:nth-child(1) > td:nth-child(3)`, &base10, chromedp.BySearch), + chromedp.Text(`#root table > tbody > tr:nth-child(1) > td:nth-child(3)`, &base10, chromedp.BySearch), tc.captureScreenshot("snapshot-base-10"), )) From b8b3e5c0a22f6d41f7657008f46d62e63930dc32 Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Sun, 11 May 2025 22:39:57 -0700 Subject: [PATCH 103/206] feat(ui): upgraded htmlui to the latest version (#4566) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 02f40f22fba..66b4bbb605b 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250512023648-1673d2ca803d + github.com/kopia/htmluibuild v0.0.1-0.20250512051948-f1295f5318a4 github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index 307f1c610a5..820b3cbe75b 100644 --- a/go.sum +++ b/go.sum @@ -184,8 +184,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250512023648-1673d2ca803d h1:4X/MmgpbeQS68e5hyPv2sDopOyHGVmLBWMrrEakJCk4= -github.com/kopia/htmluibuild v0.0.1-0.20250512023648-1673d2ca803d/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250512051948-f1295f5318a4 h1:YatTOPU1vS0RKWggABuoHWG7TfmYX6tUGWmLbJ8PwLg= +github.com/kopia/htmluibuild v0.0.1-0.20250512051948-f1295f5318a4/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From 67d8399127189ea90b17305a0ec501cbde17b2bb Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Tue, 13 May 2025 02:34:28 +0300 Subject: [PATCH 104/206] fix(cli): Fix crash when doing `kopia policy show ` (#4560) ``` ~# ./kopia policy show /home/donatas/tests panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x18b7b84] goroutine 1 [running]: github.com/kopia/kopia/cli.appendOSSnapshotPolicyRows({0xc005759008, 0x26, 0x55}, 0xc005754600?, 0xc005764008) /home/donatas/projects/kopia/cli/command_policy_show.go:490 +0x44 github.com/kopia/kopia/cli.printPolicy(0xc0000f5d48, 0xc005754600, 0xc005764008) /home/donatas/projects/kopia/cli/command_policy_show.go:135 +0x5e5 github.com/kopia/kopia/cli.(*commandPolicyShow).run(0xc0000f5d10, {0x2311ef8, 0xc0002e5320}, {0x7fb83829f3d0, 0xc0052eeb00}) /home/donatas/projects/kopia/cli/command_policy_show.go:46 +0x18d github.com/kopia/kopia/cli.(*App).repositoryReaderAction.func1({0x2311ef8?, 0xc0002e5320?}, {0x7fb83829f3d0?, 0xc0052eeb00?}) /home/donatas/projects/kopia/cli/app.go:477 +0x2b github.com/kopia/kopia/cli.(*App).repositoryReaderAction.(*App).maybeRepositoryAction.func2({0x2311ef8, 0xc0002e5320}) /home/donatas/projects/kopia/cli/app.go:571 +0xbd github.com/kopia/kopia/cli.(*App).repositoryReaderAction.(*App).maybeRepositoryAction.(*App).baseActionWithContext.func3.1.1() /home/donatas/projects/kopia/cli/app.go:554 +0x6e github.com/kopia/kopia/cli.(*profileFlags).withProfiling(0x0?, 0xc0004a09c0?) /home/donatas/projects/kopia/cli/profile.go:45 +0x2b9 github.com/kopia/kopia/cli.(*App).repositoryReaderAction.(*App).maybeRepositoryAction.(*App).baseActionWithContext.func3.1({0x2311ef8?, 0xc0002e5320?}) /home/donatas/projects/kopia/cli/app.go:549 +0x50 github.com/kopia/kopia/cli.(*App).runAppWithContext.func1(0xc0000f48d0?, 0xc0000f4808, 0xc0000efd30, {0x2311ef8, 0xc0002e52f0}) /home/donatas/projects/kopia/cli/app.go:521 +0x186 github.com/kopia/kopia/cli.(*App).runAppWithContext(0xc0000f4808, 0xc0002b88f0, 0xc0000efd30) /home/donatas/projects/kopia/cli/app.go:522 +0x1a9 github.com/kopia/kopia/cli.(*App).repositoryReaderAction.(*App).maybeRepositoryAction.(*App).baseActionWithContext.func3(0x22e2801?) /home/donatas/projects/kopia/cli/app.go:548 +0x3c github.com/alecthomas/kingpin/v2.(*actionMixin).applyActions(...) /home/donatas/go/pkg/mod/github.com/alecthomas/kingpin/v2@v2.4.0/actions.go:28 github.com/alecthomas/kingpin/v2.(*Application).applyActions(0xc0001b8500?, 0xc000453050) /home/donatas/go/pkg/mod/github.com/alecthomas/kingpin/v2@v2.4.0/app.go:568 +0xd0 github.com/alecthomas/kingpin/v2.(*Application).execute(0xc0001b8500, 0xc000453050, {0xc0004b6d80, 0x2, 0x2}) /home/donatas/go/pkg/mod/github.com/alecthomas/kingpin/v2@v2.4.0/app.go:398 +0x65 github.com/alecthomas/kingpin/v2.(*Application).Parse(0xc0001b8500, {0xc00014e090?, 0xc0001b8500?, 0x22e8c80?}) /home/donatas/go/pkg/mod/github.com/alecthomas/kingpin/v2@v2.4.0/app.go:230 +0x14a main.main() /home/donatas/projects/kopia/main.go:77 +0x1cc ``` This is happening if we apply this before: ``` ~# ./kopia policy set --inherit=false --clear-ignore /home/donatas/tests ``` Default value for `p.OSSnapshotPolicy.VolumeShadowCopy.Enable` is nil, so it's not set which is inherited from a global one and is 0 (never). Signed-off-by: Donatas Abraitis --- cli/command_policy_show.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cli/command_policy_show.go b/cli/command_policy_show.go index d197b4a6988..f62a0d8979f 100644 --- a/cli/command_policy_show.go +++ b/cli/command_policy_show.go @@ -482,7 +482,11 @@ func appendActionCommandRows(rows []policyTableRow, h *policy.ActionCommand) []p func appendOSSnapshotPolicyRows(rows []policyTableRow, p *policy.Policy, def *policy.Definition) []policyTableRow { rows = append(rows, policyTableRow{"OS-level snapshot support:", "", ""}, - policyTableRow{" Volume Shadow Copy:", p.OSSnapshotPolicy.VolumeShadowCopy.Enable.String(), definitionPointToString(p.Target(), def.OSSnapshotPolicy.VolumeShadowCopy.Enable)}, + policyTableRow{ + " Volume Shadow Copy:", + p.OSSnapshotPolicy.VolumeShadowCopy.Enable.OrDefault(policy.OSSnapshotNever).String(), + definitionPointToString(p.Target(), def.OSSnapshotPolicy.VolumeShadowCopy.Enable), + }, ) return rows From 4a873e7a0507fbb7f0e988b16d73ba86bc339c53 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 17:24:44 -0700 Subject: [PATCH 105/206] build(deps): bump the common-golang-dependencies group with 2 updates (#4567) Bumps the common-golang-dependencies group with 2 updates: [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) and [google.golang.org/api](https://github.com/googleapis/google-api-go-client). Updates `cloud.google.com/go/storage` from 1.53.0 to 1.54.0 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.53.0...spanner/v1.54.0) Updates `google.golang.org/api` from 0.231.0 to 0.232.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.231.0...v0.232.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/storage dependency-version: 1.54.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: google.golang.org/api dependency-version: 0.232.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 66b4bbb605b..07e3eaf0e27 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.0 toolchain go1.23.8 require ( - cloud.google.com/go/storage v1.53.0 + cloud.google.com/go/storage v1.54.0 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 @@ -67,7 +67,7 @@ require ( golang.org/x/sys v0.33.0 golang.org/x/term v0.32.0 golang.org/x/text v0.25.0 - google.golang.org/api v0.231.0 + google.golang.org/api v0.232.0 google.golang.org/grpc v1.72.0 google.golang.org/protobuf v1.36.6 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 @@ -76,7 +76,7 @@ require ( require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect cel.dev/expr v0.20.0 // indirect - cloud.google.com/go v0.120.1 // indirect + cloud.google.com/go v0.121.0 // indirect cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect @@ -145,7 +145,7 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/time v0.11.0 // indirect google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250425173222-7b384671a197 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 820b3cbe75b..b43b59db2ad 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXy al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI= cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= -cloud.google.com/go v0.120.1 h1:Z+5V7yd383+9617XDCyszmK5E4wJRJL+tquMfDj9hLM= -cloud.google.com/go v0.120.1/go.mod h1:56Vs7sf/i2jYM6ZL9NYlC82r04PThNcPS5YgFmb0rp8= +cloud.google.com/go v0.121.0 h1:pgfwva8nGw7vivjZiRfrmglGWiCJBP+0OmDpenG/Fwg= +cloud.google.com/go v0.121.0/go.mod h1:rS7Kytwheu/y9buoDmu5EIpMMCI4Mb8ND4aeN4Vwj7Q= cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= @@ -18,8 +18,8 @@ cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFs cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= cloud.google.com/go/monitoring v1.24.0 h1:csSKiCJ+WVRgNkRzzz3BPoGjFhjPY23ZTcaenToJxMM= cloud.google.com/go/monitoring v1.24.0/go.mod h1:Bd1PRK5bmQBQNnuGwHBfUamAV1ys9049oEPHnn4pcsc= -cloud.google.com/go/storage v1.53.0 h1:gg0ERZwL17pJ+Cz3cD2qS60w1WMDnwcm5YPAIQBHUAw= -cloud.google.com/go/storage v1.53.0/go.mod h1:7/eO2a/srr9ImZW9k5uufcNahT2+fPb8w5it1i5boaA= +cloud.google.com/go/storage v1.54.0 h1:Du3XEyliAiftfyW0bwfdppm2MMLdpVAfiIg4T2nAI+0= +cloud.google.com/go/storage v1.54.0/go.mod h1:hIi9Boe8cHxTyaeqh7KMMwKg088VblFK46C2x/BWaZE= cloud.google.com/go/trace v1.11.3 h1:c+I4YFjxRQjvAhRmSsmjpASUKq88chOX854ied0K/pE= cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= @@ -413,14 +413,14 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.231.0 h1:LbUD5FUl0C4qwia2bjXhCMH65yz1MLPzA/0OYEsYY7Q= -google.golang.org/api v0.231.0/go.mod h1:H52180fPI/QQlUc0F4xWfGZILdv09GCWKt2bcsn164A= +google.golang.org/api v0.232.0 h1:qGnmaIMf7KcuwHOlF3mERVzChloDYwRfOJOrHt8YC3I= +google.golang.org/api v0.232.0/go.mod h1:p9QCfBWZk1IJETUdbTKloR5ToFdKbYh2fkjsUL6vNoY= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= -google.golang.org/genproto/googleapis/api v0.0.0-20250425173222-7b384671a197 h1:9DuBh3k1jUho2DHdxH+kbJwthIAq02vGvZNrD2ggF+Y= -google.golang.org/genproto/googleapis/api v0.0.0-20250425173222-7b384671a197/go.mod h1:Cd8IzgPo5Akum2c9R6FsXNaZbH3Jpa2gpHlW89FqlyQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197 h1:29cjnHVylHwTzH66WfFZqgSQgnxzvWE+jvBwpZCLRxY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0= +google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 h1:IqsN8hx+lWLqlN+Sc3DoMy/watjofWiU8sRFgQ8fhKM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= From 0520e172948b80c5699a1190518579daa88bfe7e Mon Sep 17 00:00:00 2001 From: Julio Lopez <1953782+julio-lopez@users.noreply.github.com> Date: Mon, 12 May 2025 18:03:52 -0700 Subject: [PATCH 106/206] chore(ci): upgrade Go toolchain to 1.23.9 (#4568) --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 07e3eaf0e27..c8f8a8c992d 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/kopia/kopia go 1.23.0 -toolchain go1.23.8 +toolchain go1.23.9 require ( cloud.google.com/go/storage v1.54.0 From dbf5bacdc8f33f47047350164d43ac18335d595d Mon Sep 17 00:00:00 2001 From: Rohit-BM18 Date: Tue, 13 May 2025 00:14:33 -0400 Subject: [PATCH 107/206] feat(cli): helper functions to get preceding snapshots for `diff` (#4559) Add helper functions and relevant tests for fetching previous snapshot manifests --- internal/diff/diff.go | 55 +++++++++++++ internal/diff/diff_test.go | 146 ++++++++++++++++++++++++++++++++++ snapshot/snapshotfs/objref.go | 6 +- 3 files changed, 204 insertions(+), 3 deletions(-) diff --git a/internal/diff/diff.go b/internal/diff/diff.go index dc571c7ff9d..582e2e7e1c9 100644 --- a/internal/diff/diff.go +++ b/internal/diff/diff.go @@ -8,13 +8,17 @@ import ( "os" "os/exec" "path/filepath" + "sort" "github.com/pkg/errors" "github.com/kopia/kopia/fs" "github.com/kopia/kopia/internal/iocopy" + "github.com/kopia/kopia/repo" "github.com/kopia/kopia/repo/logging" "github.com/kopia/kopia/repo/object" + "github.com/kopia/kopia/snapshot" + "github.com/kopia/kopia/snapshot/snapshotfs" ) const dirMode = 0o700 @@ -407,3 +411,54 @@ func NewComparer(out io.Writer, statsOnly bool) (*Comparer, error) { return &Comparer{out: out, tmpDir: tmp, statsOnly: statsOnly}, nil } + +// GetPrecedingSnapshot fetches the snapshot manifest for the snapshot immediately preceding the given snapshotID if it exists. +func GetPrecedingSnapshot(ctx context.Context, rep repo.Repository, snapshotID string) (*snapshot.Manifest, error) { + snapshotManifest, err := snapshotfs.FindSnapshotByRootObjectIDOrManifestID(ctx, rep, snapshotID, true) + if err != nil { + return nil, errors.Wrap(err, "failed to get snapshot manifest for the given snapshotID") + } + + snapshotList, err := snapshot.ListSnapshots(ctx, rep, snapshotManifest.Source) + if err != nil { + return nil, errors.Wrap(err, "failed to list snapshots") + } + + // sort snapshots in ascending order based on start time + sort.Slice(snapshotList, func(i, j int) bool { + return snapshotList[i].StartTime.Before(snapshotList[j].StartTime) + }) + + for i, snap := range snapshotList { + if snap.ID == snapshotManifest.ID { + if i == 0 { + return nil, errors.New("there is no immediately preceding snapshot") + } + + return snapshotList[i-1], nil + } + } + + return nil, errors.New("couldn't find immediately preceding snapshot") +} + +// GetTwoLatestSnapshotsForASource fetches two latest snapshot manifests for a given source if they exist. +func GetTwoLatestSnapshotsForASource(ctx context.Context, rep repo.Repository, source snapshot.SourceInfo) (secondLast, last *snapshot.Manifest, err error) { + snapshots, err := snapshot.ListSnapshots(ctx, rep, source) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to list all snapshots") + } + + const minimumReqSnapshots = 2 + + sizeSnapshots := len(snapshots) + if sizeSnapshots < minimumReqSnapshots { + return nil, nil, errors.New("snapshot source has less than two snapshots") + } + + sort.Slice(snapshots, func(i, j int) bool { + return snapshots[i].StartTime.Before(snapshots[j].StartTime) + }) + + return snapshots[sizeSnapshots-2], snapshots[sizeSnapshots-1], nil +} diff --git a/internal/diff/diff_test.go b/internal/diff/diff_test.go index 1b758ad0bcb..5851a49ab57 100644 --- a/internal/diff/diff_test.go +++ b/internal/diff/diff_test.go @@ -13,8 +13,13 @@ import ( "github.com/kopia/kopia/fs" "github.com/kopia/kopia/internal/diff" + "github.com/kopia/kopia/internal/repotesting" + "github.com/kopia/kopia/internal/testlogging" + "github.com/kopia/kopia/repo" "github.com/kopia/kopia/repo/content/index" + "github.com/kopia/kopia/repo/manifest" "github.com/kopia/kopia/repo/object" + "github.com/kopia/kopia/snapshot" ) const statsOnly = false @@ -471,3 +476,144 @@ func TestCompareIdenticalDirectoriesWithDiffDirectoryMetadata(t *testing.T) { func createTestDirectory(name string, modtime time.Time, owner fs.OwnerInfo, mode os.FileMode, oid object.ID, files ...fs.Entry) *testDirectory { return &testDirectory{testBaseEntry: testBaseEntry{modtime: modtime, name: name, owner: owner, mode: mode, oid: oid}, files: files} } + +func getManifests() map[string]*snapshot.Manifest { + // manifests store snapshot manifests based on start-time + manifests := make(map[string]*snapshot.Manifest) + + src := getSnapshotSource() + snapshotTime := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC) + + contentID1, _ := index.IDFromHash("p", []byte("indexID1")) + objectID1 := object.DirectObjectID(contentID1) + + contentID2, _ := index.IDFromHash("p", []byte("indexID2")) + objectID2 := object.DirectObjectID(contentID2) + + rootEntry1 := snapshot.DirEntry{ + ObjectID: objectID1, + } + + rootEntry2 := snapshot.DirEntry{ + ObjectID: objectID2, + } + + initialSnapshotManifest := &snapshot.Manifest{ + ID: "manifest_1_id", + Source: src, + StartTime: fs.UTCTimestamp(snapshotTime.Add((-24) * time.Hour).UnixNano()), + Description: "snapshot captured a day ago", + RootEntry: &rootEntry2, + } + manifests["initial_snapshot"] = initialSnapshotManifest + + intermediateSnapshotManifest := &snapshot.Manifest{ + ID: "manifest_2_id", + Source: src, + StartTime: fs.UTCTimestamp(snapshotTime.Add(-time.Hour).UnixNano()), + Description: "snapshot taken an hour ago", + RootEntry: &rootEntry2, + } + manifests["intermediate_snapshot"] = intermediateSnapshotManifest + + LatestSnapshotManifest := &snapshot.Manifest{ + ID: "manifest_3_id", + Source: src, + StartTime: fs.UTCTimestamp(snapshotTime.UnixNano()), + Description: "latest snapshot", + RootEntry: &rootEntry1, + } + manifests["latest_snapshot"] = LatestSnapshotManifest + + return manifests +} + +// Tests GetPrecedingSnapshot function +// - GetPrecedingSnapshot with an invalid snapshot id and expect an error; +// - Add a snapshot, expect an error from GetPreceedingSnapshot since there is +// only a single snapshot in the repo; +// - Subsequently add more snapshots and GetPreceedingSnapshot theimmediately +// preceding with no error. +func TestGetPrecedingSnapshot(t *testing.T) { + ctx, env := repotesting.NewEnvironment(t, repotesting.FormatNotImportant) + manifests := getManifests() + + _, err := diff.GetPrecedingSnapshot(ctx, env.RepositoryWriter, "non_existent_snapshot_ID") + require.Error(t, err, "expect error when calling GetPrecedingSnapshot with a wrong snapshotID") + + initialSnapshotManifestID := mustSaveSnapshot(t, env.RepositoryWriter, manifests["initial_snapshot"]) + _, err = diff.GetPrecedingSnapshot(ctx, env.RepositoryWriter, string(initialSnapshotManifestID)) + require.Error(t, err, "expect error when there is a single snapshot in the repo") + + intermediateSnapshotManifestID := mustSaveSnapshot(t, env.RepositoryWriter, manifests["intermediate_snapshot"]) + gotManID, err := diff.GetPrecedingSnapshot(ctx, env.RepositoryWriter, string(intermediateSnapshotManifestID)) + require.NoError(t, err) + require.Equal(t, initialSnapshotManifestID, gotManID.ID) + + latestSnapshotManifestID := mustSaveSnapshot(t, env.RepositoryWriter, manifests["latest_snapshot"]) + gotManID2, err := diff.GetPrecedingSnapshot(ctx, env.RepositoryWriter, string(latestSnapshotManifestID)) + require.NoError(t, err) + require.Equal(t, intermediateSnapshotManifestID, gotManID2.ID) +} + +// First call GetTwoLatestSnapshots with insufficient snapshots in the repo and +// expect an error; +// As snapshots are added, GetTwoLatestSnapshots is expected to return the +// manifests for the two most recent snapshots for a the given source. +func TestGetTwoLatestSnapshots(t *testing.T) { + ctx, env := repotesting.NewEnvironment(t, repotesting.FormatNotImportant) + + snapshotSrc := getSnapshotSource() + manifests := getManifests() + + _, _, err := diff.GetTwoLatestSnapshotsForASource(ctx, env.RepositoryWriter, snapshotSrc) + require.Error(t, err, "expected error as there aren't enough snapshots to get the two most recent snapshots") + + initialSnapshotManifestID := mustSaveSnapshot(t, env.RepositoryWriter, manifests["initial_snapshot"]) + _, _, err = diff.GetTwoLatestSnapshotsForASource(ctx, env.RepositoryWriter, snapshotSrc) + require.Error(t, err, "expected error as there aren't enough snapshots to get the two most recent snapshots") + + intermediateSnapshotManifestID := mustSaveSnapshot(t, env.RepositoryWriter, manifests["intermediate_snapshot"]) + + var expectedManifestIDs []manifest.ID + expectedManifestIDs = append(expectedManifestIDs, initialSnapshotManifestID, intermediateSnapshotManifestID) + + secondLastSnapshot, lastSnapshot, err := diff.GetTwoLatestSnapshotsForASource(ctx, env.RepositoryWriter, snapshotSrc) + + var gotManifestIDs []manifest.ID + gotManifestIDs = append(gotManifestIDs, secondLastSnapshot.ID, lastSnapshot.ID) + + require.NoError(t, err) + require.Equal(t, expectedManifestIDs, gotManifestIDs) + + latestSnapshotManifestID := mustSaveSnapshot(t, env.RepositoryWriter, manifests["latest_snapshot"]) + + expectedManifestIDs = nil + expectedManifestIDs = append(expectedManifestIDs, intermediateSnapshotManifestID, latestSnapshotManifestID) + + gotManifestIDs = nil + secondLastSnapshot, lastSnapshot, err = diff.GetTwoLatestSnapshotsForASource(ctx, env.RepositoryWriter, snapshotSrc) + gotManifestIDs = append(gotManifestIDs, secondLastSnapshot.ID, lastSnapshot.ID) + + require.NoError(t, err) + require.Equal(t, expectedManifestIDs, gotManifestIDs) +} + +func mustSaveSnapshot(t *testing.T, rep repo.RepositoryWriter, man *snapshot.Manifest) manifest.ID { + t.Helper() + + id, err := snapshot.SaveSnapshot(testlogging.Context(t), rep, man) + require.NoError(t, err, "saving snapshot") + + return id +} + +func getSnapshotSource() snapshot.SourceInfo { + src := snapshot.SourceInfo{ + Host: "host-1", + UserName: "user-1", + Path: "/some/path", + } + + return src +} diff --git a/snapshot/snapshotfs/objref.go b/snapshot/snapshotfs/objref.go index 3a84c092b6a..c2c477e61bd 100644 --- a/snapshot/snapshotfs/objref.go +++ b/snapshot/snapshotfs/objref.go @@ -75,12 +75,12 @@ func parseNestedObjectID(ctx context.Context, startingDir fs.Entry, parts []stri return hoid.ObjectID(), nil } -// findSnapshotByRootObjectIDOrManifestID returns the list of matching snapshots for a given rootID. +// FindSnapshotByRootObjectIDOrManifestID returns the list of matching snapshots for a given rootID. // which can be either snapshot manifst ID (which matches 0 or 1 snapshots) // or the root object ID (which can match arbitrary number of snapshots). // If multiple snapshots match and they don't agree on root object attributes and consistentAttributes==true // the function fails, otherwise it returns the latest of the snapshots. -func findSnapshotByRootObjectIDOrManifestID(ctx context.Context, rep repo.Repository, rootID string, consistentAttributes bool) (*snapshot.Manifest, error) { +func FindSnapshotByRootObjectIDOrManifestID(ctx context.Context, rep repo.Repository, rootID string, consistentAttributes bool) (*snapshot.Manifest, error) { m, err := snapshot.LoadSnapshot(ctx, rep, manifest.ID(rootID)) if err == nil { return m, nil @@ -154,7 +154,7 @@ func FilesystemEntryFromIDWithPath(ctx context.Context, rep repo.Repository, roo var startingEntry fs.Entry - man, err := findSnapshotByRootObjectIDOrManifestID(ctx, rep, pathElements[0], consistentAttributes) + man, err := FindSnapshotByRootObjectIDOrManifestID(ctx, rep, pathElements[0], consistentAttributes) if err != nil { return nil, err } From 9c853b2d414471e040ef4f917493f7ff5ce55b7a Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Thu, 15 May 2025 21:59:22 -0700 Subject: [PATCH 108/206] feat(ui): upgraded htmlui to the latest version (#4574) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c8f8a8c992d..4f705666e6a 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250512051948-f1295f5318a4 + github.com/kopia/htmluibuild v0.0.1-0.20250516044211-bc4fb8f5a1a7 github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index b43b59db2ad..76d355dfb97 100644 --- a/go.sum +++ b/go.sum @@ -184,8 +184,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250512051948-f1295f5318a4 h1:YatTOPU1vS0RKWggABuoHWG7TfmYX6tUGWmLbJ8PwLg= -github.com/kopia/htmluibuild v0.0.1-0.20250512051948-f1295f5318a4/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250516044211-bc4fb8f5a1a7 h1:R84hB/fvz/Ls2V+11kP4oVjyG6UaxnrmBwTj9Atlasg= +github.com/kopia/htmluibuild v0.0.1-0.20250516044211-bc4fb8f5a1a7/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From db71fc3ba7b802955ac580f8d8413b31bde933c2 Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Sat, 17 May 2025 10:49:02 -0700 Subject: [PATCH 109/206] feat(ui): upgraded htmlui to the latest version (#4575) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4f705666e6a..f75aa15e9a1 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250516044211-bc4fb8f5a1a7 + github.com/kopia/htmluibuild v0.0.1-0.20250517155403-843538c831d3 github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index 76d355dfb97..128228b329f 100644 --- a/go.sum +++ b/go.sum @@ -184,8 +184,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250516044211-bc4fb8f5a1a7 h1:R84hB/fvz/Ls2V+11kP4oVjyG6UaxnrmBwTj9Atlasg= -github.com/kopia/htmluibuild v0.0.1-0.20250516044211-bc4fb8f5a1a7/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250517155403-843538c831d3 h1:M0W+QrtRP/QPqh9mPhDjMpR7PSJdlXGjC92L72YsbYs= +github.com/kopia/htmluibuild v0.0.1-0.20250517155403-843538c831d3/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From 36a68abc45429aaea7685da7963a346ff33192aa Mon Sep 17 00:00:00 2001 From: remigius42 Date: Sat, 17 May 2025 23:50:51 +0200 Subject: [PATCH 110/206] fix(kopiaui): adjust handling of default repository (#4561) - Only create the default repository if no repositories are configured. - Don't open repository window at startup if repositories are configured. This introduces an additional env variable `KOPIA_CUSTOM_APPDATA` which is used in the tests but could be used in other scenarios as well. --- app/public/config.js | 2 +- app/public/electron.js | 5 +- app/tests/main.spec.js | 135 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 125 insertions(+), 17 deletions(-) diff --git a/app/public/config.js b/app/public/config.js index 2033b7319cd..1e8cb6a30ea 100644 --- a/app/public/config.js +++ b/app/public/config.js @@ -117,7 +117,7 @@ export function loadConfigs() { count++; }); - if (!configs["repository"]) { + if (count === 0) { configs["repository"] = true; firstRun = true; } diff --git a/app/public/electron.js b/app/public/electron.js index 33135b88d89..7a2e1e502e0 100644 --- a/app/public/electron.js +++ b/app/public/electron.js @@ -21,6 +21,9 @@ let tray = null let repositoryWindows = {}; let repoIDForWebContents = {}; +if (process.env.KOPIA_CUSTOM_APPDATA) { + app.setPath('appData', process.env.KOPIA_CUSTOM_APPDATA); +} if (isPortableConfig()) { // in portable mode, write cache under 'repositories' @@ -435,6 +438,7 @@ app.on('ready', () => { app.testHooks = { tray: tray, showRepoWindow: showRepoWindow, + allConfigs: allConfigs, } } @@ -582,6 +586,5 @@ function updateTrayContextMenu() { ] }, { label: 'Quit', role: 'quit' }, ]); - tray.setContextMenu(Menu.buildFromTemplate(template)); } diff --git a/app/tests/main.spec.js b/app/tests/main.spec.js index 3993416d99e..5e464a92c68 100644 --- a/app/tests/main.spec.js +++ b/app/tests/main.spec.js @@ -1,9 +1,16 @@ import { test, expect } from '@playwright/test' import { _electron as electron } from 'playwright' +import fs from 'fs'; +import os from 'os'; import path from 'path'; +const DEFAULT_REPO_ID = 'repository'; + let electronApp +let mainPath +let executablePath +let tmpAppDataDir function getKopiaUIDir() { switch (process.platform + "/" + process.arch) { @@ -44,22 +51,36 @@ function getExecutablePath(kopiauiDir) { } } -test.beforeAll(async () => { - const kopiauiDir = getKopiaUIDir(); - expect(kopiauiDir).not.toBeNull(); - - const mainPath = getMainPath(kopiauiDir); - const executablePath = getExecutablePath(kopiauiDir); - - console.log('main path', mainPath); - console.log('executable path', executablePath); +/** + * Creates a temporary application data directory along with the kopia + * directory for testing purposes. + * + * @returns {string} The path to the created temporary directory. + */ +function createTemporaryAppDataDir() { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kopia-test-')); + fs.mkdirSync(path.join(tmpDir, 'kopia')); + return tmpDir; +} - process.env.CI = 'e2e' - process.env.KOPIA_UI_TESTING = '1' - electronApp = await electron.launch({ +/** + * Launches a new instance of the Electron app with the given app data directory. + * + * Also captures page errors and console messages and logs them to the console. + * + * @param {string} appDataDir - the path to the app data directory + * @returns {Promise} - a promise that resolves to the launched app + */ +async function launchApp(appDataDir) { + const electronApp = await electron.launch({ args: [mainPath], executablePath: executablePath, + env: { + ...process.env, + KOPIA_CUSTOM_APPDATA: appDataDir, + } }) + electronApp.on('window', async (page) => { const filename = page.url()?.split('/').pop() console.log(`Window opened: ${filename}`) @@ -73,13 +94,49 @@ test.beforeAll(async () => { console.log(msg.text()) }) }) + + return electronApp; +} + +/** + * Waits for Kopia to start up by delaying for a specified duration. + * + * @returns {Promise} A promise that resolves after the delay. + */ +function waitForKopiaToStartup() { + return new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, 2500); + }); +} + +test.beforeAll(() => { + const kopiauiDir = getKopiaUIDir(); + expect(kopiauiDir).not.toBeNull(); + + mainPath = getMainPath(kopiauiDir); + executablePath = getExecutablePath(kopiauiDir); + + console.log('main path', mainPath); + console.log('executable path', executablePath); + + process.env.CI = 'e2e'; + process.env.KOPIA_UI_TESTING = '1'; +}) + +test.beforeEach(async () => { + tmpAppDataDir = createTemporaryAppDataDir(); }) -test.afterAll(async () => { - await electronApp.close() +test.afterEach(async () => { + await electronApp.close(); + fs.rmSync(tmpAppDataDir, { recursive: true, force: true }); }) -test('opens repository window', async () => { +test('opens repository window on first start', async () => { + electronApp = await launchApp(tmpAppDataDir); + await electronApp.evaluate(async ({app}) => { app.testHooks.showRepoWindow('repository'); }); @@ -100,3 +157,51 @@ test('opens repository window', async () => { return app.testHooks.tray.closeContextMenu(); }) }); + +test("adds default repository if no repository is configured", async () => { + electronApp = await launchApp(tmpAppDataDir); + + await waitForKopiaToStartup(); + + const configs = await electronApp.evaluate(async ({app}) => { + return app.testHooks.allConfigs(); + }) + expect(configs).toStrictEqual([DEFAULT_REPO_ID]); +}); + +test("doesn't open repository window if the default repository config exists", async () => { + fs.writeFileSync(path.join(tmpAppDataDir, 'kopia', `${DEFAULT_REPO_ID}.config`), ''); + + electronApp = await launchApp(tmpAppDataDir); + + await waitForKopiaToStartup(); + const windows = electronApp.windows(); + expect(windows).toHaveLength(0); +}); + +test.describe("when non-default repository config exists", () => { + const NON_DEFAULT_REPO_ID = 'repository-42'; + + test.beforeEach(async () => { + fs.writeFileSync(path.join(tmpAppDataDir, 'kopia', `${NON_DEFAULT_REPO_ID}.config`), ''); + }) + + test("doesn't open repository window if non-default repository config exists", async () => { + electronApp = await launchApp(tmpAppDataDir); + + await waitForKopiaToStartup(); + const windows = electronApp.windows(); + expect(windows).toHaveLength(0); + }); + + test("doesn't add default repository", async () => { + electronApp = await launchApp(tmpAppDataDir); + + await waitForKopiaToStartup(); + + const configs = await electronApp.evaluate(async ({app}) => { + return app.testHooks.allConfigs(); + }) + expect(configs).toStrictEqual([NON_DEFAULT_REPO_ID]); + }); +}) From ccf262113369987866a827c64827ea104fed38be Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Sat, 17 May 2025 15:41:37 -0700 Subject: [PATCH 111/206] feat(ui): upgraded htmlui to the latest version (#4577) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f75aa15e9a1..ace8efe6206 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250517155403-843538c831d3 + github.com/kopia/htmluibuild v0.0.1-0.20250517180012-ff76023b3738 github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index 128228b329f..c1f46c30a82 100644 --- a/go.sum +++ b/go.sum @@ -184,8 +184,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250517155403-843538c831d3 h1:M0W+QrtRP/QPqh9mPhDjMpR7PSJdlXGjC92L72YsbYs= -github.com/kopia/htmluibuild v0.0.1-0.20250517155403-843538c831d3/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250517180012-ff76023b3738 h1:0NuqjSAtrmvAwIq6U8EwgaEJhTJEjVeYdXhUJD2Dqxs= +github.com/kopia/htmluibuild v0.0.1-0.20250517180012-ff76023b3738/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From c4f38ea7286884dc24cbc714dd0b90afd0b1c145 Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Sat, 17 May 2025 18:17:34 -0700 Subject: [PATCH 112/206] chore(ci): auto-generate clean htmlui changelog (#4578) --- .chglog/CHANGELOG_HTMLUI.tpl.md | 9 +++++ .chglog/config-htmlui.yml | 64 +++++++++++++++++++++++++++++++++ .chglog/config.yml | 3 -- Makefile | 1 + tools/htmlui_changelog.sh | 58 ++++++++++++++++++++++++++++++ 5 files changed, 132 insertions(+), 3 deletions(-) create mode 100755 .chglog/CHANGELOG_HTMLUI.tpl.md create mode 100755 .chglog/config-htmlui.yml create mode 100755 tools/htmlui_changelog.sh diff --git a/.chglog/CHANGELOG_HTMLUI.tpl.md b/.chglog/CHANGELOG_HTMLUI.tpl.md new file mode 100755 index 00000000000..2f181863a4d --- /dev/null +++ b/.chglog/CHANGELOG_HTMLUI.tpl.md @@ -0,0 +1,9 @@ +{{ range .Versions }} +### Graphical User Interface + +{{ range .CommitGroups -}} +{{ range .Commits -}} +* {{ if eq .Type "feat" }}**New Feature** {{ end }}{{ .Subject }} by {{ .Author.Name}} +{{ end -}} +{{ end -}} +{{ end -}} \ No newline at end of file diff --git a/.chglog/config-htmlui.yml b/.chglog/config-htmlui.yml new file mode 100755 index 00000000000..302873f6595 --- /dev/null +++ b/.chglog/config-htmlui.yml @@ -0,0 +1,64 @@ +style: github +template: CHANGELOG_HTMLUI.tpl.md +info: + title: CHANGELOG + repository_url: https://github.com/kopia/htmlui +options: + commits: + filters: + Scope: + - cli + - kopiaui + - general + - repository + - server + - providers + - snapshots + - testing + - lint + - infra + - ci + - notifications + - ui + commit_groups: + sort_by: Custom + group_by: "Scope" + title_maps: + # must match .github/workflows/check-pr-title.yml + # app|cli|ui|repository|server|providers|deps|deps-dev|site|ci|infra|general + kopiaui: KopiaUI App + cli: Command-Line Interface + ui: Graphical User Interface + lint: Linter + deps: Dependencies + snapshots: Snapshots + deps-dev: Development Dependencies + infra: Infrastructure + general: General Improvements + providers: Storage Providers + notifications: Notifications + ci: CI/CD + title_order: + - cli + - kopiaui + - general + - repository + - server + - snapshots + - providers + - notifications + - deps + - testing + - lint + - deps-dev + - infra + - ci + header: + pattern: "^(\\w*)(?:\\(([\\w\\$\\.\\-\\*\\s]*)\\))?\\:\\s(.*)$" + pattern_maps: + - Type + - Scope + - Subject + notes: + keywords: + - BREAKING CHANGE \ No newline at end of file diff --git a/.chglog/config.yml b/.chglog/config.yml index 07969ed72e7..b9a449742a8 100755 --- a/.chglog/config.yml +++ b/.chglog/config.yml @@ -16,12 +16,9 @@ options: - snapshots - testing - lint - - deps - - deps-dev - infra - ci - notifications - - ui commit_groups: sort_by: Custom group_by: "Scope" diff --git a/Makefile b/Makefile index 945b2ad7bb0..580193c5305 100644 --- a/Makefile +++ b/Makefile @@ -458,6 +458,7 @@ ifeq ($(CI_TAG),) else $(gitchglog) $(CI_TAG) > dist/change_log.md endif + gitchglog=$(gitchglog) $(CURDIR)/tools/htmlui_changelog.sh dist/change_log.md push-github-release: ifneq ($(GH_RELEASE_REPO),) diff --git a/tools/htmlui_changelog.sh b/tools/htmlui_changelog.sh new file mode 100755 index 00000000000..92b9c230d53 --- /dev/null +++ b/tools/htmlui_changelog.sh @@ -0,0 +1,58 @@ +#!/bin/sh +if [ -z "$CI_TAG" ]; then + echo "CI_TAG is not set. Looking for previous tag." + start_commit=$(git describe --tags --abbrev=0 HEAD^) + end_commit=HEAD +else + echo "CI_TAG is set to $CI_TAG. Using it as the start commit." + start_commit=$(git describe --tags --abbrev=0 $CI_TAG^) + end_commit=$CI_TAG +fi + +echo "Generating changelog from $start_commit to $end_commit" + +toolsdir=$(realpath $(dirname $0)) +config_file="$toolsdir/../.chglog/config-htmlui.yml" +output_file=$1 + +old_new_htmluibuild_hash=$(git diff $start_commit $end_commit -- go.mod | grep htmluibuild | cut -f 2 -d' ' | cut -f3 -d'-') +if [ -z "$old_new_htmluibuild_hash" ]; then + echo "No changes found in htmluibuild between $start_commit and $end_commit" + exit 1 +fi + + +# extract the old and new htmluibuild hashes +old_htmluibuild_hash=$(echo $old_new_htmluibuild_hash | cut -f1 -d " ") +new_htmluibuild_hash=$(echo $old_new_htmluibuild_hash | cut -f2 -d " ") + +echo "old_htmluibuild_hash: $old_htmluibuild_hash" +echo "new_htmluibuild_hash: $new_htmluibuild_hash" + +# shallow clone of htmluibuild repo +htmluibuild_git_dir=/tmp/tmp-htmluibuild +if [ -d $htmluibuild_git_dir ]; then + rm -rf $htmluibuild_git_dir +fi + +git clone --filter=blob:none --no-checkout --single-branch --branch main https://github.com/kopia/htmluibuild $htmluibuild_git_dir + +# extract htmlui hashes from the htmluibuild repo commit messages (all automated) +old_htmlui_hash=$(cd $htmluibuild_git_dir && git show $old_htmluibuild_hash | grep "HTMLUI update for" | cut -d / -f7) +new_htmlui_hash=$(cd $htmluibuild_git_dir && git show $new_htmluibuild_hash | grep "HTMLUI update for" | cut -d / -f7) + +# shallow clone of htmlui repo +htmlui_git_dir=/tmp/tmp-htmlui +if [ -d $htmlui_git_dir ]; then + rm -rf $htmlui_git_dir +fi + +git clone --filter=blob:none --no-checkout --single-branch --branch main https://github.com/kopia/htmlui $htmlui_git_dir + +(cd $htmlui_git_dir && + git tag v0.1.0 $old_htmlui_hash -m "hash $old_htmlui_hash" && + git tag v0.2.0 $new_htmlui_hash -m "hash $new_htmlui_hash" && + $gitchglog --sort=semver --config=$config_file v0.2.0) >> $output_file + +rm -rf $htmlui_git_dir +rm -rf $htmluibuild_git_dir \ No newline at end of file From ba29f2cb0006ab1db5013e1acc6b6347286e1cfd Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Sat, 17 May 2025 18:53:50 -0700 Subject: [PATCH 113/206] fix(ci): fix HTMLUI changelog (#4579) --- tools/htmlui_changelog.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/htmlui_changelog.sh b/tools/htmlui_changelog.sh index 92b9c230d53..5e0a3ff4256 100755 --- a/tools/htmlui_changelog.sh +++ b/tools/htmlui_changelog.sh @@ -1,4 +1,6 @@ #!/bin/sh +set -xe + if [ -z "$CI_TAG" ]; then echo "CI_TAG is not set. Looking for previous tag." start_commit=$(git describe --tags --abbrev=0 HEAD^) @@ -50,6 +52,8 @@ fi git clone --filter=blob:none --no-checkout --single-branch --branch main https://github.com/kopia/htmlui $htmlui_git_dir (cd $htmlui_git_dir && + git config user.email "builder@kopia.io" && + git config user.name "Kopia Builder" && git tag v0.1.0 $old_htmlui_hash -m "hash $old_htmlui_hash" && git tag v0.2.0 $new_htmlui_hash -m "hash $new_htmlui_hash" && $gitchglog --sort=semver --config=$config_file v0.2.0) >> $output_file From 496f2d5d96a27e0913b59cebd9b2509bca1896f2 Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Sun, 18 May 2025 18:56:17 -0700 Subject: [PATCH 114/206] build(deps): updated all dependencies of KopiaUI app (#4580) --- app/{notarize.cjs => notarize.mjs} | 10 +- app/package-lock.json | 6291 ++++++---------------------- app/package.json | 33 +- app/{sign.cjs => sign.mjs} | 5 +- tools/gettool/checksums.txt | 12 +- tools/tools.mk | 2 +- 6 files changed, 1218 insertions(+), 5135 deletions(-) rename app/{notarize.cjs => notarize.mjs} (79%) rename app/{sign.cjs => sign.mjs} (93%) diff --git a/app/notarize.cjs b/app/notarize.mjs similarity index 79% rename from app/notarize.cjs rename to app/notarize.mjs index 113b483f356..722180c55d6 100644 --- a/app/notarize.cjs +++ b/app/notarize.mjs @@ -1,9 +1,9 @@ -require('dotenv').config(); -const { notarize } = require('@electron/notarize'); -const fs = require('fs'); -const crypto = require('crypto'); +import 'dotenv/config'; +import { notarize } from '@electron/notarize'; +import fs from 'fs'; +import crypto from 'crypto'; -exports.default = async function notarizing(context) { +export default async function notarizing(context) { const { electronPlatformName, appOutDir } = context; if (electronPlatformName !== 'darwin') { return; diff --git a/app/package-lock.json b/app/package-lock.json index 4229009865d..4996c38f832 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,7 +1,7 @@ { "name": "kopia-ui", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -10,22 +10,21 @@ "license": "Apache-2.0", "dependencies": { "auto-launch": "^5.0.6", - "electron-log": "^5.2.4", - "electron-store": "^10.0.0", - "electron-updater": "^6.3.9", + "electron-log": "^5.4.0", + "electron-store": "^10.0.1", + "electron-updater": "^6.6.2", "minimist": "^1.2.8", - "semver": "^7.6.3", - "uuid": "^11.0.3" + "semver": "^7.7.2", + "uuid": "^11.1.0" }, "devDependencies": { - "@electron/notarize": "^2.5.0", - "@playwright/test": "^1.49.1", + "@electron/notarize": "^3.0.1", + "@playwright/test": "^1.52.0", "asar": "^3.2.0", "concurrently": "^9.1.2", - "dotenv": "^16.4.7", - "electron": "^33.2.1", - "electron-builder": "^v26.0.0-alpha.8", - "electron-store": "^10.0.0", + "dotenv": "^16.5.0", + "electron": "^36.2.1", + "electron-builder": "^26.0.12", "playwright": "^1.37.1", "playwright-core": "^1.35.1" } @@ -35,6 +34,7 @@ "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" @@ -48,10 +48,11 @@ } }, "node_modules/@electron/asar": { - "version": "3.2.17", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.17.tgz", - "integrity": "sha512-OcWImUI686w8LkghQj9R2ynZ2ME693Ek6L1SiaAgqGKzBaTIZw3fHDqN82Rcl+EU1Gm9EgkJ5KLIY/q5DCRbbA==", + "version": "3.2.18", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.18.tgz", + "integrity": "sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^5.0.0", "glob": "^7.1.6", @@ -69,6 +70,7 @@ "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.1", "fs-extra": "^9.0.1", @@ -78,47 +80,12 @@ "electron-fuses": "dist/bin.js" } }, - "node_modules/@electron/fuses/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/fuses/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/fuses/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@electron/get": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", - "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", @@ -135,20 +102,57 @@ "global-agent": "^3.0.0" } }, + "node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/@electron/get/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, + "node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/@electron/node-gyp": { "version": "10.2.0-electron.1", "resolved": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", - "integrity": "sha512-CrYo6TntjpoMO1SHjl5Pa/JoUsECNqNdB7Kx49WLQpWzPw53eEITJ2Hs9fh/ryUYDn4pxZz11StaBYBrLFJdqg==", + "integrity": "sha512-lBSgDMQqt7QWMuIjS8zNAq5FI5o5RVBAcJUGWGI6GgoQITJt3msAkUrHp8YHj3RTVE+h70ndqMGqURjp3IfRyQ==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -173,6 +177,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -183,6 +188,7 @@ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -202,6 +208,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -210,53 +217,17 @@ } }, "node_modules/@electron/notarize": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", - "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-3.0.1.tgz", + "integrity": "sha512-5xzcOwvMGNjkSk7s0sPx4XcKWei9FYk4f2S5NkSorWW0ce5yktTOtlPa0W5yQHcREILh+C3JdH+t+M637g9TmQ==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", + "debug": "^4.4.0", "promise-retry": "^2.0.1" }, "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/notarize/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/notarize/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" + "node": ">= 22.12.0" } }, "node_modules/@electron/osx-sign": { @@ -264,6 +235,7 @@ "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "compare-version": "^0.1.2", "debug": "^4.3.4", @@ -285,6 +257,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -299,6 +272,7 @@ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8.0.0" }, @@ -306,32 +280,12 @@ "url": "https://github.com/sponsors/gjtorikian/" } }, - "node_modules/@electron/osx-sign/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/osx-sign/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@electron/rebuild": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.0.tgz", "integrity": "sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==", "dev": true, + "license": "MIT", "dependencies": { "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", "@malept/cross-spawn-promise": "^2.0.0", @@ -360,6 +314,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -369,32 +324,12 @@ "node": ">=12" } }, - "node_modules/@electron/rebuild/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/rebuild/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@electron/universal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", "dev": true, + "license": "MIT", "dependencies": { "@electron/asar": "^3.2.7", "@malept/cross-spawn-promise": "^2.0.0", @@ -413,15 +348,17 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -431,23 +368,12 @@ "node": ">=14.14" } }, - "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/@electron/universal/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -458,26 +384,58 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=14.14" } }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -495,6 +453,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -507,6 +466,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -518,13 +478,15 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -542,6 +504,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -557,6 +520,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -584,6 +548,7 @@ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" } ], + "license": "Apache-2.0", "dependencies": { "cross-spawn": "^7.0.1" }, @@ -596,6 +561,7 @@ "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", @@ -606,47 +572,12 @@ "node": ">= 10.0.0" } }, - "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@npmcli/fs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, + "license": "ISC", "dependencies": { "@gar/promisify": "^1.1.3", "semver": "^7.3.5" @@ -661,6 +592,7 @@ "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, + "license": "MIT", "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -674,6 +606,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -686,18 +619,20 @@ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" } }, "node_modules/@playwright/test": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", - "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", + "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright": "1.49.1" + "playwright": "1.52.0" }, "bin": { "playwright": "cli.js" @@ -711,6 +646,7 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -723,6 +659,7 @@ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -735,6 +672,7 @@ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } @@ -744,6 +682,7 @@ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -756,73 +695,73 @@ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/ms": "*" } }, - "node_modules/@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true, - "optional": true - }, "node_modules/@types/fs-extra": { "version": "9.0.13", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { - "@types/events": "*", "@types/minimatch": "*", "@types/node": "*" } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "22.15.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.18.tgz", + "integrity": "sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, "node_modules/@types/plist": { @@ -830,6 +769,7 @@ "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*", @@ -837,26 +777,29 @@ } }, "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/verror": { - "version": "1.10.10", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", - "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" @@ -867,6 +810,7 @@ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -875,28 +819,32 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/agent-base": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dev": true, + "license": "MIT", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -909,6 +857,7 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -922,6 +871,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -937,7 +887,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -951,15 +901,15 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dev": true, + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -970,13 +920,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "license": "MIT" }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -986,6 +937,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -995,6 +947,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1009,16 +962,18 @@ "version": "5.0.0-alpha.12", "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/app-builder-lib": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.0.0-alpha.8.tgz", - "integrity": "sha512-IvvGAa/RXwuNPiSckIBPjBxI4et8PWb+TsJnhKa/XtxOH64ncs6hDtV7bSxIeUmbvUj3R8dm32dej7UO0Cgtng==", + "version": "26.0.12", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.0.12.tgz", + "integrity": "sha512-+/CEPH1fVKf6HowBUs6LcAIoRcjeqgvAeoSE+cl7Y7LndyQ9ViGPYibNk7wmhMHzNgHIuIbw4nWADPO+4mjgWw==", "dev": true, + "license": "MIT", "dependencies": { "@develar/schema-utils": "~2.6.5", - "@electron/asar": "3.2.17", + "@electron/asar": "3.2.18", "@electron/fuses": "^1.8.0", "@electron/notarize": "2.5.0", "@electron/osx-sign": "1.3.1", @@ -1027,16 +982,15 @@ "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "26.0.0-alpha.8", - "builder-util-runtime": "9.3.0-alpha.0", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", "chromium-pickle-js": "^0.2.0", "config-file-ts": "0.2.8-rc1", "debug": "^4.3.4", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", - "electron-publish": "26.0.0-alpha.8", + "electron-publish": "26.0.11", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", "is-ci": "^3.0.0", @@ -1045,65 +999,75 @@ "json5": "^2.2.3", "lazy-val": "^1.0.5", "minimatch": "^10.0.0", + "plist": "3.1.0", "resedit": "^1.7.0", "semver": "^7.3.8", "tar": "^6.1.12", - "temp-file": "^3.4.0" + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "dmg-builder": "26.0.0-alpha.8", - "electron-builder-squirrel-windows": "26.0.0-alpha.8" - } - }, - "node_modules/app-builder-lib/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "dmg-builder": "26.0.12", + "electron-builder-squirrel-windows": "26.0.12" } }, - "node_modules/app-builder-lib/node_modules/builder-util-runtime": { - "version": "9.3.0-alpha.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz", - "integrity": "sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==", + "node_modules/app-builder-lib/node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" }, "engines": { - "node": ">=12.0.0" + "node": ">= 10.0.0" } }, - "node_modules/app-builder-lib/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "node_modules/app-builder-lib/node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/app-builder-lib/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/app-builder-lib/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=12" } }, "node_modules/app-builder-lib/node_modules/minimatch": { @@ -1111,6 +1075,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1121,104 +1086,24 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/app-builder-lib/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/applescript": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz", - "integrity": "sha1-u4evVoytA0pOSMS9r2Bno6JwExc=" - }, - "node_modules/archiver": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", - "dev": true, - "peer": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } + "integrity": "sha512-yvtNHdWvtbYEiIazXAdp/NY+BBb65/DAseqlNiJQjOx9DynuzOYDbVLBJvuc0ve0VL9x6B3OHF6eH52y9hCBtQ==" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/asar": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", + "deprecated": "Please use @electron/asar moving forward. There is no API change, just a package name change", "dev": true, + "license": "MIT", "dependencies": { "chromium-pickle-js": "^0.2.0", "commander": "^5.0.0", @@ -1240,6 +1125,7 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=0.8" @@ -1250,6 +1136,7 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=8" @@ -1259,13 +1146,15 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/async-exit-hook": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1274,13 +1163,15 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 4.0.0" } @@ -1289,7 +1180,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz", "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==", - "dev": true, "dependencies": { "stubborn-fs": "^1.2.5", "when-exit": "^2.1.1" @@ -1299,6 +1189,7 @@ "version": "5.0.6", "resolved": "https://registry.npmjs.org/auto-launch/-/auto-launch-5.0.6.tgz", "integrity": "sha512-OgxiAm4q9EBf9EeXdPBiVNENaWE3jUZofwrhAkWjHDYGezu1k3FRZHU8V2FBxGuSJOHzKmTJEd0G7L7/0xDGFA==", + "license": "MIT", "dependencies": { "applescript": "^1.0.0", "mkdirp": "^0.5.1", @@ -1311,10 +1202,11 @@ } }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -1334,39 +1226,28 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5" - } - }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, + "license": "MIT", "optional": true }, "node_modules/brace-expansion": { @@ -1374,6 +1255,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1398,6 +1280,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1408,6 +1291,7 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -1416,21 +1300,22 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/builder-util": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.0.0-alpha.8.tgz", - "integrity": "sha512-qQLArPCYUvlx1Ess7Bwsdbx7F4lnPRZBMOeoVuofcdBWIg1HbGdgYp9I0VNcD2O9D2+lVUHI1gSkCj03oRXRnQ==", + "version": "26.0.11", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.0.11.tgz", + "integrity": "sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA==", "dev": true, + "license": "MIT", "dependencies": { "@types/debug": "^4.1.6", "7zip-bin": "~5.2.0", "app-builder-bin": "5.0.0-alpha.12", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.3.0-alpha.0", + "builder-util-runtime": "9.3.1", "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", + "cross-spawn": "^7.0.6", "debug": "^4.3.4", "fs-extra": "^10.1.0", "http-proxy-agent": "^7.0.0", @@ -1440,26 +1325,15 @@ "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" } }, "node_modules/builder-util-runtime": { - "version": "9.2.10", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.10.tgz", - "integrity": "sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==", - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/builder-util/node_modules/builder-util-runtime": { - "version": "9.3.0-alpha.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz", - "integrity": "sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==", - "dev": true, + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.1.tgz", + "integrity": "sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==", + "license": "MIT", "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" @@ -1473,6 +1347,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -1482,32 +1357,12 @@ "node": ">=12" } }, - "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/builder-util/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/cacache": { "version": "16.1.3", "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", @@ -1537,6 +1392,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1547,6 +1403,7 @@ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1566,6 +1423,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } @@ -1575,6 +1433,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1587,6 +1446,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -1599,15 +1459,17 @@ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, + "license": "MIT", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -1621,11 +1483,26 @@ "node": ">=8" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1637,11 +1514,25 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -1649,8 +1540,9 @@ "node_modules/chromium-pickle-js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", - "dev": true + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" }, "node_modules/ci-info": { "version": "3.9.0", @@ -1663,6 +1555,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } @@ -1672,6 +1565,7 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1681,6 +1575,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -1693,6 +1588,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -1705,6 +1601,7 @@ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "slice-ansi": "^3.0.0", @@ -1722,6 +1619,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -1736,6 +1634,7 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } @@ -1745,6 +1644,7 @@ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" }, @@ -1757,6 +1657,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1768,13 +1669,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1787,6 +1690,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -1796,37 +1700,24 @@ "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/compress-commons": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" }, "node_modules/concurrently": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.2.tgz", "integrity": "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "lodash": "^4.17.21", @@ -1847,45 +1738,21 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/concurrently/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/conf": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/conf/-/conf-13.0.1.tgz", - "integrity": "sha512-l9Uwc9eOnz39oADzGO2cSBDi7siv8lwO+31ocQ2nOJijnDiW3pxqm9VV10DPYUO28wW83DjABoUqY1nfHRR2hQ==", - "dev": true, + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-13.1.0.tgz", + "integrity": "sha512-Bi6v586cy1CoTFViVO4lGTtx780lfF96fUmS1lSX6wpZf6330NvHUu6fReVuDP1de8Mg0nkZb01c8tAQdz1o3w==", + "license": "MIT", "dependencies": { - "ajv": "^8.16.0", + "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "atomically": "^2.0.3", "debounce-fn": "^6.0.0", "dot-prop": "^9.0.0", "env-paths": "^3.0.0", "json-schema-typed": "^8.0.1", - "semver": "^7.6.2", - "uint8array-extras": "^1.1.0" + "semver": "^7.6.3", + "uint8array-extras": "^1.4.0" }, "engines": { "node": ">=18" @@ -1895,15 +1762,15 @@ } }, "node_modules/conf/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dev": true, + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -1914,7 +1781,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -1926,13 +1793,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "license": "MIT" }, "node_modules/config-file-ts": { "version": "0.2.8-rc1", "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", "integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==", "dev": true, + "license": "MIT", "dependencies": { "glob": "^10.3.12", "typescript": "^5.4.3" @@ -1943,6 +1811,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1952,6 +1821,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -1972,6 +1842,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1987,6 +1858,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -1995,50 +1867,36 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "dev": true, + "license": "MIT", + "optional": true }, "node_modules/crc": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "buffer": "^5.1.0" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "peer": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", "dev": true, - "peer": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2052,7 +1910,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-6.0.0.tgz", "integrity": "sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==", - "dev": true, + "license": "MIT", "dependencies": { "mimic-function": "^5.0.0" }, @@ -2064,11 +1922,12 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2084,6 +1943,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -2099,6 +1959,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2111,6 +1972,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -2123,17 +1985,39 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2149,15 +2033,17 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=8" } @@ -2167,6 +2053,7 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/dir-compare": { @@ -2174,20 +2061,22 @@ "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", "dev": true, + "license": "MIT", "dependencies": { "minimatch": "^3.0.5", "p-limit": "^3.1.0 " } }, "node_modules/dmg-builder": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.0.0-alpha.8.tgz", - "integrity": "sha512-H53RkHuUBIgiZtTTdjGigD5BVKYoH6t7Y+ZNmjdzMuptL6rCni7K0mrqvVycCkYRvdeM8BWZeUvw4iOwRQIhmQ==", + "version": "26.0.12", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.0.12.tgz", + "integrity": "sha512-59CAAjAhTaIMCN8y9kD573vDkxbs1uhDcrFLHSgutYdPcGOU35Rf95725snvzEOy4BFB7+eLJ8djCNPmGwG67w==", "dev": true, + "license": "MIT", "dependencies": { - "app-builder-lib": "26.0.0-alpha.8", - "builder-util": "26.0.0-alpha.8", - "builder-util-runtime": "9.3.0-alpha.0", + "app-builder-lib": "26.0.12", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" @@ -2196,24 +2085,12 @@ "dmg-license": "^1.0.11" } }, - "node_modules/dmg-builder/node_modules/builder-util-runtime": { - "version": "9.3.0-alpha.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz", - "integrity": "sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/dmg-builder/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2223,32 +2100,12 @@ "node": ">=12" } }, - "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/dmg-builder/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/dmg-license": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2274,7 +2131,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", - "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^4.18.2" }, @@ -2285,23 +2142,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dot-prop/node_modules/type-fest": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.21.0.tgz", - "integrity": "sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -2314,6 +2160,7 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dotenv": "^16.4.5" }, @@ -2324,17 +2171,34 @@ "url": "https://dotenvx.com" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.10", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -2346,14 +2210,15 @@ } }, "node_modules/electron": { - "version": "33.2.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-33.2.1.tgz", - "integrity": "sha512-SG/nmSsK9Qg1p6wAW+ZfqU+AV8cmXMTIklUL18NnOKfZLlum4ZsDoVdmmmlL39ZmeCaq27dr7CgslRPahfoVJg==", + "version": "36.2.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-36.2.1.tgz", + "integrity": "sha512-mm1Y+Ms46xcOTA69h8hpqfX392HfV4lga9aEkYkd/Syx1JBStvcACOIouCgGrnZpxNZPVS1jM8NTcMkNjuK6BQ==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "@electron/get": "^2.0.0", - "@types/node": "^20.9.0", + "@types/node": "^22.7.7", "extract-zip": "^2.0.1" }, "bin": { @@ -2364,16 +2229,17 @@ } }, "node_modules/electron-builder": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.0.0-alpha.8.tgz", - "integrity": "sha512-sx9ObBOEPiHdmDkTRehZWZG2Z26dL6v+Ue3PMji6bj6q5EwY+3h8Q0qZk5JEvUYO2LRuGFbkYpnzdOZrbxRd7A==", + "version": "26.0.12", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.0.12.tgz", + "integrity": "sha512-cD1kz5g2sgPTMFHjLxfMjUK5JABq3//J4jPswi93tOPFz6btzXYtK5NrDt717NRbukCUDOrrvmYVOWERlqoiXA==", "dev": true, + "license": "MIT", "dependencies": { - "app-builder-lib": "26.0.0-alpha.8", - "builder-util": "26.0.0-alpha.8", - "builder-util-runtime": "9.3.0-alpha.0", + "app-builder-lib": "26.0.12", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", "chalk": "^4.1.2", - "dmg-builder": "26.0.0-alpha.8", + "dmg-builder": "26.0.12", "fs-extra": "^10.1.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", @@ -2389,67 +2255,16 @@ } }, "node_modules/electron-builder-squirrel-windows": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.0.0-alpha.8.tgz", - "integrity": "sha512-ANGjYE4ixY1shR8L6ehy/ELnC2Q758LA4qa+xIBSP8fwmy/tug2lDIz3uMwrEGTOscFfZVhOyehOFbwnJ1NR4g==", - "dev": true, - "peer": true, - "dependencies": { - "app-builder-lib": "26.0.0-alpha.8", - "archiver": "^5.3.1", - "builder-util": "26.0.0-alpha.8", - "fs-extra": "^10.1.0" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "version": "26.0.12", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.0.12.tgz", + "integrity": "sha512-kpwXM7c/ayRUbYVErQbsZ0nQZX4aLHQrPEG9C4h9vuJCXylwFH8a7Jgi2VpKIObzCXO7LKHiCw4KdioFLFOgqA==", "dev": true, + "license": "MIT", "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-builder/node_modules/builder-util-runtime": { - "version": "9.3.0-alpha.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz", - "integrity": "sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==", - "dev": true, "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" + "app-builder-lib": "26.0.12", + "builder-util": "26.0.11", + "electron-winstaller": "5.4.0" } }, "node_modules/electron-builder/node_modules/fs-extra": { @@ -2457,6 +2272,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2466,44 +2282,25 @@ "node": ">=12" } }, - "node_modules/electron-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/electron-log": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.2.4.tgz", - "integrity": "sha512-iX12WXc5XAaKeHg2QpiFjVwL+S1NVHPFd3V5RXtCmKhpAzXsVQnR3UEc0LovM6p6NkUQxDWnkdkaam9FNUVmCA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.4.0.tgz", + "integrity": "sha512-AXI5OVppskrWxEAmCxuv8ovX+s2Br39CpCAgkGMNHQtjYT3IiVbSQTncEjFVGPgoH35ZygRm/mvUMBDWwhRxgg==", + "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/electron-publish": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.0.0-alpha.8.tgz", - "integrity": "sha512-IGHPQkfSL+LYAIiqJ2E1mVTxNPFh4XRvQ+OPmBFrgpZrR32NrMlxssUyx1B0N1bGLjevjBMMitlwKFNM5WPnXg==", + "version": "26.0.11", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.0.11.tgz", + "integrity": "sha512-a8QRH0rAPIWH9WyyS5LbNvW9Ark6qe63/LqDB7vu2JXYpi0Gma5Q60Dh4tmTqhOBQt0xsrzD8qE7C+D7j+B24A==", "dev": true, + "license": "MIT", "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "26.0.0-alpha.8", - "builder-util-runtime": "9.3.0-alpha.0", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", "chalk": "^4.1.2", "form-data": "^4.0.0", "fs-extra": "^10.1.0", @@ -2511,24 +2308,12 @@ "mime": "^2.5.2" } }, - "node_modules/electron-publish/node_modules/builder-util-runtime": { - "version": "9.3.0-alpha.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz", - "integrity": "sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/electron-publish/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2538,32 +2323,11 @@ "node": ">=12" } }, - "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-publish/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/electron-store": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-10.0.0.tgz", - "integrity": "sha512-BU/QZh+5twHBprRdLu3YZX/rIarmZzhTNpJvAvqG1/yN0mNCrsMh0kl7bM4xaUKDNRiHz1r7wP/7Prjh7cleIw==", - "dev": true, + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-10.0.1.tgz", + "integrity": "sha512-Ok0bF13WWdTzZi9rCtPN8wUfwx+yDMmV6PAnCMqjNRKEXHmklW/rV+6DofV/Vf5qoAh+Bl9Bj7dQ+0W+IL2psg==", + "license": "MIT", "dependencies": { "conf": "^13.0.0", "type-fest": "^4.20.0" @@ -2575,24 +2339,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/electron-store/node_modules/type-fest": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.21.0.tgz", - "integrity": "sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/electron-updater": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.3.9.tgz", - "integrity": "sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.6.2.tgz", + "integrity": "sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==", + "license": "MIT", "dependencies": { - "builder-util-runtime": "9.2.10", + "builder-util-runtime": "9.3.1", "fs-extra": "^10.1.0", "js-yaml": "^4.1.0", "lazy-val": "^1.0.5", @@ -2606,6 +2359,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2615,36 +2369,79 @@ "node": ">=12" } }, - "node_modules/electron-updater/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, "dependencies": { - "universalify": "^2.0.0" + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "node_modules/electron-updater/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">= 10.0.0" + "node": ">= 4.0.0" } }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -2655,6 +2452,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -2664,6 +2462,7 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2672,20 +2471,72 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2695,6 +2546,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=10" @@ -2704,16 +2556,18 @@ } }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -2737,25 +2591,44 @@ "engines": [ "node >=0.6.0" ], + "license": "MIT", "optional": true }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, + "license": "MIT", "dependencies": { "pend": "~1.2.0" } @@ -2765,6 +2638,7 @@ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } @@ -2774,6 +2648,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -2783,6 +2658,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2791,12 +2667,13 @@ } }, "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -2811,6 +2688,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -2819,38 +2697,35 @@ } }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "peer": true - }, "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=10" } }, "node_modules/fs-minipass": { @@ -2858,6 +2733,7 @@ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -2868,8 +2744,9 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.2", @@ -2877,6 +2754,7 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2886,41 +2764,70 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "optional": true + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -2935,7 +2842,9 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2956,6 +2865,7 @@ "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -2970,14 +2880,29 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2990,6 +2915,7 @@ "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -3011,42 +2937,57 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "optional": true, - "dependencies": { - "function-bind": "^1.1.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4.0" + "node": ">=8" } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, - "optional": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -3054,11 +2995,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3067,16 +3022,18 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -3090,6 +3047,7 @@ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -3103,6 +3061,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -3116,6 +3075,7 @@ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.0.0" } @@ -3125,6 +3085,7 @@ "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3142,6 +3103,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -3167,13 +3129,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -3183,6 +3147,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3191,13 +3156,16 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3207,13 +3175,15 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -3227,6 +3197,7 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, + "license": "MIT", "dependencies": { "ci-info": "^3.2.0" }, @@ -3239,6 +3210,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3248,6 +3220,7 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3256,13 +3229,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3270,18 +3245,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true - }, "node_modules/isbinaryfile": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.4.tgz", "integrity": "sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 18.0.0" }, @@ -3293,13 +3262,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -3315,6 +3286,7 @@ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -3332,6 +3304,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3343,31 +3316,35 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-typed": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.1.tgz", "integrity": "sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==", - "dev": true + "license": "BSD-2-Clause" }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, + "license": "ISC", "optional": true }, "node_modules/json5": { @@ -3375,6 +3352,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -3383,19 +3361,23 @@ } }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -3403,110 +3385,35 @@ "node_modules/lazy-val": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "license": "MIT" }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true, - "peer": true - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true, - "peer": true + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "license": "MIT" }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "peer": true - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true, - "peer": true + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -3523,6 +3430,7 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3532,6 +3440,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3544,6 +3453,7 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, + "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", @@ -3571,6 +3481,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -3583,6 +3494,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -3597,6 +3509,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -3610,6 +3523,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } @@ -3619,6 +3533,7 @@ "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "escape-string-regexp": "^4.0.0" @@ -3627,11 +3542,22 @@ "node": ">=10" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -3644,6 +3570,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3653,6 +3580,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -3665,6 +3593,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3673,7 +3602,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -3686,6 +3615,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -3695,6 +3625,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3706,6 +3637,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3715,6 +3647,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3727,6 +3660,7 @@ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3739,6 +3673,7 @@ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.1.6", "minipass-sized": "^1.0.3", @@ -3756,6 +3691,7 @@ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3768,6 +3704,7 @@ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3780,6 +3717,7 @@ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3792,6 +3730,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -3801,35 +3740,39 @@ } }, "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "version": "3.75.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", + "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -3842,13 +3785,15 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/node-api-version": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", - "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.3.5" } @@ -3858,6 +3803,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "^1.0.0" }, @@ -3868,21 +3814,12 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3895,6 +3832,7 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 0.4" @@ -3903,8 +3841,9 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -3914,6 +3853,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -3929,6 +3869,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -3952,6 +3893,7 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3961,6 +3903,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3976,6 +3919,7 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -3990,12 +3934,14 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4005,6 +3951,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4014,6 +3961,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -4029,13 +3977,15 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/path-scurry/node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -4045,6 +3995,7 @@ "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12", "npm": ">=6" @@ -4058,15 +4009,17 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/playwright": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", - "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", + "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.49.1" + "playwright-core": "1.52.0" }, "bin": { "playwright": "cli.js" @@ -4079,10 +4032,11 @@ } }, "node_modules/playwright-core": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", - "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", + "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", "dev": true, + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -4095,6 +4049,7 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, + "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -4104,27 +4059,52 @@ "node": ">=10.4.0" } }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/proc-log": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "dev": true, + "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "peer": true - }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -4133,13 +4113,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -4149,20 +4131,22 @@ } }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4172,6 +4156,7 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4184,6 +4169,7 @@ "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -4196,6 +4182,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -4205,44 +4192,12 @@ "node": ">= 6" } }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "peer": true, - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4251,7 +4206,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4261,6 +4216,7 @@ "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", "dev": true, + "license": "MIT", "dependencies": { "pe-library": "^0.4.1" }, @@ -4277,13 +4233,15 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, + "license": "MIT", "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -4296,6 +4254,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -4309,6 +4268,7 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -4319,6 +4279,7 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -4334,6 +4295,7 @@ "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -4348,20 +4310,15 @@ } }, "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4380,32 +4337,37 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", "dev": true, + "license": "WTFPL OR ISC", "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4418,6 +4380,7 @@ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/serialize-error": { @@ -4425,6 +4388,7 @@ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "type-fest": "^0.13.1" @@ -4436,11 +4400,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -4453,15 +4432,20 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4470,13 +4454,15 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -4489,6 +4475,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -4504,16 +4491,18 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -4528,6 +4517,7 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -4542,6 +4532,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -4554,6 +4545,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -4563,6 +4555,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -4572,13 +4565,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/ssri": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.1.1" }, @@ -4591,6 +4586,7 @@ "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -4600,6 +4596,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -4609,6 +4606,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4624,6 +4622,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4638,6 +4637,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4651,6 +4651,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4661,14 +4662,14 @@ "node_modules/stubborn-fs": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz", - "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==", - "dev": true + "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==" }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "debug": "^4.1.0" }, @@ -4677,24 +4678,19 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/tar": { @@ -4702,6 +4698,7 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -4714,28 +4711,12 @@ "node": ">=10" } }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "peer": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } @@ -4745,6 +4726,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -4752,11 +4734,27 @@ "node": ">=10" } }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/temp-file": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", "dev": true, + "license": "MIT", "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" @@ -4767,6 +4765,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4776,37 +4775,53 @@ "node": ">=12" } }, - "node_modules/temp-file/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", + "peer": true, "dependencies": { - "universalify": "^2.0.0" + "glob": "^7.1.3" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/temp-file/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", "dev": true, - "engines": { - "node": ">= 10.0.0" + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, "node_modules/tiny-typed-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", - "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==", + "license": "MIT" }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.14" } @@ -4816,6 +4831,7 @@ "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", "dev": true, + "license": "MIT", "dependencies": { "tmp": "^0.2.0" } @@ -4825,6 +4841,7 @@ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, + "license": "MIT", "bin": { "tree-kill": "cli.js" } @@ -4834,28 +4851,36 @@ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dev": true, + "license": "WTFPL", "dependencies": { "utf8-byte-length": "^1.0.1" } }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "optional": true, + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4865,10 +4890,10 @@ } }, "node_modules/uint8array-extras": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.3.0.tgz", - "integrity": "sha512-npBAT0ZIX6mAIG7SF6G4LF1BIoRx3h+HVajSplHx0XmOD0Ug4qio5Yhcajn72i5OEj/qkk1OFaYh2PhqHBV33w==", - "dev": true, + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz", + "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -4877,16 +4902,18 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" }, "node_modules/unique-filename": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, + "license": "ISC", "dependencies": { "unique-slug": "^3.0.0" }, @@ -4899,6 +4926,7 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -4907,18 +4935,19 @@ } }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/untildify": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", + "license": "MIT", "engines": { "node": ">=4" } @@ -4928,6 +4957,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -4936,22 +4966,25 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "dev": true + "dev": true, + "license": "(WTFPL OR MIT)" }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/uuid": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", - "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/esm/bin/uuid" } @@ -4961,6 +4994,7 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "assert-plus": "^1.0.0", @@ -4976,21 +5010,23 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/when-exit": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.3.tgz", - "integrity": "sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw==", - "dev": true + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.4.tgz", + "integrity": "sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==", + "license": "MIT" }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -5004,13 +5040,15 @@ "node_modules/winreg": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz", - "integrity": "sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs=" + "integrity": "sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA==", + "license": "BSD-2-Clause" }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5029,6 +5067,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5044,14 +5083,16 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0" } @@ -5061,6 +5102,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -5069,13 +5111,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -5094,6 +5138,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } @@ -5103,6 +5148,7 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -5113,3978 +5159,13 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zip-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", - "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", - "dev": true, - "peer": true, - "dependencies": { - "archiver-utils": "^3.0.4", - "compress-commons": "^4.1.2", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/archiver-utils": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", - "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.2.3", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - }, - "dependencies": { - "@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - } - }, - "@electron/asar": { - "version": "3.2.17", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.17.tgz", - "integrity": "sha512-OcWImUI686w8LkghQj9R2ynZ2ME693Ek6L1SiaAgqGKzBaTIZw3fHDqN82Rcl+EU1Gm9EgkJ5KLIY/q5DCRbbA==", - "dev": true, - "requires": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - } - }, - "@electron/fuses": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", - "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", - "dev": true, - "requires": { - "chalk": "^4.1.1", - "fs-extra": "^9.0.1", - "minimist": "^1.2.5" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - } - } - }, - "@electron/get": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", - "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "global-agent": "^3.0.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@electron/node-gyp": { - "version": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", - "integrity": "sha512-CrYo6TntjpoMO1SHjl5Pa/JoUsECNqNdB7Kx49WLQpWzPw53eEITJ2Hs9fh/ryUYDn4pxZz11StaBYBrLFJdqg==", - "dev": true, - "from": "@electron/node-gyp@git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", - "requires": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^8.1.0", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.2.1", - "nopt": "^6.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^2.0.2" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@electron/notarize": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", - "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@electron/osx-sign": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", - "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", - "dev": true, - "requires": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - } - } - }, - "@electron/rebuild": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.0.tgz", - "integrity": "sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==", - "dev": true, - "requires": { - "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "node-abi": "^3.45.0", - "node-api-version": "^0.2.0", - "ora": "^5.1.0", - "read-binary-file-arch": "^1.0.6", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - } - } - }, - "@electron/universal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", - "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", - "dev": true, - "requires": { - "@electron/asar": "^3.2.7", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "dir-compare": "^4.2.0", - "fs-extra": "^11.1.1", - "minimatch": "^9.0.3", - "plist": "^3.1.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - } - } - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - } - } - }, - "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@playwright/test": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", - "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", - "dev": true, - "requires": { - "playwright": "1.49.1" - } - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true, - "optional": true - }, - "@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "optional": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true, - "optional": true - }, - "@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true - }, - "@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/verror": { - "version": "1.10.10", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", - "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", - "dev": true, - "optional": true - }, - "@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true - }, - "7zip-bin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "dev": true - }, - "agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "app-builder-bin": { - "version": "5.0.0-alpha.12", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", - "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", - "dev": true - }, - "app-builder-lib": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.0.0-alpha.8.tgz", - "integrity": "sha512-IvvGAa/RXwuNPiSckIBPjBxI4et8PWb+TsJnhKa/XtxOH64ncs6hDtV7bSxIeUmbvUj3R8dm32dej7UO0Cgtng==", - "dev": true, - "requires": { - "@develar/schema-utils": "~2.6.5", - "@electron/asar": "3.2.17", - "@electron/fuses": "^1.8.0", - "@electron/notarize": "2.5.0", - "@electron/osx-sign": "1.3.1", - "@electron/rebuild": "3.7.0", - "@electron/universal": "2.0.1", - "@malept/flatpak-bundler": "^0.4.0", - "@types/fs-extra": "9.0.13", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "26.0.0-alpha.8", - "builder-util-runtime": "9.3.0-alpha.0", - "chromium-pickle-js": "^0.2.0", - "config-file-ts": "0.2.8-rc1", - "debug": "^4.3.4", - "dotenv": "^16.4.5", - "dotenv-expand": "^11.0.6", - "ejs": "^3.1.8", - "electron-publish": "26.0.0-alpha.8", - "fs-extra": "^10.1.0", - "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", - "isbinaryfile": "^5.0.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.3", - "lazy-val": "^1.0.5", - "minimatch": "^10.0.0", - "resedit": "^1.7.0", - "semver": "^7.3.8", - "tar": "^6.1.12", - "temp-file": "^3.4.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "builder-util-runtime": { - "version": "9.3.0-alpha.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz", - "integrity": "sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "sax": "^1.2.4" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - } - } - }, - "applescript": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz", - "integrity": "sha1-u4evVoytA0pOSMS9r2Bno6JwExc=" - }, - "archiver": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", - "dev": true, - "peer": true, - "requires": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - } - }, - "archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "peer": true, - "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "peer": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "asar": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", - "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "optional": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "optional": true - }, - "async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true - }, - "async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atomically": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz", - "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==", - "dev": true, - "requires": { - "stubborn-fs": "^1.2.5", - "when-exit": "^2.1.1" - } - }, - "auto-launch": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/auto-launch/-/auto-launch-5.0.6.tgz", - "integrity": "sha512-OgxiAm4q9EBf9EeXdPBiVNENaWE3jUZofwrhAkWjHDYGezu1k3FRZHU8V2FBxGuSJOHzKmTJEd0G7L7/0xDGFA==", - "requires": { - "applescript": "^1.0.0", - "mkdirp": "^0.5.1", - "path-is-absolute": "^1.0.0", - "untildify": "^3.0.2", - "winreg": "1.2.4" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5" - } - }, - "boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "builder-util": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.0.0-alpha.8.tgz", - "integrity": "sha512-qQLArPCYUvlx1Ess7Bwsdbx7F4lnPRZBMOeoVuofcdBWIg1HbGdgYp9I0VNcD2O9D2+lVUHI1gSkCj03oRXRnQ==", - "dev": true, - "requires": { - "@types/debug": "^4.1.6", - "7zip-bin": "~5.2.0", - "app-builder-bin": "5.0.0-alpha.12", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.3.0-alpha.0", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "debug": "^4.3.4", - "fs-extra": "^10.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "is-ci": "^3.0.0", - "js-yaml": "^4.1.0", - "sanitize-filename": "^1.6.3", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" - }, - "dependencies": { - "builder-util-runtime": { - "version": "9.3.0-alpha.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz", - "integrity": "sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "sax": "^1.2.4" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - } - } - }, - "builder-util-runtime": { - "version": "9.2.10", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.10.tgz", - "integrity": "sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==", - "requires": { - "debug": "^4.3.4", - "sax": "^1.2.4" - } - }, - "cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", - "dev": true - }, - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "optional": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - }, - "compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true - }, - "compress-commons": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", - "dev": true, - "peer": true, - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concurrently": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.2.tgz", - "integrity": "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==", - "dev": true, - "requires": { - "chalk": "^4.1.2", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "conf": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/conf/-/conf-13.0.1.tgz", - "integrity": "sha512-l9Uwc9eOnz39oADzGO2cSBDi7siv8lwO+31ocQ2nOJijnDiW3pxqm9VV10DPYUO28wW83DjABoUqY1nfHRR2hQ==", - "dev": true, - "requires": { - "ajv": "^8.16.0", - "ajv-formats": "^3.0.1", - "atomically": "^2.0.3", - "debounce-fn": "^6.0.0", - "dot-prop": "^9.0.0", - "env-paths": "^3.0.0", - "json-schema-typed": "^8.0.1", - "semver": "^7.6.2", - "uint8array-extras": "^1.1.0" - }, - "dependencies": { - "ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - } - }, - "env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "config-file-ts": { - "version": "0.2.8-rc1", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", - "integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==", - "dev": true, - "requires": { - "glob": "^10.3.12", - "typescript": "^5.4.3" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.1.0" - } - }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "peer": true - }, - "crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", - "dev": true, - "peer": true, - "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - } - }, - "cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debounce-fn": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-6.0.0.tgz", - "integrity": "sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==", - "dev": true, - "requires": { - "mimic-function": "^5.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "optional": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "optional": true - }, - "dir-compare": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", - "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.5", - "p-limit": "^3.1.0 " - } - }, - "dmg-builder": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.0.0-alpha.8.tgz", - "integrity": "sha512-H53RkHuUBIgiZtTTdjGigD5BVKYoH6t7Y+ZNmjdzMuptL6rCni7K0mrqvVycCkYRvdeM8BWZeUvw4iOwRQIhmQ==", - "dev": true, - "requires": { - "app-builder-lib": "26.0.0-alpha.8", - "builder-util": "26.0.0-alpha.8", - "builder-util-runtime": "9.3.0-alpha.0", - "dmg-license": "^1.0.11", - "fs-extra": "^10.1.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "dependencies": { - "builder-util-runtime": { - "version": "9.3.0-alpha.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz", - "integrity": "sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "sax": "^1.2.4" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - } - } - }, - "dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "optional": true, - "requires": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - } - }, - "dot-prop": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", - "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", - "dev": true, - "requires": { - "type-fest": "^4.18.2" - }, - "dependencies": { - "type-fest": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.21.0.tgz", - "integrity": "sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==", - "dev": true - } - } - }, - "dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "dev": true - }, - "dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "dev": true, - "requires": { - "dotenv": "^16.4.5" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "requires": { - "jake": "^10.8.5" - } - }, - "electron": { - "version": "33.2.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-33.2.1.tgz", - "integrity": "sha512-SG/nmSsK9Qg1p6wAW+ZfqU+AV8cmXMTIklUL18NnOKfZLlum4ZsDoVdmmmlL39ZmeCaq27dr7CgslRPahfoVJg==", - "dev": true, - "requires": { - "@electron/get": "^2.0.0", - "@types/node": "^20.9.0", - "extract-zip": "^2.0.1" - } - }, - "electron-builder": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.0.0-alpha.8.tgz", - "integrity": "sha512-sx9ObBOEPiHdmDkTRehZWZG2Z26dL6v+Ue3PMji6bj6q5EwY+3h8Q0qZk5JEvUYO2LRuGFbkYpnzdOZrbxRd7A==", - "dev": true, - "requires": { - "app-builder-lib": "26.0.0-alpha.8", - "builder-util": "26.0.0-alpha.8", - "builder-util-runtime": "9.3.0-alpha.0", - "chalk": "^4.1.2", - "dmg-builder": "26.0.0-alpha.8", - "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", - "lazy-val": "^1.0.5", - "simple-update-notifier": "2.0.0", - "yargs": "^17.6.2" - }, - "dependencies": { - "builder-util-runtime": { - "version": "9.3.0-alpha.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz", - "integrity": "sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "sax": "^1.2.4" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "electron-builder-squirrel-windows": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.0.0-alpha.8.tgz", - "integrity": "sha512-ANGjYE4ixY1shR8L6ehy/ELnC2Q758LA4qa+xIBSP8fwmy/tug2lDIz3uMwrEGTOscFfZVhOyehOFbwnJ1NR4g==", - "dev": true, - "peer": true, - "requires": { - "app-builder-lib": "26.0.0-alpha.8", - "archiver": "^5.3.1", - "builder-util": "26.0.0-alpha.8", - "fs-extra": "^10.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "peer": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "peer": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "peer": true - } - } - }, - "electron-log": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.2.4.tgz", - "integrity": "sha512-iX12WXc5XAaKeHg2QpiFjVwL+S1NVHPFd3V5RXtCmKhpAzXsVQnR3UEc0LovM6p6NkUQxDWnkdkaam9FNUVmCA==" - }, - "electron-publish": { - "version": "26.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.0.0-alpha.8.tgz", - "integrity": "sha512-IGHPQkfSL+LYAIiqJ2E1mVTxNPFh4XRvQ+OPmBFrgpZrR32NrMlxssUyx1B0N1bGLjevjBMMitlwKFNM5WPnXg==", - "dev": true, - "requires": { - "@types/fs-extra": "^9.0.11", - "builder-util": "26.0.0-alpha.8", - "builder-util-runtime": "9.3.0-alpha.0", - "chalk": "^4.1.2", - "form-data": "^4.0.0", - "fs-extra": "^10.1.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - }, - "dependencies": { - "builder-util-runtime": { - "version": "9.3.0-alpha.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz", - "integrity": "sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "sax": "^1.2.4" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - } - } - }, - "electron-store": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-10.0.0.tgz", - "integrity": "sha512-BU/QZh+5twHBprRdLu3YZX/rIarmZzhTNpJvAvqG1/yN0mNCrsMh0kl7bM4xaUKDNRiHz1r7wP/7Prjh7cleIw==", - "dev": true, - "requires": { - "conf": "^13.0.0", - "type-fest": "^4.20.0" - }, - "dependencies": { - "type-fest": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.21.0.tgz", - "integrity": "sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==", - "dev": true - } - } - }, - "electron-updater": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.3.9.tgz", - "integrity": "sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw==", - "requires": { - "builder-util-runtime": "9.2.10", - "fs-extra": "^10.1.0", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "lodash.escaperegexp": "^4.1.2", - "lodash.isequal": "^4.5.0", - "semver": "^7.6.3", - "tiny-typed-emitter": "^2.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "optional": true - }, - "exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - } - }, - "extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "optional": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - } - } - }, - "form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "peer": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "optional": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - } - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "optional": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "optional": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "optional": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "optional": true - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "requires": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "requires": { - "agent-base": "^7.1.2", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "optional": true, - "requires": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "requires": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - } - }, - "is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "requires": { - "ci-info": "^3.2.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true - }, - "isbinaryfile": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.4.tgz", - "integrity": "sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-schema-typed": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.1.tgz", - "integrity": "sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "optional": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" - }, - "lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "peer": true, - "requires": { - "readable-stream": "^2.0.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "peer": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true, - "peer": true - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true, - "peer": true - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true, - "peer": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "peer": true - }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true, - "peer": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } - } - }, - "matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "optional": true, - "requires": { - "escape-string-regexp": "^4.0.0" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true - }, - "node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "optional": true - }, - "node-api-version": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", - "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "peer": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "requires": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true - } - } - }, - "pe-library": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", - "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "playwright": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", - "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", - "dev": true, - "requires": { - "fsevents": "2.3.2", - "playwright-core": "1.49.1" - } - }, - "playwright-core": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", - "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", - "dev": true - }, - "plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "requires": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - } - }, - "proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "peer": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "read-binary-file-arch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", - "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "peer": true, - "requires": { - "minimatch": "^5.1.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resedit": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", - "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", - "dev": true, - "requires": { - "pe-library": "^0.4.1" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - } - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, - "optional": true - }, - "serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "optional": true, - "requires": { - "type-fest": "^0.13.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, - "requires": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "stubborn-fs": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz", - "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==", - "dev": true - }, - "sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "requires": { - "debug": "^4.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - } - } - }, - "tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "peer": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "requires": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - } - } - }, - "tiny-typed-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", - "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" - }, - "tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true - }, - "tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "requires": { - "tmp": "^0.2.0" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "optional": true - }, - "typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "dev": true - }, - "uint8array-extras": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.3.0.tgz", - "integrity": "sha512-npBAT0ZIX6mAIG7SF6G4LF1BIoRx3h+HVajSplHx0XmOD0Ug4qio5Yhcajn72i5OEj/qkk1OFaYh2PhqHBV33w==", - "dev": true - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "requires": { - "unique-slug": "^3.0.0" - } - }, - "unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", - "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==" - }, - "verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "when-exit": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.3.tgz", - "integrity": "sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "winreg": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz", - "integrity": "sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs=" - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "zip-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", - "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", - "dev": true, - "peer": true, - "requires": { - "archiver-utils": "^3.0.4", - "compress-commons": "^4.1.2", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "archiver-utils": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", - "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", - "dev": true, - "peer": true, - "requires": { - "glob": "^7.2.3", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - } - } - } } } } diff --git a/app/package.json b/app/package.json index a057d5b613d..42fa77bef05 100644 --- a/app/package.json +++ b/app/package.json @@ -4,12 +4,12 @@ "repository": "github:kopia/kopia", "dependencies": { "auto-launch": "^5.0.6", - "electron-log": "^5.2.4", - "electron-store": "^10.0.0", - "electron-updater": "^6.3.9", + "electron-log": "^5.4.0", + "electron-store": "^10.0.1", + "electron-updater": "^6.6.2", "minimist": "^1.2.8", - "semver": "^7.6.3", - "uuid": "^11.0.3" + "semver": "^7.7.2", + "uuid": "^11.1.0" }, "type": "module", "author": { @@ -71,10 +71,12 @@ ] } ], - "sign": "./sign.cjs", - "signingHashAlgorithms": [ - "sha256" - ] + "signtoolOptions": { + "sign": "./sign.mjs", + "signingHashAlgorithms": [ + "sha256" + ] + } }, "mac": { "hardenedRuntime": true, @@ -108,7 +110,7 @@ } ] }, - "afterSign": "notarize.cjs" + "afterSign": "notarize.mjs" }, "deb": { "appArmorProfile": "kopia-ui.apparmor" @@ -120,14 +122,13 @@ "appArmorProfile": "kopia-ui.apparmor" }, "devDependencies": { - "@electron/notarize": "^2.5.0", - "@playwright/test": "^1.49.1", + "@electron/notarize": "^3.0.1", + "@playwright/test": "^1.52.0", "asar": "^3.2.0", "concurrently": "^9.1.2", - "dotenv": "^16.4.7", - "electron": "^33.2.1", - "electron-builder": "^v26.0.0-alpha.8", - "electron-store": "^10.0.0", + "dotenv": "^16.5.0", + "electron": "^36.2.1", + "electron-builder": "^26.0.12", "playwright": "^1.37.1", "playwright-core": "^1.35.1" }, diff --git a/app/sign.cjs b/app/sign.mjs similarity index 93% rename from app/sign.cjs rename to app/sign.mjs index 70bdbd997c7..315c78e794f 100644 --- a/app/sign.cjs +++ b/app/sign.mjs @@ -1,5 +1,6 @@ -const { spawnSync } = require("child_process"); -exports.default = async function (configuration) { +import { spawnSync } from "child_process"; + +export default async function (configuration) { if (process.platform !== "win32") { return; } diff --git a/tools/gettool/checksums.txt b/tools/gettool/checksums.txt index ee18b682b61..a0659270625 100644 --- a/tools/gettool/checksums.txt +++ b/tools/gettool/checksums.txt @@ -43,9 +43,9 @@ https://github.com/rclone/rclone/releases/download/v1.68.2/rclone-v1.68.2-linux- https://github.com/rclone/rclone/releases/download/v1.68.2/rclone-v1.68.2-osx-amd64.zip: cdc685e16abbf35b6f47c95b2a5b4ad73a73921ff6842e5f4136c8b461756188 https://github.com/rclone/rclone/releases/download/v1.68.2/rclone-v1.68.2-osx-arm64.zip: 323f387b32bcf9ddfc3874f01879a0b2689dbd91309beb8c3a4410db04d0c41f https://github.com/rclone/rclone/releases/download/v1.68.2/rclone-v1.68.2-windows-amd64.zip: 812bf76cc02c04cf6327f3683f3d5a88e47d36c39db84c1a745777496be7d993 -https://nodejs.org/dist/v20.15.1/node-v20.15.1-darwin-arm64.tar.gz: 4743bc042f90ba5d9edf09403207290a9cdd2f6061bdccf7caaa0bbfd49f343e -https://nodejs.org/dist/v20.15.1/node-v20.15.1-darwin-x64.tar.gz: f5379772ffae1404cfd1fcc8cf0c6c5971306b8fb2090d348019047306de39dc -https://nodejs.org/dist/v20.15.1/node-v20.15.1-linux-arm64.tar.gz: 8554c91ccd32782351035d3a9b168ad01c6922480800a21870fc5d6d86c2bb70 -https://nodejs.org/dist/v20.15.1/node-v20.15.1-linux-armv7l.tar.gz: 2c16717da7d2d7b00f6af146cdf436a0297cbcee52c85b754e4c9ed7cee34b51 -https://nodejs.org/dist/v20.15.1/node-v20.15.1-linux-x64.tar.gz: a9db028c0a1c63e3aa0d97de24b0966bc507d8239b3aedc4e752eea6b0580665 -https://nodejs.org/dist/v20.15.1/node-v20.15.1-win-x64.zip: ba6c3711e2c3d0638c5f7cea3c234553808a73c52a5962a6cdb47b5210b70b04 +https://nodejs.org/dist/v22.15.1/node-v22.15.1-darwin-arm64.tar.gz: d2689b86b17e1b51e76f801ffe2d9acca4225e76eda4b843c3d8438d4a7cd6fe +https://nodejs.org/dist/v22.15.1/node-v22.15.1-darwin-x64.tar.gz: 1c722d0dd6d3f60e8b0be014ea01b8a59f5088f4419197a1b37544854d61cc6f +https://nodejs.org/dist/v22.15.1/node-v22.15.1-linux-arm64.tar.gz: eb3f232b83dfe83397b98395ec77a973e888e8959c978b3e4eeb551b8845b74f +https://nodejs.org/dist/v22.15.1/node-v22.15.1-linux-armv7l.tar.gz: 346426e2bca62c98fb12213c39e80b0e349d7620238f74b7208d12e18fde87fd +https://nodejs.org/dist/v22.15.1/node-v22.15.1-linux-x64.tar.gz: f4b8eec683708acb1a2a73c7182ba2de5466a5dd5f705934a0830903df28821c +https://nodejs.org/dist/v22.15.1/node-v22.15.1-win-x64.zip: 7c7997d6ef2efd9525a54b033fc0be6f22549a5905f5da6573a41e61a436a1b5 diff --git a/tools/tools.mk b/tools/tools.mk index 6f62ef9bf12..076c31d1715 100644 --- a/tools/tools.mk +++ b/tools/tools.mk @@ -104,7 +104,7 @@ endif # tool versions GOLANGCI_LINT_VERSION=2.1.2 CHECKLOCKS_VERSION=release-20241104.0 -NODE_VERSION=20.15.1 +NODE_VERSION=22.15.1 HUGO_VERSION=0.113.0 GOTESTSUM_VERSION=1.11.0 GORELEASER_VERSION=v0.176.0 From 6d34ca8688241b8a51d9fb972fe34c4f530160dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 May 2025 00:56:26 +0000 Subject: [PATCH 115/206] build(deps): bump github.com/prometheus/common (#4583) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ace8efe6206..e1c6f4d6103 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/pkg/sftp v1.13.9 github.com/prometheus/client_golang v1.22.0 github.com/prometheus/client_model v0.6.2 - github.com/prometheus/common v0.63.0 + github.com/prometheus/common v0.64.0 github.com/sanity-io/litter v1.5.8 github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/stretchr/testify v1.10.0 diff --git a/go.sum b/go.sum index c1f46c30a82..73ae136c0ba 100644 --- a/go.sum +++ b/go.sum @@ -245,8 +245,8 @@ github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/ github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= -github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= +github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4= +github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= From 7788c4abeb35b4d756ccde166f6ed456699e24c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 21:07:31 -0700 Subject: [PATCH 116/206] build(deps): bump the common-golang-dependencies group with 4 updates (#4582) Bumps the common-golang-dependencies group with 4 updates: [github.com/Azure/azure-sdk-for-go/sdk/azidentity](https://github.com/Azure/azure-sdk-for-go), [github.com/minio/minio-go/v7](https://github.com/minio/minio-go), [google.golang.org/api](https://github.com/googleapis/google-api-go-client) and [google.golang.org/grpc](https://github.com/grpc/grpc-go). Updates `github.com/Azure/azure-sdk-for-go/sdk/azidentity` from 1.9.0 to 1.10.0 - [Release notes](https://github.com/Azure/azure-sdk-for-go/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/go-mgmt-sdk-release-guideline.md) - [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azcore/v1.9.0...sdk/azcore/v1.10.0) Updates `github.com/minio/minio-go/v7` from 7.0.91 to 7.0.92 - [Release notes](https://github.com/minio/minio-go/releases) - [Commits](https://github.com/minio/minio-go/compare/v7.0.91...v7.0.92) Updates `google.golang.org/api` from 0.232.0 to 0.233.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.232.0...v0.233.0) Updates `google.golang.org/grpc` from 1.72.0 to 1.72.1 - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.72.0...v1.72.1) --- updated-dependencies: - dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azidentity dependency-version: 1.10.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: github.com/minio/minio-go/v7 dependency-version: 7.0.92 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies - dependency-name: google.golang.org/api dependency-version: 0.233.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: common-golang-dependencies - dependency-name: google.golang.org/grpc dependency-version: 1.72.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: common-golang-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 ++++++---- go.sum | 24 ++++++++++++++---------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index e1c6f4d6103..916c3c21f15 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.23.9 require ( cloud.google.com/go/storage v1.54.0 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.0 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 github.com/alecthomas/kingpin/v2 v2.4.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 @@ -34,7 +34,7 @@ require ( github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 - github.com/minio/minio-go/v7 v7.0.91 + github.com/minio/minio-go/v7 v7.0.92 github.com/mocktools/go-smtp-mock/v2 v2.4.0 github.com/mxk/go-vss v1.2.0 github.com/natefinch/atomic v1.0.1 @@ -67,8 +67,8 @@ require ( golang.org/x/sys v0.33.0 golang.org/x/term v0.32.0 golang.org/x/text v0.25.0 - google.golang.org/api v0.232.0 - google.golang.org/grpc v1.72.0 + google.golang.org/api v0.233.0 + google.golang.org/grpc v1.72.1 google.golang.org/protobuf v1.36.6 gopkg.in/kothar/go-backblaze.v0 v0.0.0-20210124194846-35409b867216 ) @@ -125,6 +125,7 @@ require ( github.com/minio/crc64nvme v1.0.1 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -132,6 +133,7 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/rs/xid v1.6.0 // indirect github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect github.com/zeebo/errs v1.4.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect diff --git a/go.sum b/go.sum index 73ae136c0ba..de7c722fb43 100644 --- a/go.sum +++ b/go.sum @@ -24,8 +24,8 @@ cloud.google.com/go/trace v1.11.3 h1:c+I4YFjxRQjvAhRmSsmjpASUKq88chOX854ied0K/pE cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 h1:OVoM452qUFBrX+URdH3VpR299ma4kfom0yB0URYky9g= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0/go.mod h1:kUjrAo8bgEwLeZ/CmHqNl3Z/kPm7y6FKfxxK0izYUg4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.0 h1:j8BorDEigD8UFOSZQiSqAMOOleyQOOQPnUAwV+Ls1gA= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.0/go.mod h1:JdM5psgjfBf5fo2uWOZhflPWyDBZ/O/CNAH9CtsuZE4= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= @@ -208,8 +208,8 @@ github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.91 h1:tWLZnEfo3OZl5PoXQwcwTAPNNrjyWwOh6cbZitW5JQc= -github.com/minio/minio-go/v7 v7.0.91/go.mod h1:uvMUcGrpgeSAAI6+sD3818508nUyMULw94j2Nxku/Go= +github.com/minio/minio-go/v7 v7.0.92 h1:jpBFWyRS3p8P/9tsRc+NuvqoFi7qAmTCFPoRFmobbVw= +github.com/minio/minio-go/v7 v7.0.92/go.mod h1:vTIc8DNcnAZIhyFsk8EB90AbPjj3j68aWIEQCiPj7d0= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/mocktools/go-smtp-mock/v2 v2.4.0 h1:u0ky0iyNW/LEMKAFRTsDivHyP8dHYxe/cV3FZC3rRjo= @@ -224,6 +224,8 @@ github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde h1:x0TT0RDC7UhA github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c h1:dAMKvw0MlJT1GshSTtih8C2gDs04w8dReiOGXrGLNoY= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= @@ -249,8 +251,8 @@ github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQP github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= -github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= +github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhicI= +github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= @@ -279,6 +281,8 @@ github.com/studio-b12/gowebdav v0.10.0 h1:Yewz8FFiadcGEu4hxS/AAJQlHelndqln1bns3h github.com/studio-b12/gowebdav v0.10.0/go.mod h1:bHA7t77X/QFExdeAnDzK6vKM34kEZAcE1OX4MfiwjkE= github.com/tg123/go-htpasswd v1.2.4 h1:HgH8KKCjdmo7jjXWN9k1nefPBd7Be3tFCTjc2jPraPU= github.com/tg123/go-htpasswd v1.2.4/go.mod h1:EKThQok9xHkun6NBMynNv6Jmu24A33XdZzzl4Q7H1+0= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= @@ -413,16 +417,16 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.232.0 h1:qGnmaIMf7KcuwHOlF3mERVzChloDYwRfOJOrHt8YC3I= -google.golang.org/api v0.232.0/go.mod h1:p9QCfBWZk1IJETUdbTKloR5ToFdKbYh2fkjsUL6vNoY= +google.golang.org/api v0.233.0 h1:iGZfjXAJiUFSSaekVB7LzXl6tRfEKhUN7FkZN++07tI= +google.golang.org/api v0.233.0/go.mod h1:TCIVLLlcwunlMpZIhIp7Ltk77W+vUSdUKAAIlbxY44c= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE= google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0= google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw= google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 h1:IqsN8hx+lWLqlN+Sc3DoMy/watjofWiU8sRFgQ8fhKM= google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= -google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= +google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From aed5872c3822ba28e7beb2f9c616e3cca7537da8 Mon Sep 17 00:00:00 2001 From: "Kopia Builder [bot]" <82682015+kopia-builder@users.noreply.github.com> Date: Tue, 20 May 2025 21:46:24 -0700 Subject: [PATCH 117/206] feat(ui): upgraded htmlui to the latest version (#4587) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 916c3c21f15..c795d9c95cf 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/klauspost/compress v1.18.0 github.com/klauspost/pgzip v1.2.6 github.com/klauspost/reedsolomon v1.12.4 - github.com/kopia/htmluibuild v0.0.1-0.20250517180012-ff76023b3738 + github.com/kopia/htmluibuild v0.0.1-0.20250521042420-1647bc22ab2d github.com/kylelemons/godebug v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-isatty v0.0.20 diff --git a/go.sum b/go.sum index de7c722fb43..3745d82a462 100644 --- a/go.sum +++ b/go.sum @@ -184,8 +184,8 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= -github.com/kopia/htmluibuild v0.0.1-0.20250517180012-ff76023b3738 h1:0NuqjSAtrmvAwIq6U8EwgaEJhTJEjVeYdXhUJD2Dqxs= -github.com/kopia/htmluibuild v0.0.1-0.20250517180012-ff76023b3738/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= +github.com/kopia/htmluibuild v0.0.1-0.20250521042420-1647bc22ab2d h1:IKr6m4AWjlDlKrC4HlOEFik2jjFuyYhxakP8a8grYL0= +github.com/kopia/htmluibuild v0.0.1-0.20250521042420-1647bc22ab2d/go.mod h1:h53A5JM3t2qiwxqxusBe+PFgGcgZdS+DWCQvG5PTlto= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= From 2e16917518f603637098d31dfcb60c9e1c4f66c3 Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Tue, 20 May 2025 22:33:54 -0700 Subject: [PATCH 118/206] chore(ci): enforce consistent formatting of KopiaUI code (#4586) * chore(ci): enforce consistent formatting of KopiaUI code * fix htmlui_changelog.sh * fix --- .github/workflows/lint.yml | 2 + Makefile | 6 + app/Makefile | 6 + app/notarize.mjs | 26 +- app/package-lock.json | 19 +- app/package.json | 5 +- app/public/auto-launch.js | 73 ++--- app/public/config.js | 207 +++++++------- app/public/electron.js | 481 ++++++++++++++++++++------------ app/public/index.html | 4 +- app/public/notifications.js | 39 +-- app/public/preload.js | 19 +- app/public/server.js | 532 +++++++++++++++++++----------------- app/public/utils.js | 91 +++--- app/sign.mjs | 38 ++- app/tests/main.spec.js | 137 ++++++---- tools/htmlui_changelog.sh | 2 +- 17 files changed, 981 insertions(+), 706 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index bd29929cedc..cfbdcd59a39 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -46,3 +46,5 @@ jobs: run: make lint - name: Check Locks run: make check-locks + - name: Prettier + run: make check-prettier diff --git a/Makefile b/Makefile index 580193c5305..6bbe0eaa2e3 100644 --- a/Makefile +++ b/Makefile @@ -519,3 +519,9 @@ perf-benchmark-results: gcloud compute scp $(PERF_BENCHMARK_INSTANCE):psrecord-* tests/perf_benchmark --zone=$(PERF_BENCHMARK_INSTANCE_ZONE) gcloud compute scp $(PERF_BENCHMARK_INSTANCE):repo-size-* tests/perf_benchmark --zone=$(PERF_BENCHMARK_INSTANCE_ZONE) (cd tests/perf_benchmark && go run process_results.go) + +check-prettier: $(npm) + make -C app check-prettier + +prettier: $(npm) + make -C app prettier diff --git a/app/Makefile b/app/Makefile index 7e12fb4e3b3..7ba1da40d80 100644 --- a/app/Makefile +++ b/app/Makefile @@ -86,3 +86,9 @@ build-electron: ../dist/kopia-ui/.up-to-date ../dist/kopia-ui/.up-to-date: package.json ../dist/kopia_*/kopia* node_modules/.up-to-date public/* resources/*/*/* $(retry) $(npm) $(npm_flags) run build-electron -- $(electron_builder_flags) -p $(electron_publish_flag) echo updated > ../dist/kopia-ui/.up-to-date + +check-prettier: node_modules/.up-to-date + $(npm) run prettier:check + +prettier: node_modules/.up-to-date + $(npm) run prettier diff --git a/app/notarize.mjs b/app/notarize.mjs index 722180c55d6..bf9e1e316a5 100644 --- a/app/notarize.mjs +++ b/app/notarize.mjs @@ -1,25 +1,27 @@ -import 'dotenv/config'; -import { notarize } from '@electron/notarize'; -import fs from 'fs'; -import crypto from 'crypto'; +import "dotenv/config"; +import { notarize } from "@electron/notarize"; +import fs from "fs"; +import crypto from "crypto"; export default async function notarizing(context) { - const { electronPlatformName, appOutDir } = context; - if (electronPlatformName !== 'darwin') { + const { electronPlatformName, appOutDir } = context; + if (electronPlatformName !== "darwin") { return; } if (!process.env.KOPIA_UI_NOTARIZE) { - console.log('Not notarizing because KOPIA_UI_NOTARIZE is not set'); + console.log("Not notarizing because KOPIA_UI_NOTARIZE is not set"); return; } const appName = context.packager.appInfo.productFilename; - console.log('Submitting app for Apple notarization...') - let timerId = setInterval(() => { console.log('Still waiting for notarization response...') }, 30000); - let x = await notarize({ - appBundleId: 'io.kopia.ui', + console.log("Submitting app for Apple notarization..."); + let timerId = setInterval(() => { + console.log("Still waiting for notarization response..."); + }, 30000); + let x = await notarize({ + appBundleId: "io.kopia.ui", appPath: `${appOutDir}/${appName}.app`, appleApiIssuer: process.env.APPLE_API_ISSUER, appleApiKeyId: process.env.APPLE_API_KEY_ID, @@ -27,4 +29,4 @@ export default async function notarizing(context) { }); clearTimeout(timerId); return x; -}; \ No newline at end of file +} diff --git a/app/package-lock.json b/app/package-lock.json index 4996c38f832..f6a27a956d3 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -26,7 +26,8 @@ "electron": "^36.2.1", "electron-builder": "^26.0.12", "playwright": "^1.37.1", - "playwright-core": "^1.35.1" + "playwright-core": "^1.35.1", + "prettier": "^3.5.3" } }, "node_modules/@develar/schema-utils": { @@ -4089,6 +4090,22 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/proc-log": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", diff --git a/app/package.json b/app/package.json index 42fa77bef05..47a972f214b 100644 --- a/app/package.json +++ b/app/package.json @@ -130,7 +130,8 @@ "electron": "^36.2.1", "electron-builder": "^26.0.12", "playwright": "^1.37.1", - "playwright-core": "^1.35.1" + "playwright-core": "^1.35.1", + "prettier": "^3.5.3" }, "homepage": "./", "description": "Fast and secure open source backup.", @@ -147,6 +148,8 @@ "build-electron-linux": "electron-builder -l", "build-electron-dir": "electron-builder --dir", "start-electron-prebuilt": "ELECTRON_IS_DEV=0 electron .", + "prettier": "prettier --write .", + "prettier:check": "prettier --check .", "dev": "electron ." }, "eslintConfig": { diff --git a/app/public/auto-launch.js b/app/public/auto-launch.js index 3525f5e3b39..ce3d9731ca0 100644 --- a/app/public/auto-launch.js +++ b/app/public/auto-launch.js @@ -1,41 +1,50 @@ -import { ipcMain } from 'electron'; +import { ipcMain } from "electron"; import log from "electron-log"; -import AutoLaunch from 'auto-launch'; +import AutoLaunch from "auto-launch"; const autoLauncher = new AutoLaunch({ - name: 'Kopia', - mac: { - useLaunchAgent: true, - }, + name: "Kopia", + mac: { + useLaunchAgent: true, + }, }); let enabled = false; - export function willLaunchAtStartup() { - return enabled; - } +export function willLaunchAtStartup() { + return enabled; +} - export function toggleLaunchAtStartup() { - if (enabled) { - log.info('disabling autorun'); - autoLauncher.disable() - .then(() => { enabled = false; ipcMain.emit('launch-at-startup-updated'); }) - .catch((err) => log.info(err)); - } else { - log.info('enabling autorun'); - autoLauncher.enable() - .then(() => { enabled = true; ipcMain.emit('launch-at-startup-updated'); }) - .catch((err) => log.info(err)); - } - } - export function refreshWillLaunchAtStartup() { - autoLauncher.isEnabled() - .then((isEnabled) => { - enabled = isEnabled; - ipcMain.emit('launch-at-startup-updated'); - }) - .catch(function (err) { - log.info('unable to get autoLauncher state', err); - }); - } +export function toggleLaunchAtStartup() { + if (enabled) { + log.info("disabling autorun"); + autoLauncher + .disable() + .then(() => { + enabled = false; + ipcMain.emit("launch-at-startup-updated"); + }) + .catch((err) => log.info(err)); + } else { + log.info("enabling autorun"); + autoLauncher + .enable() + .then(() => { + enabled = true; + ipcMain.emit("launch-at-startup-updated"); + }) + .catch((err) => log.info(err)); + } +} +export function refreshWillLaunchAtStartup() { + autoLauncher + .isEnabled() + .then((isEnabled) => { + enabled = isEnabled; + ipcMain.emit("launch-at-startup-updated"); + }) + .catch(function (err) { + log.info("unable to get autoLauncher state", err); + }); +} diff --git a/app/public/config.js b/app/public/config.js index 1e8cb6a30ea..997f0452fa6 100644 --- a/app/public/config.js +++ b/app/public/config.js @@ -1,6 +1,6 @@ -const fs = await import('fs'); -const path = await import('path'); -const Electron = await import('electron'); +const fs = await import("fs"); +const path = await import("path"); +const Electron = await import("electron"); const log = await import("electron-log"); let configs = {}; @@ -12,138 +12,155 @@ let firstRun = false; // returns the list of directories to be checked for portable configurations function portableConfigDirs() { - let result = []; + let result = []; + + if (process.env.KOPIA_UI_PORTABLE_CONFIG_DIR) { + result.push(process.env.KOPIA_UI_PORTABLE_CONFIG_DIR); + } + + if (process.platform == "darwin") { + // on Mac support 'repositories' directory next to the KopiaUI.app + result.push( + path.join( + path.dirname(Electron.app.getPath("exe")), + "..", + "..", + "..", + "repositories", + ), + ); + } else { + // on other platforms support 'repositories' directory next to directory + // containing executable or 'repositories' subdirectory. + result.push( + path.join(path.dirname(Electron.app.getPath("exe")), "repositories"), + ); + result.push( + path.join( + path.dirname(Electron.app.getPath("exe")), + "..", + "repositories", + ), + ); + } + + return result; +} - if (process.env.KOPIA_UI_PORTABLE_CONFIG_DIR) { - result.push(process.env.KOPIA_UI_PORTABLE_CONFIG_DIR); - } +function globalConfigDir() { + if (!myConfigDir) { + // try portable config dirs in order. + portableConfigDirs().forEach((d) => { + if (myConfigDir) { + return; + } - if (process.platform == "darwin") { - // on Mac support 'repositories' directory next to the KopiaUI.app - result.push(path.join(path.dirname(Electron.app.getPath("exe")), "..", "..", "..", "repositories")); - } else { - // on other platforms support 'repositories' directory next to directory - // containing executable or 'repositories' subdirectory. - result.push(path.join(path.dirname(Electron.app.getPath("exe")), "repositories")); - result.push(path.join(path.dirname(Electron.app.getPath("exe")), "..", "repositories")); - } + d = path.normalize(d); - return result; -} + if (!fs.existsSync(d)) { + return; + } -function globalConfigDir() { + myConfigDir = d; + isPortable = true; + }); + + // still not set, fall back to per-user config dir. + // we use the same directory that is used by Kopia CLI. if (!myConfigDir) { - // try portable config dirs in order. - portableConfigDirs().forEach(d => { - if (myConfigDir) { - return; - } - - d = path.normalize(d) - - if (!fs.existsSync(d)) { - return; - } - - myConfigDir = d; - isPortable = true; - }); - - // still not set, fall back to per-user config dir. - // we use the same directory that is used by Kopia CLI. - if (!myConfigDir) { - myConfigDir = path.join(Electron.app.getPath("appData"), "kopia"); - } + myConfigDir = path.join(Electron.app.getPath("appData"), "kopia"); } + } - return myConfigDir; + return myConfigDir; } export function allConfigs() { - let result = []; + let result = []; - for (let k in configs) { - result.push(k); - } + for (let k in configs) { + result.push(k); + } - return result; + return result; } export function addNewConfig() { - let id; + let id; - if (!configs) { - // first repository is always named "repository" to match Kopia CLI. - id = "repository"; - } else { - id = "repository-" + new Date().valueOf(); - } + if (!configs) { + // first repository is always named "repository" to match Kopia CLI. + id = "repository"; + } else { + id = "repository-" + new Date().valueOf(); + } - configs[id] = true; - return id; + configs[id] = true; + return id; } -Electron.ipcMain.on('config-list-fetch', (event, arg) => { - emitConfigListUpdated(); +Electron.ipcMain.on("config-list-fetch", (event, arg) => { + emitConfigListUpdated(); }); function emitConfigListUpdated() { - Electron.ipcMain.emit('config-list-updated-event', allConfigs()); -}; + Electron.ipcMain.emit("config-list-updated-event", allConfigs()); +} export function deleteConfigIfDisconnected(repoID) { - if (repoID === "repository") { - // never delete default repository config - return false; - } + if (repoID === "repository") { + // never delete default repository config + return false; + } - if (!fs.existsSync(path.join(globalConfigDir(), repoID + configFileSuffix))) { - delete (configs[repoID]); - emitConfigListUpdated(); - return true; - } + if (!fs.existsSync(path.join(globalConfigDir(), repoID + configFileSuffix))) { + delete configs[repoID]; + emitConfigListUpdated(); + return true; + } - return false; + return false; } export function loadConfigs() { - fs.mkdirSync(globalConfigDir(), { recursive: true, mode: 0o700 }); - let entries = fs.readdirSync(globalConfigDir()); - - let count = 0; - entries.filter(e => path.extname(e) == configFileSuffix).forEach(v => { - const repoID = v.replace(configFileSuffix, ""); - configs[repoID] = true; - count++; + fs.mkdirSync(globalConfigDir(), { recursive: true, mode: 0o700 }); + let entries = fs.readdirSync(globalConfigDir()); + + let count = 0; + entries + .filter((e) => path.extname(e) == configFileSuffix) + .forEach((v) => { + const repoID = v.replace(configFileSuffix, ""); + configs[repoID] = true; + count++; }); - if (count === 0) { - configs["repository"] = true; - firstRun = true; - } -}; - + if (count === 0) { + configs["repository"] = true; + firstRun = true; + } +} export function isPortableConfig() { - globalConfigDir(); - return isPortable; -}; + globalConfigDir(); + return isPortable; +} export function isFirstRun() { - return firstRun; + return firstRun; } export function configDir() { - return globalConfigDir(); + return globalConfigDir(); } export function configForRepo(repoID) { - let c = configs[repoID]; - if (c) { - return c; - } - - configs[repoID] = true; - emitConfigListUpdated(); + let c = configs[repoID]; + if (c) { return c; + } + + configs[repoID] = true; + emitConfigListUpdated(); + return c; } diff --git a/app/public/electron.js b/app/public/electron.js index 7a2e1e502e0..859facc5d05 100644 --- a/app/public/electron.js +++ b/app/public/electron.js @@ -1,77 +1,99 @@ -import { app, BrowserWindow, Notification, screen, Menu, Tray, ipcMain, dialog, shell } from 'electron'; +import { + app, + BrowserWindow, + Notification, + screen, + Menu, + Tray, + ipcMain, + dialog, + shell, +} from "electron"; import pkg from "electron-updater"; const autoUpdater = pkg.autoUpdater; -import { iconsPath, publicPath, selectByOS } from './utils.js'; -import { toggleLaunchAtStartup, willLaunchAtStartup, refreshWillLaunchAtStartup } from './auto-launch.js'; -import { setNotificationLevel, getNotificationLevel } from './notifications.js'; -import { serverForRepo } from './server.js'; -import { loadConfigs, allConfigs, deleteConfigIfDisconnected, addNewConfig, configDir, isFirstRun, isPortableConfig } from './config.js'; - -import Store from 'electron-store'; +import { iconsPath, publicPath, selectByOS } from "./utils.js"; +import { + toggleLaunchAtStartup, + willLaunchAtStartup, + refreshWillLaunchAtStartup, +} from "./auto-launch.js"; +import { setNotificationLevel, getNotificationLevel } from "./notifications.js"; +import { serverForRepo } from "./server.js"; +import { + loadConfigs, + allConfigs, + deleteConfigIfDisconnected, + addNewConfig, + configDir, + isFirstRun, + isPortableConfig, +} from "./config.js"; + +import Store from "electron-store"; import log from "electron-log"; -import path from 'path'; -import crypto from 'crypto'; +import path from "path"; +import crypto from "crypto"; // Store to save parameters const store = new Store(); -app.name = 'KopiaUI'; +app.name = "KopiaUI"; -let tray = null +let tray = null; let repositoryWindows = {}; let repoIDForWebContents = {}; if (process.env.KOPIA_CUSTOM_APPDATA) { - app.setPath('appData', process.env.KOPIA_CUSTOM_APPDATA); + app.setPath("appData", process.env.KOPIA_CUSTOM_APPDATA); } if (isPortableConfig()) { // in portable mode, write cache under 'repositories' - app.setPath('userData', path.join(configDir(), 'cache')); + app.setPath("userData", path.join(configDir(), "cache")); } /** - * Stores the ids of the currently connected displays. + * Stores the ids of the currently connected displays. * The ids are sorted to generate a hash that specifies the current display configuration * @returns A hash of the configuration */ function getDisplayConfiguration() { // Stores the IDs all all currently connected displays - let config = [] - let sha256 = crypto.createHash('sha256') + let config = []; + let sha256 = crypto.createHash("sha256"); // Get all displays - let displays = screen.getAllDisplays() - let isFactorEqual = false + let displays = screen.getAllDisplays(); + let isFactorEqual = false; // Stores the previous factor - initialized with the primary scaling factor - let prevFactor = screen.getPrimaryDisplay().scaleFactor + let prevFactor = screen.getPrimaryDisplay().scaleFactor; //Workaround until https://github.com/electron/electron/issues/10862 is fixed for (let dsp in displays) { // Add the id to the config - config.push(displays[dsp].id) - isFactorEqual = prevFactor === displays[dsp].scaleFactor + config.push(displays[dsp].id); + isFactorEqual = prevFactor === displays[dsp].scaleFactor; // Update the previous factors - prevFactor = displays[dsp].scaleFactor + prevFactor = displays[dsp].scaleFactor; } // Sort IDs to prevent different hashes through permutation - config.sort() - sha256.update(config.toString()) - return { "hash": sha256.digest('hex'), "factorsEqual": isFactorEqual } + config.sort(); + sha256.update(config.toString()); + return { hash: sha256.digest("hex"), factorsEqual: isFactorEqual }; } /** * Creates a repository window with given options and parameters * @param {*} repositoryID - * The id for that specific repository used as a reference for that window + * The id for that specific repository used as a reference for that window */ function showRepoWindow(repositoryID) { - let primaryScreenBounds = screen.getPrimaryDisplay().bounds + let primaryScreenBounds = screen.getPrimaryDisplay().bounds; if (repositoryWindows[repositoryID]) { repositoryWindows[repositoryID].focus(); return; } let windowOptions = { - title: 'KopiaUI is Loading...', + title: "KopiaUI is Loading...", // default width width: 1000, // default height @@ -84,150 +106,168 @@ function showRepoWindow(repositoryID) { resizable: true, show: false, webPreferences: { - preload: path.join(publicPath(), 'preload.js'), + preload: path.join(publicPath(), "preload.js"), }, }; // The bounds of the windows - let configuration = getDisplayConfiguration() - let winBounds = store.get(configuration.hash) - let maximized = store.get('maximized') + let configuration = getDisplayConfiguration(); + let winBounds = store.get(configuration.hash); + let maximized = store.get("maximized"); if (configuration.factorsEqual) { Object.assign(windowOptions, winBounds); } // Create the browser window - let repositoryWindow = new BrowserWindow(windowOptions) + let repositoryWindow = new BrowserWindow(windowOptions); // If the window was maximized, maximize it if (maximized) { - repositoryWindow.maximize() + repositoryWindow.maximize(); } const webContentsID = repositoryWindow.webContents.id; - repositoryWindows[repositoryID] = repositoryWindow - repoIDForWebContents[webContentsID] = repositoryID + repositoryWindows[repositoryID] = repositoryWindow; + repoIDForWebContents[webContentsID] = repositoryID; - // Failed to load the content, retry - repositoryWindow.webContents.on('did-fail-load', () => { - log.error('failed to load content'); + // Failed to load the content, retry + repositoryWindow.webContents.on("did-fail-load", () => { + log.error("failed to load content"); // schedule another attempt in 0.5s if (repositoryWindows[repositoryID]) { setTimeout(() => { - log.info('reloading'); - repositoryWindows[repositoryID].loadURL(serverForRepo(repositoryID).getServerAddress() + '/?ts=' + new Date().valueOf()); - }, 500) + log.info("reloading"); + repositoryWindows[repositoryID].loadURL( + serverForRepo(repositoryID).getServerAddress() + + "/?ts=" + + new Date().valueOf(), + ); + }, 500); } - }) + }); - repositoryWindow.loadURL(serverForRepo(repositoryID).getServerAddress() + '/?ts=' + new Date().valueOf()); + repositoryWindow.loadURL( + serverForRepo(repositoryID).getServerAddress() + + "/?ts=" + + new Date().valueOf(), + ); updateDockIcon(); /** * Store the window size, height and position on close */ - repositoryWindow.on('close', function () { - store.set(getDisplayConfiguration().hash, repositoryWindow.getBounds()) - store.set('maximized', repositoryWindow.isMaximized()) - }) + repositoryWindow.on("close", function () { + store.set(getDisplayConfiguration().hash, repositoryWindow.getBounds()); + store.set("maximized", repositoryWindow.isMaximized()); + }); /** * Show the window once the content is ready */ - repositoryWindow.once('ready-to-show', function () { - repositoryWindow.show() - }) + repositoryWindow.once("ready-to-show", function () { + repositoryWindow.show(); + }); /** * Delete references to the repository window */ - repositoryWindow.on('closed', function () { + repositoryWindow.on("closed", function () { // Delete the reference to the window repositoryWindow = null; - delete (repositoryWindows[repositoryID]); - delete (repoIDForWebContents[webContentsID]); + delete repositoryWindows[repositoryID]; + delete repoIDForWebContents[webContentsID]; const s = serverForRepo(repositoryID); if (deleteConfigIfDisconnected(repositoryID)) { s.stopServer(); } updateDockIcon(); - }) + }); } // Check if another instance of kopia is running if (!app.requestSingleInstanceLock()) { - app.quit() + app.quit(); } else { - app.on('second-instance', (_event, _commandLine, _workingDirectory) => { + app.on("second-instance", (_event, _commandLine, _workingDirectory) => { // Someone tried to run a second instance, we should focus our window. for (let repositoryID in repositoryWindows) { let rw = repositoryWindows[repositoryID]; if (rw.isMinimized()) { - rw.restore() + rw.restore(); } - rw.focus() + rw.focus(); } - }) + }); } -app.on('will-quit', function () { - allConfigs().forEach(repositoryID => serverForRepo(repositoryID).stopServer()); +app.on("will-quit", function () { + allConfigs().forEach((repositoryID) => + serverForRepo(repositoryID).stopServer(), + ); }); -app.on('login', (event, webContents, _request, _authInfo, callback) => { +app.on("login", (event, webContents, _request, _authInfo, callback) => { const repositoryID = repoIDForWebContents[webContents.id]; // intercept password prompts and automatically enter password that the server has printed for us. const password = serverForRepo(repositoryID).getServerPassword(); if (password) { event.preventDefault(); - log.info('automatically logging in...'); - callback('kopia', password); + log.info("automatically logging in..."); + callback("kopia", password); } }); -app.on('certificate-error', (event, webContents, _url, _error, certificate, callback) => { - const repositoryID = repoIDForWebContents[webContents.id]; - // intercept certificate errors and automatically trust the certificate the server has printed for us. - const expected = 'sha256/' + Buffer.from(serverForRepo(repositoryID).getServerCertSHA256(), 'hex').toString('base64'); - if (certificate.fingerprint === expected) { - log.debug('accepting server certificate.'); - - // On certificate error we disable default behaviour (stop loading the page) - // and we then say "it is all fine - true" to the callback - event.preventDefault(); - callback(true); - return; - } +app.on( + "certificate-error", + (event, webContents, _url, _error, certificate, callback) => { + const repositoryID = repoIDForWebContents[webContents.id]; + // intercept certificate errors and automatically trust the certificate the server has printed for us. + const expected = + "sha256/" + + Buffer.from( + serverForRepo(repositoryID).getServerCertSHA256(), + "hex", + ).toString("base64"); + if (certificate.fingerprint === expected) { + log.debug("accepting server certificate."); + + // On certificate error we disable default behaviour (stop loading the page) + // and we then say "it is all fine - true" to the callback + event.preventDefault(); + callback(true); + return; + } - log.warn('certificate error:', certificate.fingerprint, expected); -}); + log.warn("certificate error:", certificate.fingerprint, expected); + }, +); /** - * Ignore to let the application run, when all windows are closed + * Ignore to let the application run, when all windows are closed */ -app.on('window-all-closed', function () { }) +app.on("window-all-closed", function () {}); -ipcMain.handle('select-dir', async (_event, _arg) => { +ipcMain.handle("select-dir", async (_event, _arg) => { const result = await dialog.showOpenDialog({ - properties: ['openDirectory'] + properties: ["openDirectory"], }); if (result.filePaths) { return result.filePaths[0]; } else { return null; - }; -}) + } +}); -ipcMain.handle('browse-dir', async (_event, path) => { +ipcMain.handle("browse-dir", async (_event, path) => { shell.openPath(path); -}) +}); -ipcMain.on('server-status-updated', updateTrayContextMenu); -ipcMain.on('launch-at-startup-updated', updateTrayContextMenu); -ipcMain.on('notification-config-updated', updateTrayContextMenu); +ipcMain.on("server-status-updated", updateTrayContextMenu); +ipcMain.on("launch-at-startup-updated", updateTrayContextMenu); +ipcMain.on("notification-config-updated", updateTrayContextMenu); let updateAvailableInfo = null; let updateDownloadStatusInfo = ""; @@ -244,8 +284,8 @@ autoUpdater.autoInstallOnAppQuit = false; let lastNotifiedVersion = ""; -autoUpdater.on('update-available', a => { - log.info('update available ' + a.version); +autoUpdater.on("update-available", (a) => { + log.info("update available " + a.version); updateAvailableInfo = a; updateDownloadStatusInfo = ""; @@ -253,11 +293,19 @@ autoUpdater.on('update-available', a => { // do not notify more than once for a particular version. if (checkForUpdatesTriggeredFromUI) { - dialog.showMessageBox({ buttons: ["Yes", "No"], message: "An updated KopiaUI v" + a.version + " is available.\n\nDo you want to install it now?" }).then(r => { - if (r.response == 0) { - installUpdate(); - } - }); + dialog + .showMessageBox({ + buttons: ["Yes", "No"], + message: + "An updated KopiaUI v" + + a.version + + " is available.\n\nDo you want to install it now?", + }) + .then((r) => { + if (r.response == 0) { + installUpdate(); + } + }); checkForUpdatesTriggeredFromUI = false; } @@ -266,41 +314,53 @@ autoUpdater.on('update-available', a => { const notification = new Notification({ title: "New version of KopiaUI", - body: "Version v" + a.version + " is available.\n\nClick here to download and install it.", + body: + "Version v" + + a.version + + " is available.\n\nClick here to download and install it.", }); - notification.on('click', () => installUpdate()); + notification.on("click", () => installUpdate()); notification.show(); } -}) +}); -autoUpdater.on('update-not-available', () => { +autoUpdater.on("update-not-available", () => { updateAvailableInfo = null; updateDownloadStatusInfo = ""; updateFailed = false; updateTrayContextMenu(); if (checkForUpdatesTriggeredFromUI) { - dialog.showMessageBox({ buttons: ["OK"], message: "No updates available." }); + dialog.showMessageBox({ + buttons: ["OK"], + message: "No updates available.", + }); checkForUpdatesTriggeredFromUI = false; } -}) +}); -autoUpdater.on('download-progress', progress => { +autoUpdater.on("download-progress", (progress) => { if (updateAvailableInfo) { - updateDownloadStatusInfo = "Downloading Update: v" + updateAvailableInfo.version + " (" + (Math.round(progress.percent * 10) / 10.0) + "%) ..."; + updateDownloadStatusInfo = + "Downloading Update: v" + + updateAvailableInfo.version + + " (" + + Math.round(progress.percent * 10) / 10.0 + + "%) ..."; updateTrayContextMenu(); } }); -autoUpdater.on('update-downloaded', _info => { - updateDownloadStatusInfo = "Installing Update: v" + updateAvailableInfo.version + " ..."; +autoUpdater.on("update-downloaded", (_info) => { + updateDownloadStatusInfo = + "Installing Update: v" + updateAvailableInfo.version + " ..."; updateTrayContextMenu(); setTimeout(() => { try { autoUpdater.quitAndInstall(); } catch (e) { - log.info('update error', e); + log.info("update error", e); } updateDownloadStatusInfo = null; @@ -309,13 +369,16 @@ autoUpdater.on('update-downloaded', _info => { }, 500); }); -autoUpdater.on('error', a => { +autoUpdater.on("error", (a) => { updateAvailableInfo = null; updateDownloadStatusInfo = "Error checking for updates."; - log.info('error checking for updates', a); + log.info("error checking for updates", a); updateTrayContextMenu(); if (checkForUpdatesTriggeredFromUI) { - dialog.showErrorBox("Error checking for updates.", "There was an error checking for updates, try again later."); + dialog.showErrorBox( + "Error checking for updates.", + "There was an error checking for updates, try again later.", + ); checkForUpdatesTriggeredFromUI = false; } }); @@ -342,7 +405,9 @@ function viewReleaseNotes() { const ver = updateAvailableInfo.version + ""; if (ver.match(/^\d{8}\./)) { // kopia-test builds are named yyyymmdd.0.hhmmss - shell.openExternal("https://github.com/kopia/kopia-test-builds/releases/v" + ver); + shell.openExternal( + "https://github.com/kopia/kopia-test-builds/releases/v" + ver, + ); } else { shell.openExternal("https://github.com/kopia/kopia/releases/v" + ver); } @@ -366,23 +431,27 @@ function maybeMoveToApplicationsFolder() { return; } - dialog.showMessageBox({ - buttons: ["Yes", "No"], - message: "For best experience, Kopia needs to be installed in Applications folder.\n\nDo you want to move it now?" - }).then(r => { - if (r.response == 0) { - app.moveToApplicationsFolder(); - } else { - checkForUpdates(); - } - }).catch(e => { - log.info(e); - }); + dialog + .showMessageBox({ + buttons: ["Yes", "No"], + message: + "For best experience, Kopia needs to be installed in Applications folder.\n\nDo you want to move it now?", + }) + .then((r) => { + if (r.response == 0) { + app.moveToApplicationsFolder(); + } else { + checkForUpdates(); + } + }) + .catch((e) => { + log.info(e); + }); } function updateDockIcon() { - if (process.platform === 'darwin') { - let any = false + if (process.platform === "darwin") { + let any = false; for (const _k in repositoryWindows) { any = true; } @@ -405,23 +474,23 @@ function safeTrayHandler(ev, h) { tray.on(ev, () => { try { h(); - } catch (e) { - } - }) + } catch (e) {} + }); } -app.on('ready', () => { +app.on("ready", () => { loadConfigs(); if (isPortableConfig()) { const logDir = path.join(configDir(), "logs"); - log.transports.file.resolvePath = (variables) => path.join(logDir, variables.fileName); + log.transports.file.resolvePath = (variables) => + path.join(logDir, variables.fileName); } - log.transports.console.level = "warn" - log.transports.file.level = "debug" - autoUpdater.logger = log + log.transports.console.level = "warn"; + log.transports.file.level = "debug"; + autoUpdater.logger = log; // re-check for updates every 24 hours setInterval(checkForUpdates, 86400000); @@ -429,9 +498,15 @@ app.on('ready', () => { tray = new Tray( path.join( iconsPath(), - selectByOS({ mac: 'kopiaTrayTemplate.png', win: 'kopia-tray.ico', linux: 'kopia-tray.png' }))); + selectByOS({ + mac: "kopiaTrayTemplate.png", + win: "kopia-tray.ico", + linux: "kopia-tray.png", + }), + ), + ); - tray.setToolTip('Kopia'); + tray.setToolTip("Kopia"); // hooks exposed to tests if (process.env["KOPIA_UI_TESTING"]) { @@ -439,7 +514,7 @@ app.on('ready', () => { tray: tray, showRepoWindow: showRepoWindow, allConfigs: allConfigs, - } + }; } safeTrayHandler("click", () => tray.popUpContextMenu()); @@ -450,7 +525,7 @@ app.on('ready', () => { refreshWillLaunchAtStartup(); updateDockIcon(); - allConfigs().forEach(repoID => serverForRepo(repoID).actuateServer()); + allConfigs().forEach((repoID) => serverForRepo(repoID).actuateServer()); if (isFirstRun()) { // open all repo windows on first run. @@ -470,7 +545,7 @@ app.on('ready', () => { } else { checkForUpdates(); } -}) +}); function showRepoNotification(e) { const nl = getNotificationLevel(); @@ -478,7 +553,7 @@ function showRepoNotification(e) { // notifications disabled return; } - + if (e.severity < 10 && nl === 1) { // non-important notifications disabled. return; @@ -488,7 +563,8 @@ function showRepoNotification(e) { if (e.severity < 0) { urgency = "low"; - } else if (e.severity >= 10) { // warnings and errors + } else if (e.severity >= 10) { + // warnings and errors urgency = "critical"; } else { urgency = "normal"; @@ -497,16 +573,16 @@ function showRepoNotification(e) { const notification = new Notification({ title: e.notification.subject, body: e.notification.body, - urgency: urgency + urgency: urgency, }); - notification.on('click', () => showRepoWindow(e.repositoryID)); + notification.on("click", () => showRepoWindow(e.repositoryID)); notification.show(); } -ipcMain.addListener('config-list-updated-event', () => updateTrayContextMenu()); -ipcMain.addListener('status-updated-event', () => updateTrayContextMenu()); -ipcMain.addListener('repo-notification-event', showRepoNotification); +ipcMain.addListener("config-list-updated-event", () => updateTrayContextMenu()); +ipcMain.addListener("status-updated-event", () => updateTrayContextMenu()); +ipcMain.addListener("repo-notification-event", showRepoNotification); function addAnotherRepository() { const repoID = addNewConfig(); @@ -522,7 +598,7 @@ function updateTrayContextMenu() { let defaultReposTemplates = []; let additionalReposTemplates = []; - allConfigs().forEach(repoID => { + allConfigs().forEach((repoID) => { const sd = serverForRepo(repoID).getServerStatusDetails(); let desc = ""; @@ -539,15 +615,16 @@ function updateTrayContextMenu() { } // put primary repository first. - const collection = repoID === ("repository") ? defaultReposTemplates : additionalReposTemplates - - collection.push( - { - label: desc, - click: () => showRepoWindow(repoID), - toolTip: desc + " (" + repoID + ")", - }, - ); + const collection = + repoID === "repository" + ? defaultReposTemplates + : additionalReposTemplates; + + collection.push({ + label: desc, + click: () => showRepoWindow(repoID), + toolTip: desc + " (" + repoID + ")", + }); }); if (additionalReposTemplates.length > 0) { @@ -557,34 +634,82 @@ function updateTrayContextMenu() { let autoUpdateMenuItems = []; if (updateDownloadStatusInfo) { - autoUpdateMenuItems.push({ label: updateDownloadStatusInfo, enabled: false }); + autoUpdateMenuItems.push({ + label: updateDownloadStatusInfo, + enabled: false, + }); } else if (updateAvailableInfo) { if (updateFailed) { - autoUpdateMenuItems.push({ label: 'Update Failed, click to manually download and install v' + updateAvailableInfo.version, click: viewReleaseNotes }); + autoUpdateMenuItems.push({ + label: + "Update Failed, click to manually download and install v" + + updateAvailableInfo.version, + click: viewReleaseNotes, + }); } else { - autoUpdateMenuItems.push({ label: 'Update Available: v' + updateAvailableInfo.version, click: viewReleaseNotes }); - autoUpdateMenuItems.push({ label: 'Download And Install...', click: installUpdate }); + autoUpdateMenuItems.push({ + label: "Update Available: v" + updateAvailableInfo.version, + click: viewReleaseNotes, + }); + autoUpdateMenuItems.push({ + label: "Download And Install...", + click: installUpdate, + }); } } else { - autoUpdateMenuItems.push({ label: "KopiaUI is up-to-date: " + app.getVersion(), enabled: false }); + autoUpdateMenuItems.push({ + label: "KopiaUI is up-to-date: " + app.getVersion(), + enabled: false, + }); } const nl = getNotificationLevel(); - let template = defaultReposTemplates.concat(additionalReposTemplates).concat([ - { type: 'separator' }, - { label: 'Connect To Another Repository...', click: addAnotherRepository }, - { type: 'separator' }, - { label: 'Check For Updates Now', click: checkForUpdatesNow }, - ]).concat(autoUpdateMenuItems).concat([ - { type: 'separator' }, - { label: 'Launch At Startup', type: 'checkbox', click: toggleLaunchAtStartup, checked: willLaunchAtStartup() }, - { label: 'Notifications', type: 'submenu', submenu: [ - { label: 'Enabled', type: 'radio', click: () => setNotificationLevel(2), checked: nl === 2 }, - { label: 'Warnings And Errors', type: 'radio', click: () => setNotificationLevel(1), checked: nl === 1 }, - { label: 'Disabled', type: 'radio', click: () => setNotificationLevel(0), checked: nl === 0 }, - ] }, - { label: 'Quit', role: 'quit' }, - ]); + let template = defaultReposTemplates + .concat(additionalReposTemplates) + .concat([ + { type: "separator" }, + { + label: "Connect To Another Repository...", + click: addAnotherRepository, + }, + { type: "separator" }, + { label: "Check For Updates Now", click: checkForUpdatesNow }, + ]) + .concat(autoUpdateMenuItems) + .concat([ + { type: "separator" }, + { + label: "Launch At Startup", + type: "checkbox", + click: toggleLaunchAtStartup, + checked: willLaunchAtStartup(), + }, + { + label: "Notifications", + type: "submenu", + submenu: [ + { + label: "Enabled", + type: "radio", + click: () => setNotificationLevel(2), + checked: nl === 2, + }, + { + label: "Warnings And Errors", + type: "radio", + click: () => setNotificationLevel(1), + checked: nl === 1, + }, + { + label: "Disabled", + type: "radio", + click: () => setNotificationLevel(0), + checked: nl === 0, + }, + ], + }, + { label: "Quit", role: "quit" }, + ]); tray.setContextMenu(Menu.buildFromTemplate(template)); } diff --git a/app/public/index.html b/app/public/index.html index 4d390c8d19d..3de92100633 100644 --- a/app/public/index.html +++ b/app/public/index.html @@ -1,4 +1,4 @@ - + @@ -29,7 +29,7 @@
-
+

Version %REACT_APP_FULL_VERSION_INFO%