diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 0da3c1d32..000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -github: aptly-dev diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index f60545bc3..000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,14 +0,0 @@ - - -## Detailed Description - - -## Context - - - -## Possible Implementation - - -## Your Environment - diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 41e64281c..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,22 +0,0 @@ -Fixes # - -## Requirements - -All new code should be covered with tests, documentation should be updated. CI should pass. - -## Description of the Change - - - -## Checklist - -- [ ] unit-test added (if change is algorithm) -- [ ] functional test added/updated (if change is functional) -- [ ] man page updated (if applicable) -- [ ] bash completion updated (if applicable) -- [ ] documentation updated -- [ ] author name in `AUTHORS` diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index e82307bb4..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,304 +0,0 @@ -name: CI - -on: - pull_request: - push: - tags: - - 'v*' - branches: - - 'master' - -defaults: - run: - # see: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#using-a-specific-shell - shell: bash --noprofile --norc -eo pipefail {0} - -env: - DEBIAN_FRONTEND: noninteractive - -jobs: - test: - name: "Test (Ubuntu 22.04)" - runs-on: ubuntu-22.04 - continue-on-error: false - timeout-minutes: 30 - - env: - NO_FTP_ACCESS: yes - BOTO_CONFIG: /dev/null - GO111MODULE: "on" - GOPROXY: "https://proxy.golang.org" - - steps: - - name: "Install Packages" - run: | - sudo apt-get update - sudo apt-get install -y --no-install-recommends graphviz gnupg2 gpgv2 git gcc make devscripts python3 python3-requests-unixsocket python3-termcolor python3-swiftclient python3-boto python3-azure-storage python3-etcd3 python3-plyvel flake8 - - - name: "Checkout Repository" - uses: actions/checkout@v4 - with: - # fetch the whole repo for `git describe` to work - fetch-depth: 0 - - - name: "Run flake8" - run: | - make flake8 - - - name: "Read Go Version" - run: | - gover=$(sed -n 's/^go \(.*\)/\1/p' go.mod) - echo "Go Version: $gover" - echo "GOVER=$gover" >> $GITHUB_OUTPUT - id: goversion - - - name: "Setup Go" - uses: actions/setup-go@v3 - with: - go-version: ${{ steps.goversion.outputs.GOVER }} - - - name: "Install Azurite" - id: azuright - uses: potatoqualitee/azuright@v1.1 - with: - directory: ${{ runner.temp }} - - - name: "Run Unit Tests" - env: - RUN_LONG_TESTS: 'yes' - AZURE_STORAGE_ENDPOINT: "http://127.0.0.1:10000/devstoreaccount1" - AZURE_STORAGE_ACCOUNT: "devstoreaccount1" - AZURE_STORAGE_ACCESS_KEY: "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==" - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - run: | - sudo mkdir -p /srv ; sudo chown runner /srv - COVERAGE_DIR=${{ runner.temp }} make test - - - name: "Run Benchmark" - run: | - COVERAGE_DIR=${{ runner.temp }} make bench - - - name: "Run System Tests" - env: - RUN_LONG_TESTS: 'yes' - AZURE_STORAGE_ENDPOINT: "http://127.0.0.1:10000/devstoreaccount1" - AZURE_STORAGE_ACCOUNT: "devstoreaccount1" - AZURE_STORAGE_ACCESS_KEY: "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==" - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - run: | - sudo mkdir -p /srv ; sudo chown runner /srv - COVERAGE_DIR=${{ runner.temp }} make system-test - - - name: "Merge Code Coverage" - run: | - go install github.com/wadey/gocovmerge@latest - ~/go/bin/gocovmerge unit.out ${{ runner.temp }}/*.out > coverage.txt - - - name: "Upload Code Coverage" - uses: codecov/codecov-action@v2 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: coverage.txt - - ci-debian-build: - name: "Build" - needs: test - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - name: ["Debian 13/testing", "Debian 12/bookworm", "Debian 11/bullseye", "Debian 10/buster", "Ubuntu 24.04", "Ubuntu 22.04", "Ubuntu 20.04"] - arch: ["amd64", "i386" , "arm64" , "armhf"] - include: - - name: "Debian 13/testing" - suite: trixie - image: debian:trixie-slim - - name: "Debian 12/bookworm" - suite: bookworm - image: debian:bookworm-slim - - name: "Debian 11/bullseye" - suite: bullseye - image: debian:bullseye-slim - - name: "Debian 10/buster" - suite: buster - image: debian:buster-slim - - name: "Ubuntu 24.04" - suite: noble - image: ubuntu:24.04 - - name: "Ubuntu 22.04" - suite: jammy - image: ubuntu:22.04 - - name: "Ubuntu 20.04" - suite: focal - image: ubuntu:20.04 - container: - image: ${{ matrix.image }} - env: - APT_LISTCHANGES_FRONTEND: none - DEBIAN_FRONTEND: noninteractive - steps: - - name: "Install packages" - run: | - apt-get update - apt-get install -y --no-install-recommends make ca-certificates git curl build-essential devscripts dh-golang jq bash-completion lintian \ - binutils-i686-linux-gnu binutils-aarch64-linux-gnu binutils-arm-linux-gnueabihf \ - libc6-dev-i386-cross libc6-dev-armhf-cross libc6-dev-arm64-cross \ - gcc-i686-linux-gnu gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu - git config --global --add safe.directory "$GITHUB_WORKSPACE" - - - name: "Checkout Repository" - uses: actions/checkout@v4 - with: - # fetch the whole repo for `git describe` to work - fetch-depth: 0 - - - name: "Read Go Version" - run: | - gover=$(sed -n 's/^go \(.*\)/\1/p' go.mod) - echo "Go Version: $gover" - echo "GOVER=$gover" >> $GITHUB_OUTPUT - id: goversion - - - name: "Setup Go" - uses: actions/setup-go@v3 - with: - go-version: ${{ steps.goversion.outputs.GOVER }} - - - name: "Ensure CI build" - if: github.ref == 'refs/heads/master' - run: | - echo "FORCE_CI=true" >> $GITHUB_OUTPUT - id: force_ci - - - name: "Build Debian packages" - env: - FORCE_CI: ${{ steps.force_ci.outputs.FORCE_CI }} - run: | - make dpkg DEBARCH=${{ matrix.arch }} - - - name: "Check aptly credentials" - env: - APTLY_USER: ${{ secrets.APTLY_USER }} - APTLY_PASSWORD: ${{ secrets.APTLY_PASSWORD }} - run: | - found=no - if [ -n "$APTLY_USER" ] && [ -n "$APTLY_PASSWORD" ]; then - found=yes - fi - echo "Aptly credentials available: $found" - echo "FOUND=$found" >> $GITHUB_OUTPUT - id: aptlycreds - - - name: "Publish CI release to aptly" - if: github.ref == 'refs/heads/master' && steps.aptlycreds.outputs.FOUND == 'yes' - env: - APTLY_USER: ${{ secrets.APTLY_USER }} - APTLY_PASSWORD: ${{ secrets.APTLY_PASSWORD }} - run: | - .github/workflows/scripts/upload-artifacts.sh ci ${{ matrix.suite }} - - - name: "Publish release to aptly" - if: startsWith(github.event.ref, 'refs/tags') && steps.aptlycreds.outputs.FOUND == 'yes' - env: - APTLY_USER: ${{ secrets.APTLY_USER }} - APTLY_PASSWORD: ${{ secrets.APTLY_PASSWORD }} - run: | - .github/workflows/scripts/upload-artifacts.sh release ${{ matrix.suite }} - - ci-binary-build: - name: "Build" - needs: test - runs-on: ubuntu-latest - strategy: - matrix: - goos: [linux, freebsd, darwin] - goarch: ["386", "amd64", "arm", "arm64"] - exclude: - - goos: darwin - goarch: 386 - - goos: darwin - goarch: arm - steps: - - name: "Checkout Repository" - uses: actions/checkout@v4 - with: - # fetch the whole repo for `git describe` to work - fetch-depth: 0 - - - name: "Read Go Version" - run: | - echo "GOVER=$(sed -n 's/^go \(.*\)/\1/p' go.mod)" >> $GITHUB_OUTPUT - id: goversion - - - name: "Setup Go" - uses: actions/setup-go@v3 - with: - go-version: ${{ steps.goversion.outputs.GOVER }} - - - name: "Ensure CI build" - if: github.ref == 'refs/heads/master' - run: | - echo "FORCE_CI=true" >> $GITHUB_OUTPUT - id: force_ci - - - name: "Get aptly version" - env: - FORCE_CI: ${{ steps.force_ci.outputs.FORCE_CI }} - run: | - aptlyver=$(make -s version) - echo "Aptly Version: $aptlyver" - echo "VERSION=$aptlyver" >> $GITHUB_OUTPUT - id: releaseversion - - - name: "Build aptly ${{ matrix.goos }}/${{ matrix.goarch }}" - env: - GOBIN: /usr/local/bin - FORCE_CI: ${{ steps.force_ci.outputs.FORCE_CI }} - run: | - make binaries GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} - - - name: "Upload Artifacts" - uses: actions/upload-artifact@v4 - if: startsWith(github.event.ref, 'refs/tags') - with: - name: aptly_${{ steps.releaseversion.outputs.VERSION }}_${{ matrix.goos }}_${{ matrix.goarch }} - path: build/aptly_${{ steps.releaseversion.outputs.VERSION }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip - compression-level: 0 # no compression - - gh-release: - name: "Github Release" - runs-on: ubuntu-latest - continue-on-error: false - needs: ci-binary-build - if: startsWith(github.event.ref, 'refs/tags') - steps: - - name: "Checkout Repository" - uses: actions/checkout@v4 - - - name: "Get aptly version" - env: - FORCE_CI: ${{ steps.force_ci.outputs.FORCE_CI }} - run: | - aptlyver=$(make -s version) - echo "Aptly Version: $aptlyver" - echo "VERSION=$aptlyver" >> $GITHUB_OUTPUT - id: releaseversion - - - name: "Download Artifacts" - uses: actions/download-artifact@v4 - with: - path: out/ - - - name: "Create Release Notes" - run: | - echo -e "## Changes\n\n" > out/release-notes.md - dpkg-parsechangelog -S Changes | tail -n +4 >> out/release-notes.md - - - name: "Release" - uses: softprops/action-gh-release@v2 - with: - name: "Aptly Release ${{ steps.releaseversion.outputs.VERSION }}" - files: "out/**/aptly_*.zip" - body_path: "out/release-notes.md" diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml deleted file mode 100644 index 8da4335af..000000000 --- a/.github/workflows/golangci-lint.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: golangci-lint -on: - push: - branches: - - master - pull_request: - -permissions: - contents: read - # Optional: allow read access to pull request. Use with `only-new-issues` option. - # pull-requests: read - -jobs: - golangci: - name: lint - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: "Read go version from go.mod" - run: | - echo "GOVER=$(sed -n 's/^go \(.*\)/\1/p' go.mod)" >> $GITHUB_OUTPUT - id: goversion - - - name: "Setup Go" - uses: actions/setup-go@v3 - with: - go-version: ${{ steps.goversion.outputs.GOVER }} - - - name: Create VERSION file - run: | - make -s version | tr -d '\n' > VERSION - shell: sh - - - name: Install and initialize swagger - run: | - go install github.com/swaggo/swag/cmd/swag@latest - swag init -q --markdownFiles docs - shell: sh - - - name: golangci-lint - uses: golangci/golangci-lint-action@v4 - with: - # Require: The version of golangci-lint to use. - # When `install-mode` is `binary` (default) the value can be v1.2 or v1.2.3 or `latest` to use the latest version. - # When `install-mode` is `goinstall` the value can be v1.2.3, `latest`, or the hash of a commit. - version: v1.54.1 - - # Optional: working directory, useful for monorepos - # working-directory: somedir - - # Optional: golangci-lint command line arguments. - # - # Note: By default, the `.golangci.yml` file should be at the root of the repository. - # The location of the configuration file can be changed by using `--config=` - # args: --timeout=30m --config=/my/path/.golangci.yml --issues-exit-code=0 - - # Optional: show only new issues if it's a pull request. The default value is `false`. - # only-new-issues: true - - # Optional: if set to true, then all caching functionality will be completely disabled, - # takes precedence over all other caching options. - # skip-cache: true - - # Optional: if set to true, then the action won't cache or restore ~/go/pkg. - # skip-pkg-cache: true - - # Optional: if set to true, then the action won't cache or restore ~/.cache/go-build. - # skip-build-cache: true - - # Optional: The mode to install golangci-lint. It can be 'binary' or 'goinstall'. - # install-mode: "goinstall" diff --git a/api/router.go b/api/router.go index 3536ab096..7dbf16ef1 100644 --- a/api/router.go +++ b/api/router.go @@ -12,9 +12,9 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/rs/zerolog/log" - "github.com/aptly-dev/aptly/docs" - swaggerFiles "github.com/swaggo/files" - ginSwagger "github.com/swaggo/gin-swagger" + // _ "github.com/aptly-dev/aptly/docs" // import docs + // swaggerFiles "github.com/swaggo/files" + // ginSwagger "github.com/swaggo/gin-swagger" ) var context *ctx.AptlyContext @@ -68,14 +68,14 @@ func Router(c *ctx.AptlyContext) http.Handler { router.Use(gin.Recovery(), gin.ErrorLogger()) - if c.Config().EnableSwaggerEndpoint { - router.GET("docs.html", func(c *gin.Context) { - c.Data(http.StatusOK, "text/html; charset=utf-8", docs.DocsHTML) - }) - router.Use(redirectSwagger) - url := ginSwagger.URL("/docs/doc.json") - router.GET("/docs/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url)) - } + // if c.Config().EnableSwaggerEndpoint { + // router.GET("docs.html", func(c *gin.Context) { + // c.Data(http.StatusOK, "text/html; charset=utf-8", docs.DocsHTML) + // }) + // router.Use(redirectSwagger) + // url := ginSwagger.URL("/docs/doc.json") + // router.GET("/docs/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url)) + // } if c.Config().EnableMetricsEndpoint { MetricsCollectorRegistrar.Register(router) diff --git a/azure/azure.go b/azure/azure.go index 3f12678b1..b313f9047 100644 --- a/azure/azure.go +++ b/azure/azure.go @@ -5,35 +5,28 @@ package azure import ( "context" "encoding/hex" - "errors" "fmt" "io" - "os" + "net/url" "path/filepath" "time" - "github.com/Azure/azure-sdk-for-go/sdk/azcore" - "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" - "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" + "github.com/Azure/azure-storage-blob-go/azblob" "github.com/aptly-dev/aptly/aptly" ) func isBlobNotFound(err error) bool { - var respErr *azcore.ResponseError - if errors.As(err, &respErr) { - return respErr.StatusCode == 404 // BlobNotFound - } - return false + storageError, ok := err.(azblob.StorageError) + return ok && storageError.ServiceCode() == azblob.ServiceCodeBlobNotFound } type azContext struct { - client *azblob.Client - container string + container azblob.ContainerURL prefix string } func newAzContext(accountName, accountKey, container, prefix, endpoint string) (*azContext, error) { - cred, err := azblob.NewSharedKeyCredential(accountName, accountKey) + credential, err := azblob.NewSharedKeyCredential(accountName, accountKey) if err != nil { return nil, err } @@ -42,14 +35,15 @@ func newAzContext(accountName, accountKey, container, prefix, endpoint string) ( endpoint = fmt.Sprintf("https://%s.blob.core.windows.net", accountName) } - serviceClient, err := azblob.NewClientWithSharedKeyCredential(endpoint, cred, nil) + url, err := url.Parse(fmt.Sprintf("%s/%s", endpoint, container)) if err != nil { return nil, err } + containerURL := azblob.NewContainerURL(*url, azblob.NewPipeline(credential, azblob.PipelineOptions{})) + result := &azContext{ - client: serviceClient, - container: container, + container: containerURL, prefix: prefix, } @@ -60,6 +54,10 @@ func (az *azContext) blobPath(path string) string { return filepath.Join(az.prefix, path) } +func (az *azContext) blobURL(path string) azblob.BlobURL { + return az.container.NewBlobURL(az.blobPath(path)) +} + func (az *azContext) internalFilelist(prefix string, progress aptly.Progress) (paths []string, md5s []string, err error) { const delimiter = "/" paths = make([]string, 0, 1024) @@ -69,33 +67,27 @@ func (az *azContext) internalFilelist(prefix string, progress aptly.Progress) (p prefix += delimiter } - ctx := context.Background() - maxResults := int32(1) - pager := az.client.NewListBlobsFlatPager(az.container, &azblob.ListBlobsFlatOptions{ - Prefix: &prefix, - MaxResults: &maxResults, - Include: azblob.ListBlobsInclude{Metadata: true}, - }) - - // Iterate over each page - for pager.More() { - page, err := pager.NextPage(ctx) + for marker := (azblob.Marker{}); marker.NotDone(); { + listBlob, err := az.container.ListBlobsFlatSegment( + context.Background(), marker, azblob.ListBlobsSegmentOptions{ + Prefix: prefix, + MaxResults: 1, + Details: azblob.BlobListingDetails{Metadata: true}}) if err != nil { return nil, nil, fmt.Errorf("error listing under prefix %s in %s: %s", prefix, az, err) } - for _, blob := range page.Segment.BlobItems { + marker = listBlob.NextMarker + + for _, blob := range listBlob.Segment.BlobItems { if prefix == "" { - paths = append(paths, *blob.Name) + paths = append(paths, blob.Name) } else { - name := *blob.Name - paths = append(paths, name[len(prefix):]) + paths = append(paths, blob.Name[len(prefix):]) } - b := *blob - md5 := b.Properties.ContentMD5 - md5s = append(md5s, fmt.Sprintf("%x", md5)) - + md5s = append(md5s, fmt.Sprintf("%x", blob.Properties.ContentMD5)) } + if progress != nil { time.Sleep(time.Duration(500) * time.Millisecond) progress.AddBar(1) @@ -105,27 +97,28 @@ func (az *azContext) internalFilelist(prefix string, progress aptly.Progress) (p return paths, md5s, nil } -func (az *azContext) putFile(blobName string, source io.Reader, sourceMD5 string) error { - uploadOptions := &azblob.UploadFileOptions{ - BlockSize: 4 * 1024 * 1024, - Concurrency: 8, +func (az *azContext) putFile(blob azblob.BlobURL, source io.Reader, sourceMD5 string) error { + uploadOptions := azblob.UploadStreamToBlockBlobOptions{ + BufferSize: 4 * 1024 * 1024, + MaxBuffers: 8, } - path := az.blobPath(blobName) if len(sourceMD5) > 0 { decodedMD5, err := hex.DecodeString(sourceMD5) if err != nil { return err } - uploadOptions.HTTPHeaders = &blob.HTTPHeaders{ - BlobContentMD5: decodedMD5, + uploadOptions.BlobHTTPHeaders = azblob.BlobHTTPHeaders{ + ContentMD5: decodedMD5, } } - var err error - if file, ok := source.(*os.File); ok { - _, err = az.client.UploadFile(context.TODO(), az.container, path, file, uploadOptions) - } + _, err := azblob.UploadStreamToBlockBlob( + context.Background(), + source, + blob.ToBlockBlobURL(), + uploadOptions, + ) return err } diff --git a/azure/package_pool.go b/azure/package_pool.go index ad32a11ff..167ab6bed 100644 --- a/azure/package_pool.go +++ b/azure/package_pool.go @@ -5,6 +5,7 @@ import ( "os" "path/filepath" + "github.com/Azure/azure-storage-blob-go/azblob" "github.com/aptly-dev/aptly/aptly" "github.com/aptly-dev/aptly/utils" "github.com/pkg/errors" @@ -40,7 +41,10 @@ func (pool *PackagePool) buildPoolPath(filename string, checksums *utils.Checksu return filepath.Join(hash[0:2], hash[2:4], hash[4:32]+"_"+filename) } -func (pool *PackagePool) ensureChecksums(poolPath string, checksumStorage aptly.ChecksumStorage) (*utils.ChecksumInfo, error) { +func (pool *PackagePool) ensureChecksums( + poolPath string, + checksumStorage aptly.ChecksumStorage, +) (*utils.ChecksumInfo, error) { targetChecksums, err := checksumStorage.Get(poolPath) if err != nil { return nil, err @@ -48,7 +52,8 @@ func (pool *PackagePool) ensureChecksums(poolPath string, checksumStorage aptly. if targetChecksums == nil { // we don't have checksums stored yet for this file - download, err := pool.az.client.DownloadStream(context.Background(), pool.az.container, poolPath, nil) + blob := pool.az.blobURL(poolPath) + download, err := blob.Download(context.Background(), 0, 0, azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{}) if err != nil { if isBlobNotFound(err) { return nil, nil @@ -58,7 +63,7 @@ func (pool *PackagePool) ensureChecksums(poolPath string, checksumStorage aptly. } targetChecksums = &utils.ChecksumInfo{} - *targetChecksums, err = utils.ChecksumsForReader(download.Body) + *targetChecksums, err = utils.ChecksumsForReader(download.Body(azblob.RetryReaderOptions{})) if err != nil { return nil, errors.Wrapf(err, "error checksumming blob at %s", poolPath) } @@ -87,49 +92,46 @@ func (pool *PackagePool) LegacyPath(_ string, _ *utils.ChecksumInfo) (string, er } func (pool *PackagePool) Size(path string) (int64, error) { - serviceClient := pool.az.client.ServiceClient() - containerClient := serviceClient.NewContainerClient(pool.az.container) - blobClient := containerClient.NewBlobClient(path) - - props, err := blobClient.GetProperties(context.TODO(), nil) + blob := pool.az.blobURL(path) + props, err := blob.GetProperties(context.Background(), azblob.BlobAccessConditions{}, azblob.ClientProvidedKeyOptions{}) if err != nil { return 0, errors.Wrapf(err, "error examining %s from %s", path, pool) } - return *props.ContentLength, nil + return props.ContentLength(), nil } func (pool *PackagePool) Open(path string) (aptly.ReadSeekerCloser, error) { + blob := pool.az.blobURL(path) + temp, err := os.CreateTemp("", "blob-download") if err != nil { - return nil, errors.Wrapf(err, "error creating tempfile for %s", path) + return nil, errors.Wrap(err, "error creating temporary file for blob download") } + defer os.Remove(temp.Name()) - _, err = pool.az.client.DownloadFile(context.TODO(), pool.az.container, path, temp, nil) + err = azblob.DownloadBlobToFile(context.Background(), blob, 0, 0, temp, azblob.DownloadFromBlobOptions{}) if err != nil { - return nil, errors.Wrapf(err, "error downloading blob %s", path) + return nil, errors.Wrapf(err, "error downloading blob at %s", path) } return temp, nil } func (pool *PackagePool) Remove(path string) (int64, error) { - serviceClient := pool.az.client.ServiceClient() - containerClient := serviceClient.NewContainerClient(pool.az.container) - blobClient := containerClient.NewBlobClient(path) - - props, err := blobClient.GetProperties(context.TODO(), nil) + blob := pool.az.blobURL(path) + props, err := blob.GetProperties(context.Background(), azblob.BlobAccessConditions{}, azblob.ClientProvidedKeyOptions{}) if err != nil { - return 0, errors.Wrapf(err, "error examining %s from %s", path, pool) + return 0, errors.Wrapf(err, "error getting props of %s from %s", path, pool) } - _, err = pool.az.client.DeleteBlob(context.Background(), pool.az.container, path, nil) + _, err = blob.Delete(context.Background(), azblob.DeleteSnapshotsOptionNone, azblob.BlobAccessConditions{}) if err != nil { return 0, errors.Wrapf(err, "error deleting %s from %s", path, pool) } - return *props.ContentLength, nil + return props.ContentLength(), nil } func (pool *PackagePool) Import(srcPath, basename string, checksums *utils.ChecksumInfo, _ bool, checksumStorage aptly.ChecksumStorage) (string, error) { @@ -143,6 +145,7 @@ func (pool *PackagePool) Import(srcPath, basename string, checksums *utils.Check } path := pool.buildPoolPath(basename, checksums) + blob := pool.az.blobURL(path) targetChecksums, err := pool.ensureChecksums(path, checksumStorage) if err != nil { return "", err @@ -158,7 +161,7 @@ func (pool *PackagePool) Import(srcPath, basename string, checksums *utils.Check } defer source.Close() - err = pool.az.putFile(path, source, checksums.MD5) + err = pool.az.putFile(blob, source, checksums.MD5) if err != nil { return "", err } diff --git a/azure/package_pool_test.go b/azure/package_pool_test.go index a32bbff76..58949ec63 100644 --- a/azure/package_pool_test.go +++ b/azure/package_pool_test.go @@ -7,7 +7,7 @@ import ( "path/filepath" "runtime" - "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" + "github.com/Azure/azure-storage-blob-go/azblob" "github.com/aptly-dev/aptly/aptly" "github.com/aptly-dev/aptly/files" "github.com/aptly-dev/aptly/utils" @@ -50,10 +50,8 @@ func (s *PackagePoolSuite) SetUpTest(c *C) { s.pool, err = NewPackagePool(s.accountName, s.accountKey, container, "", s.endpoint) c.Assert(err, IsNil) - publicAccessType := azblob.PublicAccessTypeContainer - _, err = s.pool.az.client.CreateContainer(context.TODO(), s.pool.az.container, &azblob.CreateContainerOptions{ - Access: &publicAccessType, - }) + cnt := s.pool.az.container + _, err = cnt.Create(context.Background(), azblob.Metadata{}, azblob.PublicAccessContainer) c.Assert(err, IsNil) s.prefixedPool, err = NewPackagePool(s.accountName, s.accountKey, container, prefix, s.endpoint) diff --git a/azure/public.go b/azure/public.go index 8792ee243..50a820298 100644 --- a/azure/public.go +++ b/azure/public.go @@ -3,21 +3,20 @@ package azure import ( "context" "fmt" + "net/http" "os" "path/filepath" "time" - "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" - "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" - "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/lease" + "github.com/Azure/azure-storage-blob-go/azblob" "github.com/aptly-dev/aptly/aptly" "github.com/aptly-dev/aptly/utils" - "github.com/google/uuid" "github.com/pkg/errors" ) // PublishedStorage abstract file system with published files (actually hosted on Azure) type PublishedStorage struct { + container azblob.ContainerURL prefix string az *azContext pathCache map[string]map[string]string @@ -67,7 +66,7 @@ func (storage *PublishedStorage) PutFile(path string, sourceFilename string) err } defer source.Close() - err = storage.az.putFile(path, source, sourceMD5) + err = storage.az.putFile(storage.az.blobURL(path), source, sourceMD5) if err != nil { err = errors.Wrap(err, fmt.Sprintf("error uploading %s to %s", sourceFilename, storage)) } @@ -77,15 +76,14 @@ func (storage *PublishedStorage) PutFile(path string, sourceFilename string) err // RemoveDirs removes directory structure under public path func (storage *PublishedStorage) RemoveDirs(path string, _ aptly.Progress) error { - path = storage.az.blobPath(path) filelist, err := storage.Filelist(path) if err != nil { return err } for _, filename := range filelist { - blob := filepath.Join(path, filename) - _, err := storage.az.client.DeleteBlob(context.Background(), storage.az.container, blob, nil) + blob := storage.az.blobURL(filepath.Join(path, filename)) + _, err := blob.Delete(context.Background(), azblob.DeleteSnapshotsOptionNone, azblob.BlobAccessConditions{}) if err != nil { return fmt.Errorf("error deleting path %s from %s: %s", filename, storage, err) } @@ -96,8 +94,8 @@ func (storage *PublishedStorage) RemoveDirs(path string, _ aptly.Progress) error // Remove removes single file under public path func (storage *PublishedStorage) Remove(path string) error { - path = storage.az.blobPath(path) - _, err := storage.az.client.DeleteBlob(context.Background(), storage.az.container, path, nil) + blob := storage.az.blobURL(path) + _, err := blob.Delete(context.Background(), azblob.DeleteSnapshotsOptionNone, azblob.BlobAccessConditions{}) if err != nil { err = errors.Wrap(err, fmt.Sprintf("error deleting %s from %s: %s", path, storage, err)) } @@ -116,8 +114,9 @@ func (storage *PublishedStorage) LinkFromPool(publishedPrefix, publishedRelPath, sourcePath string, sourceChecksums utils.ChecksumInfo, force bool) error { relFilePath := filepath.Join(publishedRelPath, fileName) - prefixRelFilePath := filepath.Join(publishedPrefix, relFilePath) - poolPath := storage.az.blobPath(prefixRelFilePath) + // prefixRelFilePath := filepath.Join(publishedPrefix, relFilePath) + // FIXME: check how to integrate publishedPrefix: + poolPath := storage.az.blobPath(fileName) if storage.pathCache == nil { storage.pathCache = make(map[string]map[string]string) @@ -160,7 +159,7 @@ func (storage *PublishedStorage) LinkFromPool(publishedPrefix, publishedRelPath, } defer source.Close() - err = storage.az.putFile(relFilePath, source, sourceMD5) + err = storage.az.putFile(storage.az.blobURL(relFilePath), source, sourceMD5) if err == nil { pathCache[relFilePath] = sourceMD5 } else { @@ -177,58 +176,57 @@ func (storage *PublishedStorage) Filelist(prefix string) ([]string, error) { } // Internal copy or move implementation -func (storage *PublishedStorage) internalCopyOrMoveBlob(src, dst string, metadata map[string]*string, move bool) error { +func (storage *PublishedStorage) internalCopyOrMoveBlob(src, dst string, metadata azblob.Metadata, move bool) error { const leaseDuration = 30 - leaseID := uuid.NewString() - serviceClient := storage.az.client.ServiceClient() - containerClient := serviceClient.NewContainerClient(storage.az.container) - srcBlobClient := containerClient.NewBlobClient(src) - blobLeaseClient, err := lease.NewBlobClient(srcBlobClient, &lease.BlobClientOptions{LeaseID: to.Ptr(leaseID)}) - if err != nil { - return fmt.Errorf("error acquiring lease on source blob %s", src) - } - - _, err = blobLeaseClient.AcquireLease(context.Background(), leaseDuration, nil) - if err != nil { - return fmt.Errorf("error acquiring lease on source blob %s", src) + dstBlobURL := storage.az.blobURL(dst) + srcBlobURL := storage.az.blobURL(src) + leaseResp, err := srcBlobURL.AcquireLease(context.Background(), "", leaseDuration, azblob.ModifiedAccessConditions{}) + if err != nil || leaseResp.StatusCode() != http.StatusCreated { + return fmt.Errorf("error acquiring lease on source blob %s", srcBlobURL) } - defer blobLeaseClient.BreakLease(context.Background(), &lease.BlobBreakOptions{BreakPeriod: to.Ptr(int32(60))}) - - dstBlobClient := containerClient.NewBlobClient(dst) - copyResp, err := dstBlobClient.StartCopyFromURL(context.Background(), srcBlobClient.URL(), &blob.StartCopyFromURLOptions{ - Metadata: metadata, - }) - + defer srcBlobURL.BreakLease(context.Background(), azblob.LeaseBreakNaturally, azblob.ModifiedAccessConditions{}) + srcBlobLeaseID := leaseResp.LeaseID() + + copyResp, err := dstBlobURL.StartCopyFromURL( + context.Background(), + srcBlobURL.URL(), + metadata, + azblob.ModifiedAccessConditions{}, + azblob.BlobAccessConditions{}, + azblob.DefaultAccessTier, + nil) if err != nil { return fmt.Errorf("error copying %s -> %s in %s: %s", src, dst, storage, err) } - copyStatus := *copyResp.CopyStatus + copyStatus := copyResp.CopyStatus() for { - if copyStatus == blob.CopyStatusTypeSuccess { + if copyStatus == azblob.CopyStatusSuccess { if move { - _, err := storage.az.client.DeleteBlob(context.Background(), storage.az.container, src, &blob.DeleteOptions{ - AccessConditions: &blob.AccessConditions{ - LeaseAccessConditions: &blob.LeaseAccessConditions{ - LeaseID: &leaseID, - }, - }, - }) + _, err = srcBlobURL.Delete( + context.Background(), + azblob.DeleteSnapshotsOptionNone, + azblob.BlobAccessConditions{ + LeaseAccessConditions: azblob.LeaseAccessConditions{LeaseID: srcBlobLeaseID}, + }) return err } return nil - } else if copyStatus == blob.CopyStatusTypePending { + } else if copyStatus == azblob.CopyStatusPending { time.Sleep(1 * time.Second) - getMetadata, err := dstBlobClient.GetProperties(context.TODO(), nil) + blobPropsResp, err := dstBlobURL.GetProperties( + context.Background(), + azblob.BlobAccessConditions{LeaseAccessConditions: azblob.LeaseAccessConditions{LeaseID: srcBlobLeaseID}}, + azblob.ClientProvidedKeyOptions{}) if err != nil { - return fmt.Errorf("error getting copy progress %s", dst) + return fmt.Errorf("error getting destination blob properties %s", dstBlobURL) } - copyStatus = *getMetadata.CopyStatus + copyStatus = blobPropsResp.CopyStatus() - _, err = blobLeaseClient.RenewLease(context.Background(), nil) + _, err = srcBlobURL.RenewLease(context.Background(), srcBlobLeaseID, azblob.ModifiedAccessConditions{}) if err != nil { - return fmt.Errorf("error renewing source blob lease %s", src) + return fmt.Errorf("error renewing source blob lease %s", srcBlobURL) } } else { return fmt.Errorf("error copying %s -> %s in %s: %s", dst, src, storage, copyStatus) @@ -243,9 +241,7 @@ func (storage *PublishedStorage) RenameFile(oldName, newName string) error { // SymLink creates a copy of src file and adds link information as meta data func (storage *PublishedStorage) SymLink(src string, dst string) error { - metadata := make(map[string]*string) - metadata["SymLink"] = &src - return storage.internalCopyOrMoveBlob(src, dst, metadata, false /* do not remove src */) + return storage.internalCopyOrMoveBlob(src, dst, azblob.Metadata{"SymLink": src}, false /* move */) } // HardLink using symlink functionality as hard links do not exist @@ -255,33 +251,28 @@ func (storage *PublishedStorage) HardLink(src string, dst string) error { // FileExists returns true if path exists func (storage *PublishedStorage) FileExists(path string) (bool, error) { - serviceClient := storage.az.client.ServiceClient() - containerClient := serviceClient.NewContainerClient(storage.az.container) - blobClient := containerClient.NewBlobClient(path) - _, err := blobClient.GetProperties(context.Background(), nil) + blob := storage.az.blobURL(path) + resp, err := blob.GetProperties(context.Background(), azblob.BlobAccessConditions{}, azblob.ClientProvidedKeyOptions{}) if err != nil { if isBlobNotFound(err) { return false, nil } - return false, fmt.Errorf("error checking if blob %s exists: %v", path, err) + return false, err + } else if resp.StatusCode() == http.StatusOK { + return true, nil } - return true, nil + return false, fmt.Errorf("error checking if blob %s exists %d", blob, resp.StatusCode()) } // ReadLink returns the symbolic link pointed to by path. // This simply reads text file created with SymLink func (storage *PublishedStorage) ReadLink(path string) (string, error) { - serviceClient := storage.az.client.ServiceClient() - containerClient := serviceClient.NewContainerClient(storage.az.container) - blobClient := containerClient.NewBlobClient(path) - props, err := blobClient.GetProperties(context.Background(), nil) + blob := storage.az.blobURL(path) + resp, err := blob.GetProperties(context.Background(), azblob.BlobAccessConditions{}, azblob.ClientProvidedKeyOptions{}) if err != nil { - return "", fmt.Errorf("failed to get blob properties: %v", err) - } - - metadata := props.Metadata - if originalBlob, exists := metadata["original_blob"]; exists { - return *originalBlob, nil + return "", err + } else if resp.StatusCode() != http.StatusOK { + return "", fmt.Errorf("error checking if blob %s exists %d", blob, resp.StatusCode()) } - return "", fmt.Errorf("error reading link %s: %v", path, err) + return resp.NewMetadata()["SymLink"], nil } diff --git a/azure/public_test.go b/azure/public_test.go index 3acd767f7..767f2495d 100644 --- a/azure/public_test.go +++ b/azure/public_test.go @@ -7,11 +7,8 @@ import ( "io/ioutil" "os" "path/filepath" - "bytes" - "github.com/Azure/azure-sdk-for-go/sdk/azcore" - "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" - "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" + "github.com/Azure/azure-storage-blob-go/azblob" "github.com/aptly-dev/aptly/files" "github.com/aptly-dev/aptly/utils" . "gopkg.in/check.v1" @@ -69,10 +66,8 @@ func (s *PublishedStorageSuite) SetUpTest(c *C) { s.storage, err = NewPublishedStorage(s.accountName, s.accountKey, container, "", s.endpoint) c.Assert(err, IsNil) - publicAccessType := azblob.PublicAccessTypeContainer - _, err = s.storage.az.client.CreateContainer(context.Background(), s.storage.az.container, &azblob.CreateContainerOptions{ - Access: &publicAccessType, - }) + cnt := s.storage.az.container + _, err = cnt.Create(context.Background(), azblob.Metadata{}, azblob.PublicAccessContainer) c.Assert(err, IsNil) s.prefixedStorage, err = NewPublishedStorage(s.accountName, s.accountKey, container, prefix, s.endpoint) @@ -80,39 +75,41 @@ func (s *PublishedStorageSuite) SetUpTest(c *C) { } func (s *PublishedStorageSuite) TearDownTest(c *C) { - _, err := s.storage.az.client.DeleteContainer(context.Background(), s.storage.az.container, nil) + cnt := s.storage.az.container + _, err := cnt.Delete(context.Background(), azblob.ContainerAccessConditions{}) c.Assert(err, IsNil) } func (s *PublishedStorageSuite) GetFile(c *C, path string) []byte { - resp, err := s.storage.az.client.DownloadStream(context.Background(), s.storage.az.container, path, nil) + blob := s.storage.az.container.NewBlobURL(path) + resp, err := blob.Download(context.Background(), 0, azblob.CountToEnd, azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{}) c.Assert(err, IsNil) - data, err := ioutil.ReadAll(resp.Body) + body := resp.Body(azblob.RetryReaderOptions{MaxRetryRequests: 3}) + data, err := ioutil.ReadAll(body) c.Assert(err, IsNil) return data } func (s *PublishedStorageSuite) AssertNoFile(c *C, path string) { - serviceClient := s.storage.az.client.ServiceClient() - containerClient := serviceClient.NewContainerClient(s.storage.az.container) - blobClient := containerClient.NewBlobClient(path) - _, err := blobClient.GetProperties(context.Background(), nil) + _, err := s.storage.az.container.NewBlobURL(path).GetProperties( + context.Background(), azblob.BlobAccessConditions{}, azblob.ClientProvidedKeyOptions{}) c.Assert(err, NotNil) - - storageError, ok := err.(*azcore.ResponseError) + storageError, ok := err.(azblob.StorageError) c.Assert(ok, Equals, true) - c.Assert(storageError.StatusCode, Equals, 404) + c.Assert(string(storageError.ServiceCode()), Equals, string(string(azblob.StorageErrorCodeBlobNotFound))) } func (s *PublishedStorageSuite) PutFile(c *C, path string, data []byte) { hash := md5.Sum(data) - uploadOptions := &azblob.UploadStreamOptions{ - HTTPHeaders: &blob.HTTPHeaders{ - BlobContentMD5: hash[:], - }, - } - reader := bytes.NewReader(data) - _, err := s.storage.az.client.UploadStream(context.Background(), s.storage.az.container, path, reader, uploadOptions) + _, err := azblob.UploadBufferToBlockBlob( + context.Background(), + data, + s.storage.az.container.NewBlockBlobURL(path), + azblob.UploadToBlockBlobOptions{ + BlobHTTPHeaders: azblob.BlobHTTPHeaders{ + ContentMD5: hash[:], + }, + }) c.Assert(err, IsNil) } @@ -333,7 +330,7 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { // 2nd link from pool, providing wrong path for source file // - // this test should check that file already exists in Azure and skip upload (which would fail if not skipped) + // this test should check that file already exists in S3 and skip upload (which would fail if not skipped) s.prefixedStorage.pathCache = nil err = s.prefixedStorage.LinkFromPool("", filepath.Join("pool", "main", "m/mars-invaders"), "mars-invaders_1.03.deb", pool, "wrong-looks-like-pathcache-doesnt-work", cksum1, false) c.Check(err, IsNil) diff --git a/context/context.go b/context/context.go index 5df5bbfd9..f3f2e1224 100644 --- a/context/context.go +++ b/context/context.go @@ -19,7 +19,6 @@ import ( "github.com/aptly-dev/aptly/azure" "github.com/aptly-dev/aptly/console" "github.com/aptly-dev/aptly/database" - "github.com/aptly-dev/aptly/database/etcddb" "github.com/aptly-dev/aptly/database/goleveldb" "github.com/aptly-dev/aptly/deb" "github.com/aptly-dev/aptly/files" @@ -100,6 +99,7 @@ func (context *AptlyContext) config() *utils.ConfigStructure { configLocations := []string{homeLocation, "/usr/local/etc/aptly.conf", "/etc/aptly.conf"} for _, configLocation := range configLocations { + // FIXME: check if exists, check if readable err = utils.LoadConfig(configLocation, &utils.Config) if os.IsPermission(err) || os.IsNotExist(err) { continue @@ -299,8 +299,6 @@ func (context *AptlyContext) _database() (database.Storage, error) { dbPath = context.config().DatabaseBackend.DbPath } context.database, err = goleveldb.NewDB(dbPath) - case "etcd": - context.database, err = etcddb.NewDB(context.config().DatabaseBackend.URL) default: context.database, err = goleveldb.NewDB(context.dbPath()) } diff --git a/database/etcddb/batch.go b/database/etcddb/batch.go deleted file mode 100644 index 24b83de94..000000000 --- a/database/etcddb/batch.go +++ /dev/null @@ -1,53 +0,0 @@ -package etcddb - -import ( - "github.com/aptly-dev/aptly/database" - clientv3 "go.etcd.io/etcd/client/v3" -) - -type EtcDBatch struct { - s *EtcDStorage - ops []clientv3.Op -} - -type WriteOptions struct { - NoWriteMerge bool - Sync bool -} - -func (b *EtcDBatch) Put(key []byte, value []byte) (err error) { - b.ops = append(b.ops, clientv3.OpPut(string(key), string(value))) - return -} - -func (b *EtcDBatch) Delete(key []byte) (err error) { - b.ops = append(b.ops, clientv3.OpDelete(string(key))) - return -} - -func (b *EtcDBatch) Write() (err error) { - kv := clientv3.NewKV(b.s.db) - - batchSize := 128 - for i := 0; i < len(b.ops); i += batchSize { - txn := kv.Txn(Ctx) - end := i + batchSize - if end > len(b.ops) { - end = len(b.ops) - } - - batch := b.ops[i:end] - txn.Then(batch...) - _, err = txn.Commit() - if err != nil { - panic(err) - } - } - - return -} - -// batch should implement database.Batch -var ( - _ database.Batch = &EtcDBatch{} -) diff --git a/database/etcddb/database.go b/database/etcddb/database.go deleted file mode 100644 index 37a222e63..000000000 --- a/database/etcddb/database.go +++ /dev/null @@ -1,32 +0,0 @@ -package etcddb - -import ( - "context" - "time" - - "github.com/aptly-dev/aptly/database" - clientv3 "go.etcd.io/etcd/client/v3" -) - -var Ctx = context.TODO() - -func internalOpen(url string) (cli *clientv3.Client, err error) { - cfg := clientv3.Config{ - Endpoints: []string{url}, - DialTimeout: 30 * time.Second, - MaxCallSendMsgSize: 2147483647, // (2048 * 1024 * 1024) - 1 - MaxCallRecvMsgSize: 2147483647, - DialKeepAliveTimeout: 7200 * time.Second, - } - - cli, err = clientv3.New(cfg) - return -} - -func NewDB(url string) (database.Storage, error) { - cli, err := internalOpen(url) - if err != nil { - return nil, err - } - return &EtcDStorage{url, cli, ""}, nil -} diff --git a/database/etcddb/database_test.go b/database/etcddb/database_test.go deleted file mode 100644 index b31e5599e..000000000 --- a/database/etcddb/database_test.go +++ /dev/null @@ -1,158 +0,0 @@ -package etcddb_test - -import ( - "testing" - - "github.com/aptly-dev/aptly/database" - "github.com/aptly-dev/aptly/database/etcddb" - . "gopkg.in/check.v1" -) - -// Launch gocheck tests -func Test(t *testing.T) { - TestingT(t) -} - -type EtcDDBSuite struct { - url string - db database.Storage -} - -var _ = Suite(&EtcDDBSuite{}) - -func (s *EtcDDBSuite) SetUpTest(c *C) { - var err error - s.db, err = etcddb.NewDB("127.0.0.1:2379") - c.Assert(err, IsNil) -} - -func (s *EtcDDBSuite) TestSetUpTest(c *C) { - var err error - s.db, err = etcddb.NewDB("127.0.0.1:2379") - c.Assert(err, IsNil) -} - -func (s *EtcDDBSuite) TestGetPut(c *C) { - var ( - key = []byte("key") - value = []byte("value") - ) - var err error - - err = s.db.Put(key, value) - c.Assert(err, IsNil) - - result, err := s.db.Get(key) - c.Assert(err, IsNil) - c.Assert(result, DeepEquals, value) -} - -func (s *EtcDDBSuite) TestDelete(c *C) { - var ( - key = []byte("key") - value = []byte("value") - ) - - err := s.db.Put(key, value) - c.Assert(err, IsNil) - - _, err = s.db.Get(key) - c.Assert(err, IsNil) - - err = s.db.Delete(key) - c.Assert(err, IsNil) - -} - -func (s *EtcDDBSuite) TestByPrefix(c *C) { - //c.Check(s.db.FetchByPrefix([]byte{0x80}), DeepEquals, [][]byte{}) - - s.db.Put([]byte{0x80, 0x01}, []byte{0x01}) - s.db.Put([]byte{0x80, 0x03}, []byte{0x03}) - s.db.Put([]byte{0x80, 0x02}, []byte{0x02}) - c.Check(s.db.FetchByPrefix([]byte{0x80}), DeepEquals, [][]byte{{0x01}, {0x02}, {0x03}}) - c.Check(s.db.KeysByPrefix([]byte{0x80}), DeepEquals, [][]byte{{0x80, 0x01}, {0x80, 0x02}, {0x80, 0x03}}) - - s.db.Put([]byte{0x90, 0x01}, []byte{0x04}) - c.Check(s.db.FetchByPrefix([]byte{0x80}), DeepEquals, [][]byte{{0x01}, {0x02}, {0x03}}) - c.Check(s.db.KeysByPrefix([]byte{0x80}), DeepEquals, [][]byte{{0x80, 0x01}, {0x80, 0x02}, {0x80, 0x03}}) - - s.db.Put([]byte{0x00, 0x01}, []byte{0x05}) - c.Check(s.db.FetchByPrefix([]byte{0x80}), DeepEquals, [][]byte{{0x01}, {0x02}, {0x03}}) - c.Check(s.db.KeysByPrefix([]byte{0x80}), DeepEquals, [][]byte{{0x80, 0x01}, {0x80, 0x02}, {0x80, 0x03}}) - - keys := [][]byte{} - values := [][]byte{} - - c.Check(s.db.ProcessByPrefix([]byte{0x80}, func(k, v []byte) error { - keys = append(keys, append([]byte(nil), k...)) - values = append(values, append([]byte(nil), v...)) - return nil - }), IsNil) - - c.Check(values, DeepEquals, [][]byte{{0x01}, {0x02}, {0x03}}) - c.Check(keys, DeepEquals, [][]byte{{0x80, 0x01}, {0x80, 0x02}, {0x80, 0x03}}) - - c.Check(s.db.ProcessByPrefix([]byte{0x80}, func(k, v []byte) error { - return database.ErrNotFound - }), Equals, database.ErrNotFound) - - c.Check(s.db.ProcessByPrefix([]byte{0xa0}, func(k, v []byte) error { - return database.ErrNotFound - }), IsNil) - - c.Check(s.db.FetchByPrefix([]byte{0xa0}), DeepEquals, [][]byte{}) - c.Check(s.db.KeysByPrefix([]byte{0xa0}), DeepEquals, [][]byte{}) -} - -func (s *EtcDDBSuite) TestHasPrefix(c *C) { - //c.Check(s.db.HasPrefix([]byte(nil)), Equals, false) - //c.Check(s.db.HasPrefix([]byte{0x80}), Equals, false) - - s.db.Put([]byte{0x80, 0x01}, []byte{0x01}) - - c.Check(s.db.HasPrefix([]byte(nil)), Equals, true) - c.Check(s.db.HasPrefix([]byte{0x80}), Equals, true) - c.Check(s.db.HasPrefix([]byte{0x79}), Equals, false) -} - -func (s *EtcDDBSuite) TestTransactionCommit(c *C) { - var ( - key = []byte("key") - key2 = []byte("key2") - value = []byte("value") - value2 = []byte("value2") - ) - transaction, err := s.db.OpenTransaction() - - err = s.db.Put(key, value) - c.Assert(err, IsNil) - - c.Assert(err, IsNil) - transaction.Put(key2, value2) - v, err := s.db.Get(key) - c.Check(v, DeepEquals, value) - err = transaction.Delete(key) - c.Assert(err, IsNil) - - _, err = transaction.Get(key2) - c.Assert(err, IsNil) - - v2, err := transaction.Get(key2) - c.Check(err, IsNil) - c.Check(v2, DeepEquals, value2) - - _, err = transaction.Get(key) - c.Assert(err, IsNil) - - err = transaction.Commit() - c.Check(err, IsNil) - - v2, err = transaction.Get(key2) - c.Check(err, IsNil) - c.Check(v2, DeepEquals, value2) - - _, err = transaction.Get(key) - c.Assert(err, NotNil) -} - diff --git a/database/etcddb/storage.go b/database/etcddb/storage.go deleted file mode 100644 index 65e3913bb..000000000 --- a/database/etcddb/storage.go +++ /dev/null @@ -1,202 +0,0 @@ -package etcddb - -import ( - "fmt" - - "github.com/aptly-dev/aptly/database" - "github.com/google/uuid" - clientv3 "go.etcd.io/etcd/client/v3" -) - -type EtcDStorage struct { - url string - db *clientv3.Client - tmpPrefix string // prefix for temporary DBs -} - -// CreateTemporary creates new DB of the same type in temp dir -func (s *EtcDStorage) CreateTemporary() (database.Storage, error) { - tmp := uuid.NewString() - return &EtcDStorage{ - url: s.url, - db: s.db, - tmpPrefix: tmp, - }, nil -} - -func (s *EtcDStorage) applyPrefix(key []byte) []byte { - if len(s.tmpPrefix) != 0 { - return append([]byte(s.tmpPrefix+"/"), key...) - } - return key -} - -// Get key value from etcd -func (s *EtcDStorage) Get(key []byte) (value []byte, err error) { - realKey := s.applyPrefix(key) - getResp, err := s.db.Get(Ctx, string(realKey)) - if err != nil { - return - } - for _, kv := range getResp.Kvs { - value = kv.Value - break - } - if len(value) == 0 { - err = database.ErrNotFound - return - } - return -} - -// Put saves key to etcd, if key has the same value in DB already, it is not saved -func (s *EtcDStorage) Put(key []byte, value []byte) (err error) { - realKey := s.applyPrefix(key) - _, err = s.db.Put(Ctx, string(realKey), string(value)) - if err != nil { - return - } - return -} - -// Delete removes key from etcd -func (s *EtcDStorage) Delete(key []byte) (err error) { - realKey := s.applyPrefix(key) - _, err = s.db.Delete(Ctx, string(realKey)) - if err != nil { - return - } - return -} - -// KeysByPrefix returns all keys that start with prefix -func (s *EtcDStorage) KeysByPrefix(prefix []byte) [][]byte { - realPrefix := s.applyPrefix(prefix) - result := make([][]byte, 0, 20) - getResp, err := s.db.Get(Ctx, string(realPrefix), clientv3.WithPrefix()) - if err != nil { - return nil - } - for _, ev := range getResp.Kvs { - key := ev.Key - keyc := make([]byte, len(key)) - copy(keyc, key) - result = append(result, key) - } - return result -} - -// FetchByPrefix returns all values with keys that start with prefix -func (s *EtcDStorage) FetchByPrefix(prefix []byte) [][]byte { - realPrefix := s.applyPrefix(prefix) - result := make([][]byte, 0, 20) - getResp, err := s.db.Get(Ctx, string(realPrefix), clientv3.WithPrefix()) - if err != nil { - return nil - } - for _, kv := range getResp.Kvs { - valc := make([]byte, len(kv.Value)) - copy(valc, kv.Value) - result = append(result, kv.Value) - } - - return result -} - -// HasPrefix checks whether it can find any key with given prefix and returns true if one exists -func (s *EtcDStorage) HasPrefix(prefix []byte) bool { - realPrefix := s.applyPrefix(prefix) - getResp, err := s.db.Get(Ctx, string(realPrefix), clientv3.WithPrefix()) - if err != nil { - return false - } - return getResp.Count > 0 -} - -// ProcessByPrefix iterates through all entries where key starts with prefix and calls -// StorageProcessor on key value pair -func (s *EtcDStorage) ProcessByPrefix(prefix []byte, proc database.StorageProcessor) error { - realPrefix := s.applyPrefix(prefix) - getResp, err := s.db.Get(Ctx, string(realPrefix), clientv3.WithPrefix()) - if err != nil { - return err - } - - for _, kv := range getResp.Kvs { - err := proc(kv.Key, kv.Value) - if err != nil { - return err - } - } - return nil -} - -// Close finishes etcd connect -func (s *EtcDStorage) Close() error { - // do not close temporary db - if len(s.tmpPrefix) != 0 { - return nil - } - if s.db == nil { - return nil - } - err := s.db.Close() - s.db = nil - return err -} - -// Reopen tries to open (re-open) the database -func (s *EtcDStorage) Open() error { - if s.db != nil { - return nil - } - var err error - s.db, err = internalOpen(s.url) - return err -} - -// CreateBatch creates a Batch object -func (s *EtcDStorage) CreateBatch() database.Batch { - if s.db == nil { - return nil - } - return &EtcDBatch{ - s: s, - } -} - -// OpenTransaction creates new transaction. -func (s *EtcDStorage) OpenTransaction() (database.Transaction, error) { - tmpdb, err := s.CreateTemporary() - if err != nil { - return nil, err - } - return &transaction{s: s, tmpdb: tmpdb}, nil -} - -// CompactDB does nothing for etcd -func (s *EtcDStorage) CompactDB() error { - return nil -} - -// Drop removes only temporary DBs with etcd (i.e. remove all prefixed keys) -func (s *EtcDStorage) Drop() error { - if len(s.tmpPrefix) != 0 { - getResp, err := s.db.Get(Ctx, s.tmpPrefix, clientv3.WithPrefix()) - if err != nil { - return nil - } - for _, kv := range getResp.Kvs { - _, err = s.db.Delete(Ctx, string(kv.Key)) - if err != nil { - return fmt.Errorf("cannot delete tempdb entry: %s", kv.Key) - } - } - } - return nil -} - -// Check interface -var ( - _ database.Storage = &EtcDStorage{} -) diff --git a/database/etcddb/transaction.go b/database/etcddb/transaction.go deleted file mode 100644 index 01f54dad1..000000000 --- a/database/etcddb/transaction.go +++ /dev/null @@ -1,75 +0,0 @@ -package etcddb - -import ( - "github.com/aptly-dev/aptly/database" - clientv3 "go.etcd.io/etcd/client/v3" -) - -type transaction struct { - s *EtcDStorage - tmpdb database.Storage - ops []clientv3.Op -} - -// Get implements database.Reader interface. -func (t *transaction) Get(key []byte) (value []byte, err error) { - value, err = t.tmpdb.Get(key) - // if not found, search main db - if err != nil { - value, err = t.s.Get(key) - } - return -} - -// Put implements database.Writer interface. -func (t *transaction) Put(key, value []byte) (err error) { - err = t.tmpdb.Put(key, value) - if err != nil { - return - } - t.ops = append(t.ops, clientv3.OpPut(string(key), string(value))) - return -} - -// Delete implements database.Writer interface. -func (t *transaction) Delete(key []byte) (err error) { - err = t.tmpdb.Delete(key) - if err != nil { - return - } - t.ops = append(t.ops, clientv3.OpDelete(string(key))) - return -} - -func (t *transaction) Commit() (err error) { - kv := clientv3.NewKV(t.s.db) - - batchSize := 128 - for i := 0; i < len(t.ops); i += batchSize { - txn := kv.Txn(Ctx) - end := i + batchSize - if end > len(t.ops) { - end = len(t.ops) - } - - batch := t.ops[i:end] - txn.Then(batch...) - _, err = txn.Commit() - if err != nil { - panic(err) - } - } - t.ops = []clientv3.Op{} - - return -} - -// Discard is safe to call after Commit(), it would be no-op -func (t *transaction) Discard() { - t.ops = []clientv3.Op{} - t.tmpdb.Drop() - return -} - -// transaction should implement database.Transaction -var _ database.Transaction = &transaction{} diff --git a/deb/list.go b/deb/list.go index 28644e409..14a311c12 100644 --- a/deb/list.go +++ b/deb/list.go @@ -598,6 +598,7 @@ func (l *PackageList) Filter(options FilterOptions) (*PackageList, error) { // // when follow-all-variants is enabled, we need to try to expand anyway, // as even if dependency is satisfied now, there might be other ways to satisfy dependency + // FIXME: do not search twice if result.Search(dep, false, true) != nil { if options.DependencyOptions&DepVerboseResolve == DepVerboseResolve && options.Progress != nil { options.Progress.ColoredPrintf("@{y}Already satisfied dependency@|: %s with %s", &dep, result.Search(dep, true, true)) diff --git a/debian/aptly.conf b/debian/aptly.conf index c233118fb..72d528056 100644 --- a/debian/aptly.conf +++ b/debian/aptly.conf @@ -100,6 +100,7 @@ database_backend: # empty dbPath defaults to `rootDir`/db db_path: "" + # Not implemented in thie version. # type: etcd # # URL to db server # url: "127.0.0.1:2379" diff --git a/debian/control b/debian/control index 1255d8be4..1e2ff57e0 100644 --- a/debian/control +++ b/debian/control @@ -75,8 +75,10 @@ Build-Depends: bash-completion, golang-gopkg-yaml.v2-dev, golang-go.uber-multierr-dev, golang-go.uber-zap-dev, - golang-etcd-server-dev (>= 3.5.15-7), golang-gopkg-yaml.v3-dev, + golang-github-swaggo-files-dev, + golang-github-swaggo-gin-swagger-dev, + swag, git Standards-Version: 4.7.0 Homepage: https://www.aptly.info diff --git a/debian/molior.yml b/debian/molior.yml new file mode 100644 index 000000000..4ecf5abdb --- /dev/null +++ b/debian/molior.yml @@ -0,0 +1,8 @@ +config_version: "1" +targets: + molior: + - "1.5-next" +build_after: + - "go-xz" + - "golang-github-swaggo-files" + - "golang-github-swaggo-gin-swagger" diff --git a/debian/rules b/debian/rules index 1f8bcdddb..d174a5219 100755 --- a/debian/rules +++ b/debian/rules @@ -2,16 +2,6 @@ include /usr/share/dpkg/pkg-info.mk -export GOPATH=$(shell pwd)/.go -export DEB_BUILD_OPTIONS=crossbuildcanrunhostbinaries - -export GOARCH := $(shell if [ $(DEB_TARGET_ARCH) = "i386" ]; then echo "386"; elif [ $(DEB_TARGET_ARCH) = "armhf" ]; then echo "arm"; else echo $(DEB_TARGET_ARCH); fi) -export CGO_ENABLED=1 - -ifneq ($(DEB_HOST_GNU_TYPE), $(DEB_BUILD_GNU_TYPE)) - export CC=$(DEB_HOST_GNU_TYPE)-gcc -endif - %: dh $@ --buildsystem=golang --with=golang,bash-completion @@ -29,20 +19,9 @@ override_dh_auto_install: override_dh_strip: dh_strip --dbg-package=aptly-dbg -override_dh_golang: # fails on non native debian build - -# override_dh_makeshlibs: # fails with cross compiling on non native debian build - -override_dh_dwz: # somehow dwz works only with certain newer debhelper versions - dhver=`dpkg-query -f '$${Version}' -W debhelper`; (dpkg --compare-versions "$$dhver" lt 13 || test "$$dhver" = "13.3.4" || test "$$dhver" = "13.6ubuntu1") || dh_dwz - -override_dh_shlibdeps: -ifneq ($(DEB_HOST_GNU_TYPE), $(DEB_BUILD_GNU_TYPE)) - LD_LIBRARY_PATH=/usr/$(DEB_HOST_GNU_TYPE)/lib:$$LD_LIBRARY_PATH dh_shlibdeps -else - dh_shlibdeps -endif - override_dh_auto_build: - echo $(DEB_VERSION) > VERSION - go build -buildmode=pie -o usr/bin/aptly + echo $(DEB_VERSION) > obj-$(DEB_TARGET_GNU_TYPE)/src/github.com/aptly-dev/aptly/VERSION + mkdir -p obj-$(DEB_TARGET_GNU_TYPE)/src/github.com/aptly-dev/aptly/debian + cp debian/aptly.conf obj-$(DEB_TARGET_GNU_TYPE)/src/github.com/aptly-dev/aptly/debian/ + cd obj-$(DEB_TARGET_GNU_TYPE)/src/github.com/aptly-dev/aptly && swag init + GOFLAGS="-buildmode=pie" dh_auto_build diff --git a/docs/index.go b/docs/index.go.disabled similarity index 100% rename from docs/index.go rename to docs/index.go.disabled diff --git a/go.mod b/go.mod index 2f1de4014..d5a61272f 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,7 @@ module github.com/aptly-dev/aptly go 1.22.7 +toolchain go1.24.1 require ( github.com/AlekSi/pointer v1.1.0 @@ -32,19 +33,16 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d github.com/ugorji/go/codec v1.2.11 github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 - golang.org/x/crypto v0.31.0 // indirect - golang.org/x/sys v0.28.0 - golang.org/x/term v0.27.0 + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/sys v0.31.0 + golang.org/x/term v0.30.0 golang.org/x/time v0.5.0 google.golang.org/protobuf v1.34.2 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c ) require ( - github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect - github.com/KyleBanks/depth v1.2.1 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/Azure/azure-pipeline-go v0.2.3 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 // indirect @@ -63,30 +61,21 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/cloudflare/circl v1.4.0 // indirect - github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/fatih/color v1.17.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/spec v0.20.4 // indirect - github.com/go-openapi/swag v0.19.15 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/goccy/go-json v0.10.2 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect - github.com/mailru/easyjson v0.7.6 // indirect + github.com/mattn/go-ieproxy v0.0.1 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -98,25 +87,15 @@ require ( github.com/rivo/uniseg v0.4.7 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - go.etcd.io/etcd/api/v3 v3.5.15 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.15 // indirect - go.uber.org/multierr v1.10.0 // indirect - go.uber.org/zap v1.26.0 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/net v0.33.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.1 // indirect + golang.org/x/net v0.38.0 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/text v0.23.0 // indirect gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect ) require ( - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1 + github.com/Azure/azure-storage-blob-go v0.15.0 github.com/ProtonMail/go-crypto v1.0.0 github.com/aws/aws-sdk-go-v2 v1.32.5 github.com/aws/aws-sdk-go-v2/config v1.28.5 @@ -124,9 +103,5 @@ require ( github.com/aws/aws-sdk-go-v2/service/s3 v1.67.1 github.com/aws/smithy-go v1.22.1 github.com/google/uuid v1.6.0 - github.com/swaggo/files v1.0.1 - github.com/swaggo/gin-swagger v1.6.0 - github.com/swaggo/swag v1.16.3 - go.etcd.io/etcd/client/v3 v3.5.15 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index 1e03143e9..0c7f81d65 100644 --- a/go.sum +++ b/go.sum @@ -1,27 +1,24 @@ github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI= github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= -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= -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.4.1 h1:cf+OIKbkmMHBaC3u78AXomweqM0oxQSgBXRZf3WH4yM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1/go.mod h1:ap1dmS6vQKJxSMNiGJcq4QuUQkOynyD93gLw6MDF7ek= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-storage-blob-go v0.15.0 h1:rXtgp8tN1p29GvpGgfJetavIG0V7OgcSXPpwp3tx6qk= +github.com/Azure/azure-storage-blob-go v0.15.0/go.mod h1:vbjsVbX0dlxnRc4FFMPsS9BsJWPcne7GB7onqlPvz58= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest/adal v0.9.13 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/DisposaBoy/JsonConfigReader v0.0.0-20171218180944-5ea4d0ddac55 h1:jbGlDKdzAZ92NzK65hUP98ri0/r50vVVvmZsFP/nIqo= github.com/DisposaBoy/JsonConfigReader v0.0.0-20171218180944-5ea4d0ddac55/go.mod h1:GCzqZQHydohgVLSIqRKZeTt8IGb1Y4NaFfim3H40uUI= -github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= -github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/awalterschulze/gographviz v2.0.1+incompatible h1:XIECBRq9VPEQqkQL5pw2OtjCAdrtIgFKoJU8eT98AS8= github.com/awalterschulze/gographviz v2.0.1+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= github.com/aws/aws-sdk-go-v2 v1.32.5 h1:U8vdWJuY7ruAkzaOdD7guwJjD06YSKmnKCJs7s3IkIo= @@ -81,9 +78,6 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.4.0 h1:BV7h5MgrktNzytKmWjpOtdYrf0lkkbF8YMlBGPhJQrY= github.com/cloudflare/circl v1.4.0/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -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= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -91,28 +85,18 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= -github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= -github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -125,10 +109,6 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -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/protobuf v1.2.0/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= @@ -138,8 +118,6 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -150,6 +128,7 @@ 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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/uuid v1.2.0/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/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= @@ -163,12 +142,8 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jlaffaye/ftp v0.2.0 h1:lXNvW7cBu7R/68bknOX3MrRIIqZ61zELs1P2RAiA3lg= github.com/jlaffaye/ftp v0.2.0/go.mod h1:is2Ds5qkhceAPy2xD6RLI6hmp/qysSoymZ+Z2uTnspI= -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/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kjk/lzma v0.0.0-20120628231508-2a7c55cad4a2 h1:TVZQgMi+I83S3rCuE65HnmDO6+wFPRi3n2LOzr+tr68= github.com/kjk/lzma v0.0.0-20120628231508-2a7c55cad4a2/go.mod h1:phT/jsRPBAEqjAibu1BurrabCBNTYiVI+zbmyCZJY6Q= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= @@ -178,7 +153,6 @@ github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZX github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -190,13 +164,11 @@ 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/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -218,7 +190,6 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -235,8 +206,6 @@ github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -274,7 +243,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -284,12 +252,6 @@ github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= -github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= -github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= -github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= -github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= -github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= @@ -298,77 +260,61 @@ github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4d github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 h1:3UeQBvD0TFrlVjOeLOBz+CPAI8dnbqNSVwUwRrkp7vQ= github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0/go.mod h1:IXCdmsXIht47RaVFLEdVnh1t+pgYtTAhQGj73kz+2DM= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/etcd/api/v3 v3.5.15 h1:3KpLJir1ZEBrYuV2v+Twaa/e2MdDCEZ/70H+lzEiwsk= -go.etcd.io/etcd/api/v3 v3.5.15/go.mod h1:N9EhGzXq58WuMllgH9ZvnEr7SI9pS0k0+DHZezGp7jM= -go.etcd.io/etcd/client/pkg/v3 v3.5.15 h1:fo0HpWz/KlHGMCC+YejpiCmyWDEuIpnTDzpJLB5fWlA= -go.etcd.io/etcd/client/pkg/v3 v3.5.15/go.mod h1:mXDI4NAOwEiszrHCb0aqfAYNCrZP4e9hRca3d1YK8EU= -go.etcd.io/etcd/client/v3 v3.5.15 h1:23M0eY4Fd/inNv1ZfU3AxrbbOdW79r9V9Rl62Nm6ip4= -go.etcd.io/etcd/client/v3 v3.5.15/go.mod h1:CLSJxrYjvLtHsrPKsy7LmZEE+DK2ktfd2bN4RhBMwlU= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= -go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= -go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= -go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/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-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/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.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/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-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -383,46 +329,37 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.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.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -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/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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -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= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -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-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= -google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= -google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= 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= @@ -434,8 +371,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 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-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= @@ -449,7 +384,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/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= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=