From c0d6f5971d0fd9e57b9858fdee2e72b31e12af26 Mon Sep 17 00:00:00 2001 From: Jared Allard Date: Sun, 18 Feb 2024 17:52:09 -0800 Subject: [PATCH] feat: automatic updates and elint (#1) Adds an automatic updater to handle updating ebuilds in this repository based on the latest version available on the remote. Also puts `elint` in this repo since I've been working on this one more than the former. --- .github/workflows/test.yaml | 19 +- .github/workflows/update.yaml | 34 +++ .mise.toml | 10 + .tools/.gitignore | 1 + .tools/.mise.toml | 3 + .tools/.vscode/common.code-snippets | 23 ++ .tools/README.md | 71 +++++ .tools/cmd/elint/elint.go | 197 ++++++++++++ .tools/cmd/updater/updater.go | 184 ++++++++++++ .tools/go.mod | 55 ++++ .tools/go.sum | 170 +++++++++++ .tools/internal/config/config.go | 149 ++++++++++ .tools/internal/ebuild/ebuild.go | 186 ++++++++++++ .tools/internal/ebuild/ebuild_test.go | 105 +++++++ .tools/internal/ebuild/embed/ebuild-stubs.sh | 29 ++ .../internal/ebuild/embed/verify-manifest.sh | 103 +++++++ .tools/internal/ebuild/manifest.go | 68 +++++ .tools/internal/resolver/apt.go | 30 ++ .tools/internal/resolver/apt/apt.go | 280 ++++++++++++++++++ .tools/internal/resolver/apt/apt_test.go | 56 ++++ .tools/internal/resolver/apt/types.go | 65 ++++ .tools/internal/resolver/git.go | 77 +++++ .tools/internal/resolver/resolver.go | 38 +++ .tools/internal/steps/command_step.go | 48 +++ .tools/internal/steps/ebuild_step.go | 76 +++++ .../internal/steps/embed/generate-manifest.sh | 41 +++ .tools/internal/steps/executor.go | 128 ++++++++ .tools/internal/steps/original_ebuild_step.go | 51 ++++ .tools/internal/steps/steps.go | 95 ++++++ .../steps/stepshelpers/stepshelpers.go | 101 +++++++ Dockerfile | 8 +- app-admin/chezmoi-bin/Manifest | 10 +- ....46.0.ebuild => chezmoi-bin-2.46.1.ebuild} | 0 ...{7-zip-24.01.ebuild => 7-zip-23.01.ebuild} | 2 +- app-arch/7-zip/Manifest | 1 - dev-util/mise/Manifest | 96 +++--- ...-2024.2.4.ebuild => mise-2024.2.16.ebuild} | 155 +++++----- rebuild-manifest.sh | 6 +- updater.yml | 30 ++ 39 files changed, 2654 insertions(+), 147 deletions(-) create mode 100644 .github/workflows/update.yaml create mode 100644 .mise.toml create mode 100644 .tools/.gitignore create mode 100644 .tools/.mise.toml create mode 100644 .tools/.vscode/common.code-snippets create mode 100644 .tools/README.md create mode 100644 .tools/cmd/elint/elint.go create mode 100644 .tools/cmd/updater/updater.go create mode 100644 .tools/go.mod create mode 100644 .tools/go.sum create mode 100644 .tools/internal/config/config.go create mode 100644 .tools/internal/ebuild/ebuild.go create mode 100644 .tools/internal/ebuild/ebuild_test.go create mode 100644 .tools/internal/ebuild/embed/ebuild-stubs.sh create mode 100644 .tools/internal/ebuild/embed/verify-manifest.sh create mode 100644 .tools/internal/ebuild/manifest.go create mode 100644 .tools/internal/resolver/apt.go create mode 100644 .tools/internal/resolver/apt/apt.go create mode 100644 .tools/internal/resolver/apt/apt_test.go create mode 100644 .tools/internal/resolver/apt/types.go create mode 100644 .tools/internal/resolver/git.go create mode 100644 .tools/internal/resolver/resolver.go create mode 100644 .tools/internal/steps/command_step.go create mode 100644 .tools/internal/steps/ebuild_step.go create mode 100644 .tools/internal/steps/embed/generate-manifest.sh create mode 100644 .tools/internal/steps/executor.go create mode 100644 .tools/internal/steps/original_ebuild_step.go create mode 100644 .tools/internal/steps/steps.go create mode 100644 .tools/internal/steps/stepshelpers/stepshelpers.go rename app-admin/chezmoi-bin/{chezmoi-bin-2.46.0.ebuild => chezmoi-bin-2.46.1.ebuild} (100%) rename app-arch/7-zip/{7-zip-24.01.ebuild => 7-zip-23.01.ebuild} (97%) rename dev-util/mise/{mise-2024.2.4.ebuild => mise-2024.2.16.ebuild} (79%) create mode 100644 updater.yml diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 436e446..2444f0b 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -13,16 +13,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: jdx/mise-action@v2 with: - path: .src/overlay - # uses can't use working-directory, so we have to make this the - # default to use elint right now... - - uses: actions/checkout@v4 - with: - repository: jaredallard/asahi-overlay - - uses: jdxcode/rtx-action@v1.2.4 - - name: Build elint - run: go build -o ./.bin/elint ./.elint/cmd/elint - - name: Run elint - working-directory: .src/overlay - run: ../../.bin/elint + experimental: true + - name: Build tools + working-directory: .tools + run: mise run build + - name: Run linter + run: mise run lint diff --git a/.github/workflows/update.yaml b/.github/workflows/update.yaml new file mode 100644 index 0000000..68ce171 --- /dev/null +++ b/.github/workflows/update.yaml @@ -0,0 +1,34 @@ +name: "Check for updates" + +on: + pull_request: + branches: + - "main" + + schedule: + # Run every day at midnight, https://crontab.guru/#@daily. + - cron: "0 0 * * *" + +jobs: + updater: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: jdx/mise-action@v2 + with: + experimental: true + - name: Build tools + working-directory: .tools + run: mise run build + - name: Run updater + run: mise run update + - name: Run linter + run: mise run lint + - name: Create commit + if: github.event_name == 'schedule' + # TODO(jaredallard): The updater should handle this so we're + # more aware of what's being committed. + run: |- + git add -A . + git commit -am 'update ebuilds via updater' + git push diff --git a/.mise.toml b/.mise.toml new file mode 100644 index 0000000..5bd2ba6 --- /dev/null +++ b/.mise.toml @@ -0,0 +1,10 @@ +[tools] +golang = "1.22" + +[tasks.lint] +description = "Lint all ebuilds" +run = ["cd .tools; mise run build", ".tools/bin/elint"] + +[tasks.update] +description = "Update all ebuilds" +run = ["cd .tools; mise run build", ".tools/bin/updater"] diff --git a/.tools/.gitignore b/.tools/.gitignore new file mode 100644 index 0000000..e660fd9 --- /dev/null +++ b/.tools/.gitignore @@ -0,0 +1 @@ +bin/ diff --git a/.tools/.mise.toml b/.tools/.mise.toml new file mode 100644 index 0000000..d93caa7 --- /dev/null +++ b/.tools/.mise.toml @@ -0,0 +1,3 @@ +[tasks.build] +description = "Build all tools" +run = ["go build -trimpath -o bin/ ./cmd/..."] diff --git a/.tools/.vscode/common.code-snippets b/.tools/.vscode/common.code-snippets new file mode 100644 index 0000000..a0e62af --- /dev/null +++ b/.tools/.vscode/common.code-snippets @@ -0,0 +1,23 @@ +{ + "Copyright": { + "description": "Inserts a GNU AGPLv3 license header", + "prefix": ["license", "copy", "copyright"], + "body": [ + "// Copyright (C) ${CURRENT_YEAR} Jared Allard", + "//", + "// This program is free software: you can redistribute it and/or modify", + "// it under the terms of the GNU Affero General Public License as published by", + "// the Free Software Foundation, either version 3 of the License, or", + "// (at your option) any later version.", + "//", + "// This program is distributed in the hope that it will be useful,", + "// but WITHOUT ANY WARRANTY; without even the implied warranty of", + "// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the", + "// GNU Affero General Public License for more details.", + "//", + "// You should have received a copy of the GNU Affero General Public License", + "// along with this program. If not, see .", + "" + ] + } +} diff --git a/.tools/README.md b/.tools/README.md new file mode 100644 index 0000000..8990149 --- /dev/null +++ b/.tools/README.md @@ -0,0 +1,71 @@ +# ebuild-updater + +An automated ebuild updating system. + +## Usage + +Create an `updater.yml` file in the root of your repository. Create a +key for each package that should be managed by the updater. + +```yaml +dev-util/mise: + resolver: git + options: + # url where the git repository lives. HTTPS is recommended. + url: https://github.com/jdx/mise +``` + +By default, if the only change that needs to be done during an upgrade +is a rename of the ebuild and regenerating the manifest, you're done! + +However, if you require custom logic (e.g., running `pycargoebuild`), +you can specify steps to be ran during the upgrade process. An example +for `mise` (a rust ebuild) is shown below. + +```yaml +dev-util/mise: + resolver: git + options: + url: https://github.com/jdx/mise + + steps: + - command: git clone https://github.com/jdx/mise . + - original_ebuild: mise.ebuild + - command: pycargoebuild -i mise.ebuild + - ebuild: mise.ebuild +``` + +**Note**: All steps are ran inside of a Gentoo based docker image. + +## Configuration File + +| Key | Description | +| --- | --- | +| `resolver` | The resolver to use for the package. Valid options are `git` or `apt`. | +| `options` | Options for the resolver. | +| `steps` | Steps to be ran during the upgrade process. | + +### **git** `options` + +| Key | Description | +| --- | --- | +| `url` | The URL where the git repository lives. HTTPS is recommended. | + +### **apt** `options` + +| Key | Description | +| --- | --- | +| `repository` | Sources list entry for the APT repository | +| `package` | The package name as it appears in the repository | + +### `steps` + +| Key | Description | +| --- | --- | +| `command` | A command to be ran. | +| `original_ebuild` | Path to write an ebuild | +| `ebuild` | Path to read modified ebuild from | + +## License + +GPL-2.0 diff --git a/.tools/cmd/elint/elint.go b/.tools/cmd/elint/elint.go new file mode 100644 index 0000000..211ca5a --- /dev/null +++ b/.tools/cmd/elint/elint.go @@ -0,0 +1,197 @@ +// Copyright (C) 2023 Jared Allard +// Copyright (C) 2023 Outreach +// +// This program is free software: you can redistribute it and/or +// modify it under the terms of the GNU General Public License version +// 2 as published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// Package main implements a linter for Gentoo ebuilds. It is intended +// to be ran only on the jaredallard/asahi-overlay repository. It mainly +// handles: +// - Ensuring ebuilds have certain variables set. +// - Ensuring that Manifest files have been updated. +package main + +import ( + "bytes" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/egym-playground/go-prefix-writer/prefixer" + "github.com/fatih/color" + "github.com/jaredallard/overlay/.tools/internal/ebuild" + "github.com/pkg/errors" + "github.com/spf13/cobra" +) + +// contains color helpers +var ( + bold = color.New(color.Bold).SprintFunc() + faint = color.New(color.Faint).SprintFunc() + red = color.New(color.FgRed).SprintFunc() + green = color.New(color.FgGreen).SprintFunc() + yellow = color.New(color.FgYellow).SprintFunc() +) + +// main is the entrypoint for the linter. +func main() { + if err := rootCmd.Execute(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +// lint lints the provided packageName in the provided workDir. +func lint(workDir, packageName string) (errOutput string) { + // packageName is the format of "category/package". + packageName = strings.TrimSuffix(packageName, "/") + packagePath := packageName + + // find the first ebuild in the package directory. + files, err := os.ReadDir(packagePath) + if err != nil { + return "failed to read package directory" + } + + var ebuildPath string + for _, file := range files { + if filepath.Ext(file.Name()) == ".ebuild" { + ebuildPath = filepath.Join(packagePath, file.Name()) + break + } + } + if ebuildPath == "" { + return "no ebuild found in package directory" + } + + e, err := ebuild.Parse(ebuildPath) + if err != nil { + return errors.Wrap(err, "failed to parse ebuild").Error() + } + + if e.Description == "" { + return "ebuild: missing DESCRIPTION " + "(" + filepath.Base(ebuildPath) + ")" + } + + if e.License == "" { + return "ebuild: missing LICENSE " + "(" + filepath.Base(ebuildPath) + ")" + } + + // Validate that the Manifest file is up-to-date for the package. + var buf bytes.Buffer + out := prefixer.New(&buf, func() string { return color.New(color.Faint).Sprint(" => ") }) + if err := ebuild.ValidateManifest( + out, out, + workDir, + packageName, + ); err != nil { + errOutput = buf.String() + if errors.Is(err, ebuild.ErrManifestInvalid) { + errOutput += yellow("Manifest is out-of-date or otherwise invalid. Regenerate with 'ebuild <.ebuild> manifest'") + return + } + + errOutput += "Manifest validation failed for an unknown reason (err: " + err.Error() + ")" + return + } + + errOutput = "" + return +} + +var rootCmd = &cobra.Command{ + Use: "linter [packageName...]", + Short: "Ensures ebuilds pass lint checks as well as being valid.", + Long: "If no arguments are passed, all packages in the current directory will be linted.\n" + + "If arguments are passed, only those packages will be linted.", + Run: func(cmd *cobra.Command, args []string) { + workDir, err := os.Getwd() + if err != nil { + fmt.Fprintln(os.Stderr, "failed to get working directory:", err) + os.Exit(1) + } + + if len(args) == 0 { + // If no arguments are passed, lint all packages in the current + // directory. + files, err := os.ReadDir(workDir) + if err != nil { + fmt.Fprintln(os.Stderr, "failed to read directory:", err) + os.Exit(1) + } + + for _, file := range files { + if !file.IsDir() { + continue + } + + // skip hidden directories. + if strings.HasPrefix(file.Name(), ".") { + continue + } + + // Skip non-package directories. + if file.Name() == "metadata" || file.Name() == "profiles" { + continue + } + + subDir := filepath.Join(workDir, file.Name()) + subFiles, err := os.ReadDir(subDir) + if err != nil { + fmt.Fprintln(os.Stderr, "failed to read directory", subDir+":", err) + os.Exit(1) + } + for _, subFile := range subFiles { + if !subFile.IsDir() { + continue + } + + // join the subdirectory with the subdir to get the full + // package name (category/package). + args = append(args, filepath.Join(file.Name(), subFile.Name())) + } + } + } + + if len(args) == 0 { + fmt.Fprintln(os.Stdout, "no packages to lint") + os.Exit(0) + } + + if len(args) == 1 { + fmt.Println("Linting package", args[0]) + } else { + fmt.Println("Linting all packages in the current directory") + } + + for _, packageName := range args { + packageNameFaint := faint(packageName) + fmt.Print(packageNameFaint, bold(" ...")) + + if err := lint(workDir, packageName); err != "" { + // update the line to be red. + fmt.Printf("\r%s %s\n", packageNameFaint, red("✘ ")) + + // print the error and then exit + fmt.Fprintln(os.Stderr, err) + fmt.Println("Linting failed for package", packageName) + os.Exit(1) + } + + // update the line to be green. + fmt.Printf("\r%s %s\n", packageNameFaint, green("✔ ")) + } + + fmt.Println("All package(s) linted successfully") + }, +} diff --git a/.tools/cmd/updater/updater.go b/.tools/cmd/updater/updater.go new file mode 100644 index 0000000..a9214a8 --- /dev/null +++ b/.tools/cmd/updater/updater.go @@ -0,0 +1,184 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Main implements the main entrypoint for the updater CLI. This CLI +// aims to automate the updates of various ebuilds. It works by reading +// an updater.yml file and checking to see if new versions are +// available, if so it moves the file and regenerates the manifest. If +// this process fails at any point, it will revert the changes and +// move onwards. +package main + +import ( + "fmt" + "os" + "path/filepath" + + logger "github.com/charmbracelet/log" + "github.com/jaredallard/overlay/.tools/internal/config" + "github.com/jaredallard/overlay/.tools/internal/ebuild" + updater "github.com/jaredallard/overlay/.tools/internal/resolver" + "github.com/jaredallard/overlay/.tools/internal/steps" + "github.com/spf13/cobra" +) + +var log = logger.NewWithOptions(os.Stderr, logger.Options{ + ReportCaller: true, + ReportTimestamp: true, + Level: logger.DebugLevel, +}) + +// rootCmd is the root command used by cobra +var rootCmd = &cobra.Command{ + Use: "updater", + Short: "updater automatically updates ebuilds", + RunE: entrypoint, + SilenceErrors: true, +} + +// main handles cobra execution to run the updater CLI. +func main() { + if err := rootCmd.Execute(); err != nil { + log.With("error", err).Error("failed to execute command") + } +} + +// getDefaultSteps returns the default steps if not provided. The +// default action is to copy the ebuild to the container, rename it, and +// then run `ebuild manifest` to get the new manifest. +func getDefaultSteps() []steps.Step { + defaultSteps := []struct { + args any + fn func(any) (steps.StepRunner, error) + }{ + {args: "original.ebuild", fn: steps.NewOriginalEbuildStep}, + {args: "original.ebuild", fn: steps.NewEbuildStep}, + } + + // Convert the default steps into their type safe representations. + out := make([]steps.Step, len(defaultSteps)) + for i := range defaultSteps { + r, err := defaultSteps[i].fn(defaultSteps[i].args) + if err != nil { + panic(fmt.Errorf("failed to create default steps: %w", err)) + } + + out[i] = steps.Step{ + Args: defaultSteps[i].args, + Runner: r, + } + } + + return out +} + +// entrypoint is the main entrypoint for the updater CLI. +func entrypoint(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + + cfg, err := config.LoadConfig("updater.yml") + if err != nil { + return fmt.Errorf("failed to load config: %w", err) + } + + for _, ce := range cfg { + log.With("name", ce.Name).With("resolver", ce.Resolver).Info("checking for updates") + + ebuildDir := ce.Name + if _, err := os.Stat(ebuildDir); os.IsNotExist(err) { + return fmt.Errorf("ebuild directory does not exist: %s", ebuildDir) + } + + ebuilds, err := ebuild.ParseDir(ebuildDir) + if err != nil { + return fmt.Errorf("failed to parse ebuilds: %w", err) + } + if len(ebuilds) == 0 { + return fmt.Errorf("no ebuilds found in directory: %s", ebuildDir) + } + + // TODO(jaredallard): Select newest version somehow. + e := ebuilds[0] + + latestVersion, err := updater.GetLatestVersion(&ce) + if err != nil { + log.With("error", err).Error("failed to check for update") + continue + } + + if e.Version == latestVersion { + log.With("name", ce.Name).With("version", e.Version).Info("no update available") + continue + } + + // Otherwise, update the ebuild. + log.With("name", ce.Name).With("version", e.Version).With("latestVersion", latestVersion).Info("update available") + + ceSteps := ce.Steps + if len(ceSteps) == 0 { + ceSteps = getDefaultSteps() + } + + executor := steps.NewExecutor(log, ceSteps, &steps.ExecutorInput{ + OriginalEbuild: e, + LatestVersion: latestVersion, + }) + res, err := executor.Run(ctx) + if err != nil { + log.With("error", err).Error("failed to run steps") + continue + } + + if err := validateExecutorResponse(res); err != nil { + log.With("error", err).Error("failed to validate executor response") + continue + } + + // write the ebuild to disk + newPath := filepath.Join(ebuildDir, filepath.Base(ce.Name)+"-"+latestVersion+".ebuild") + if err := os.WriteFile(newPath, []byte(res.Ebuild), 0o644); err != nil { + log.With("error", err).Error("failed to write ebuild to disk") + continue + } + + newManifestPath := filepath.Join(ebuildDir, "Manifest") + if err := os.WriteFile(newManifestPath, []byte(res.Manifest), 0o644); err != nil { + log.With("error", err).Error("failed to write manifest to disk") + continue + } + + log.With("name", ce.Name).Info("steps ran successfully") + } + + return nil +} + +// validateExecutorResponse ensures that the executor response is +// contains all of the required fields to update an ebuild. +func validateExecutorResponse(res *steps.Results) error { + if res == nil { + return fmt.Errorf("no results returned from executor") + } + + if res.Ebuild == nil { + return fmt.Errorf("no ebuild returned from executor") + } + + if res.Manifest == nil { + return fmt.Errorf("no manifest returned from executor") + } + + return nil +} diff --git a/.tools/go.mod b/.tools/go.mod new file mode 100644 index 0000000..4ada3c1 --- /dev/null +++ b/.tools/go.mod @@ -0,0 +1,55 @@ +module github.com/jaredallard/overlay/.tools + +go 1.22 + +require ( + github.com/charmbracelet/log v0.3.1 + github.com/docker/docker v25.0.3+incompatible + github.com/egym-playground/go-prefix-writer v0.0.0-20180609083313-7326ea162eca + github.com/fatih/color v1.15.0 + github.com/pkg/errors v0.9.1 + github.com/spf13/cobra v1.8.0 + gopkg.in/yaml.v3 v3.0.1 + gotest.tools/v3 v3.5.1 + pault.ag/go/debian v0.16.0 +) + +require ( + github.com/Microsoft/go-winio v0.4.14 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/charmbracelet/lipgloss v0.9.1 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.18 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/muesli/reflow v0.3.0 // indirect + github.com/muesli/termenv v0.15.2 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0 // indirect + go.opentelemetry.io/otel v1.23.1 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1 // indirect + go.opentelemetry.io/otel/metric v1.23.1 // indirect + go.opentelemetry.io/otel/sdk v1.23.1 // indirect + go.opentelemetry.io/otel/trace v1.23.1 // indirect + golang.org/x/crypto v0.9.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/time v0.5.0 // indirect + pault.ag/go/topsort v0.1.1 // indirect +) diff --git a/.tools/go.sum b/.tools/go.sum new file mode 100644 index 0000000..7550f26 --- /dev/null +++ b/.tools/go.sum @@ -0,0 +1,170 @@ +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/charmbracelet/lipgloss v0.9.1 h1:PNyd3jvaJbg4jRHKWXnCj1akQm4rh8dbEzN1p/u1KWg= +github.com/charmbracelet/lipgloss v0.9.1/go.mod h1:1mPmG4cxScwUQALAAnacHaigiiHB9Pmr+v1VEawJl6I= +github.com/charmbracelet/log v0.3.1 h1:TjuY4OBNbxmHWSwO3tosgqs5I3biyY8sQPny/eCMTYw= +github.com/charmbracelet/log v0.3.1/go.mod h1:OR4E1hutLsax3ZKpXbgUqPtTjQfrh1pG3zwHGWuuq8g= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +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/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v25.0.3+incompatible h1:D5fy/lYmY7bvZa0XTZ5/UJPljor41F+vdyJG5luQLfQ= +github.com/docker/docker v25.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/egym-playground/go-prefix-writer v0.0.0-20180609083313-7326ea162eca h1:sWNMfkKG8GW1pGUyNlbsWq6f04pFgcsomY+Fly8XdB4= +github.com/egym-playground/go-prefix-writer v0.0.0-20180609083313-7326ea162eca/go.mod h1:Ar+qogA+fkjeUR18xJfFzrMSjfs/sCPO+yjVvhXpyEg= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +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/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +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-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= +github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0 h1:doUP+ExOpH3spVTLS0FcWGLnQrPct/hD/bCPbDRUEAU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0/go.mod h1:rdENBZMT2OE6Ne/KLwpiXudnAsbdrdBaqBvTN8M8BgA= +go.opentelemetry.io/otel v1.23.1 h1:Za4UzOqJYS+MUczKI320AtqZHZb7EqxO00jAHE0jmQY= +go.opentelemetry.io/otel v1.23.1/go.mod h1:Td0134eafDLcTS4y+zQ26GE8u3dEuRBiBCTUIRHaikA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1 h1:o8iWeVFa1BcLtVEV0LzrCxV2/55tB3xLxADr6Kyoey4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.23.1/go.mod h1:SEVfdK4IoBnbT2FXNM/k8yC08MrfbhWk3U4ljM8B3HE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1 h1:cfuy3bXmLJS7M1RZmAL6SuhGtKUp2KEsrm00OlAXkq4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.23.1/go.mod h1:22jr92C6KwlwItJmQzfixzQM3oyyuYLCfHiMY+rpsPU= +go.opentelemetry.io/otel/metric v1.23.1 h1:PQJmqJ9u2QaJLBOELl1cxIdPcpbwzbkjfEyelTl2rlo= +go.opentelemetry.io/otel/metric v1.23.1/go.mod h1:mpG2QPlAfnK8yNhNJAxDZruU9Y1/HubbC+KyH8FaCWI= +go.opentelemetry.io/otel/sdk v1.23.1 h1:O7JmZw0h76if63LQdsBMKQDWNb5oEcOThG9IrxscV+E= +go.opentelemetry.io/otel/sdk v1.23.1/go.mod h1:LzdEVR5am1uKOOwfBWFef2DCi1nu3SA8XQxx2IerWFk= +go.opentelemetry.io/otel/trace v1.23.1 h1:4LrmmEd8AU2rFvU1zegmvqW7+kWarxtNOPyeL6HmYY8= +go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI= +go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= +go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= +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.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +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-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +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= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +pault.ag/go/debian v0.16.0 h1:fivXn/IO9rn2nzTGndflDhOkNU703Axs/StWihOeU2g= +pault.ag/go/debian v0.16.0/go.mod h1:JFl0XWRCv9hWBrB5MDDZjA5GSEs1X3zcFK/9kCNIUmE= +pault.ag/go/topsort v0.1.1 h1:L0QnhUly6LmTv0e3DEzbN2q6/FGgAcQvaEw65S53Bg4= +pault.ag/go/topsort v0.1.1/go.mod h1:r1kc/L0/FZ3HhjezBIPaNVhkqv8L0UJ9bxRuHRVZ0q4= diff --git a/.tools/internal/config/config.go b/.tools/internal/config/config.go new file mode 100644 index 0000000..bb8226e --- /dev/null +++ b/.tools/internal/config/config.go @@ -0,0 +1,149 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Package config loads the updater configuration and stores the type +// definitions. +package config + +import ( + "fmt" + "os" + + "github.com/jaredallard/overlay/.tools/internal/steps" + "gopkg.in/yaml.v3" +) + +// Resolver is the resolver to use to determine if an update is available. +type Resolver string + +// Contains the supported resolvers. +const ( + // GitResolver is the git resolver. + GitResolver Resolver = "git" + + // APTResolver is a version resolver powered by an APT repository. + APTResolver Resolver = "apt" +) + +// Config is the configuration for the updater. +type Config map[string]Ebuild + +// LoadConfig loads the updater configuration from the provided path. +func LoadConfig(path string) (Config, error) { + f, err := os.Open(path) + if err != nil { + return nil, fmt.Errorf("failed to open config file: %w", err) + } + defer f.Close() + + cfg := Config{} + if err := yaml.NewDecoder(f).Decode(&cfg); err != nil { + return nil, fmt.Errorf("failed to decode config: %w", err) + } + + return cfg, nil +} + +// Ebuild is an ebuild that should be updated by the updater. +type Ebuild struct { + // Name of the ebuild. This is only set when loaded from the config. + // It is a readonly field. + Name string `yaml:"name,omitempty"` + + // Resolver to use to determine if an update is available. + // Currently only "git" is supported. + Resolver Resolver `yaml:"resolver"` + + // GitOptions is the options for the git resolver. + GitOptions GitOptions `yaml:"options"` + + // APTOptions is the options for the APT resolver. + APTOptions APTOptions `yaml:"options"` + + // Steps are the steps to use to update the ebuild, if not set it + // defaults to a copy the existing ebuild and regenerate the manifest. + Steps steps.Steps `yaml:"steps"` +} + +// UnmarshalYAML unmarshals the ebuild configuration from YAML while +// converting options into the appropriate type for the provided +// resolver. +func (e *Ebuild) UnmarshalYAML(unmarshal func(interface{}) error) error { + var raw struct { + Resolver Resolver `yaml:"resolver"` + Options yaml.Node `yaml:"options"` + Steps steps.Steps + } + + if err := unmarshal(&raw); err != nil { + return err + } + + e.Resolver = raw.Resolver + e.Steps = raw.Steps + + switch e.Resolver { + case GitResolver: + if err := raw.Options.Decode(&e.GitOptions); err != nil { + return fmt.Errorf("failed to decode git options: %w", err) + } + case APTResolver: + if err := raw.Options.Decode(&e.APTOptions); err != nil { + return fmt.Errorf("failed to decode APT options: %w", err) + } + default: + return fmt.Errorf("unsupported resolver: %s", e.Resolver) + } + + return nil +} + +// UnmarshalYAML unmarshals the configuration from YAML while carrying +// over the ebuild name into the ebuild struct. +func (c Config) UnmarshalYAML(unmarshal func(interface{}) error) error { + var ebuilds map[string]Ebuild + + if err := unmarshal(&ebuilds); err != nil { + return err + } + + for name, ebuild := range ebuilds { + ebuild.Name = name + c[name] = ebuild + } + + return nil +} + +// GitOptions is the options for the git resolver. +type GitOptions struct { + // URL is the URL to the git repository. Must be a valid option to + // 'git clone'. + URL string `yaml:"url"` + + // Tags denote if tags should be used as the version source. + Tags bool `yaml:"tags"` +} + +// APTOptions contains the options for the APT resolver. +type APTOptions struct { + // Repository is the URL of the APT repository. Should match the + // following format: + // deb http://archive.ubuntu.com/ubuntu/ focal main + Repository string `yaml:"repository"` + + // Package is the name of the package to watch versions for. + Package string `yaml:"package"` +} diff --git a/.tools/internal/ebuild/ebuild.go b/.tools/internal/ebuild/ebuild.go new file mode 100644 index 0000000..b8dded8 --- /dev/null +++ b/.tools/internal/ebuild/ebuild.go @@ -0,0 +1,186 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Package ebuild exposes functionality for parsing and working with +// Gentoo ebuilds[1]. +// +// [1]: https://devmanual.gentoo.org/ebuild-writing/ +package ebuild + +import ( + "bytes" + _ "embed" + "errors" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" +) + +// ebuildStubs is a set of bash functions used for parsing ebuilds. +// Currently only contains stub functions to prevent errors when +// parsing. +// +//go:embed embed/ebuild-stubs.sh +var ebuildStubs string + +// Ebuild is a Gentoo Ebuild. +type Ebuild struct { + // Raw is the raw ebuild file as it was read from the filesystem. + Raw []byte + + // EAPI is the EAPI[1] of the ebuild. Only 8 is currently supported. + // + // [1]: https://wiki.gentoo.org/wiki/EAPI + EAPI int + + // Name is the name of the ebuild as derived from the filename. + Name string + + // Category is the category of the ebuild as derived from the + // filename. + Category string + + // Version is the version of the ebuild as derived from the filename. + Version string + + // License is the license of the ebuild. + License string + + // Description is the description of the ebuild. + Description string +} + +// Parse parses an ebuild at the given path. +func Parse(path string) (*Ebuild, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + + b, err := io.ReadAll(f) + if err != nil { + return nil, err + } + + return parse(path, b) +} + +// ParseDir parses all ebuilds in the provided directory and returns them. +func ParseDir(path string) ([]*Ebuild, error) { + var ebuilds []*Ebuild + + files, err := os.ReadDir(path) + if err != nil { + return nil, err + } + + for _, file := range files { + if filepath.Ext(file.Name()) != ".ebuild" { + continue + } + + ebuild, err := Parse(filepath.Join(path, file.Name())) + if err != nil { + return nil, fmt.Errorf("failed to parse ebuild: %w", err) + } + + ebuilds = append(ebuilds, ebuild) + } + + return ebuilds, nil +} + +// parse parses the provided bytes as an ebuild. +func parse(fileName string, b []byte) (*Ebuild, error) { + f, err := os.CreateTemp("", "linter-ebuild-*.ebuild") + if err != nil { + return nil, err + } + defer os.Remove(f.Name()) + + if _, err := io.Copy(f, bytes.NewReader(b)); err != nil { + return nil, err + } + + // close the file to ensure that the file is flushed to disk. + if err := f.Close(); err != nil { + return nil, err + } + + // Parse the ebuild via bash. We use -o pipefail and -e to ensure that + // we accurately capture errors. We use "allexport" to automatically + // export all env vars set by the ebuild. Then, we run 'env' to read + // out the environment variables. + cmd := exec.Command( + "bash", "-o", "pipefail", "-o", "allexport", "-ec", + ebuildStubs+"\n"+"source \"${0}\"; env", f.Name(), + ) + cmd.Env = []string{} // don't want extra env vars messing with the output. + out, err := cmd.Output() + if err != nil { + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + return nil, fmt.Errorf("failed to parse ebuild via bash '%s': %w", string(exitErr.Stderr), err) + } + + return nil, fmt.Errorf("failed to parse ebuild via bash: %w", err) + } + + // parse the env output. + env := map[string]string{} + for _, line := range strings.Split(string(out), "\n") { + if !strings.Contains(line, "=") { + continue + } + + parts := strings.SplitN(line, "=", 2) + env[parts[0]] = parts[1] + } + + eapiInt, err := strconv.Atoi(env["EAPI"]) + if err != nil { + return nil, fmt.Errorf("failed to parse EAPI as an int: %w", err) + } + + if eapiInt != 8 { + return nil, fmt.Errorf("unsupported EAPI: %d", eapiInt) + } + + // get the name and the version from the provided filename. + dashSep := strings.Split(strings.TrimSuffix(filepath.Base(fileName), ".ebuild"), "-") + + // name is everything before the last - + name := strings.Join(dashSep[:len(dashSep)-1], "-") + + // version is everything after the last - + version := strings.Join(dashSep[len(dashSep)-1:], "-") + + // create the ebuild structure from known variables. + ebuild := &Ebuild{ + Raw: b, + EAPI: eapiInt, + Name: name, + Category: filepath.Base(filepath.Dir(filepath.Dir(fileName))), + Version: version, + Description: env["DESCRIPTION"], + License: env["LICENSE"], + } + + return ebuild, nil +} diff --git a/.tools/internal/ebuild/ebuild_test.go b/.tools/internal/ebuild/ebuild_test.go new file mode 100644 index 0000000..f543ca2 --- /dev/null +++ b/.tools/internal/ebuild/ebuild_test.go @@ -0,0 +1,105 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package ebuild + +import ( + "fmt" + "reflect" + "testing" +) + +// ebuild creates an ebuild for testing. +func ebuild(e *Ebuild) []byte { + var serialized string + + // default to 8 + if e.EAPI == 0 { + e.EAPI = 8 + } + + serialized += fmt.Sprintf("EAPI=%d\n", e.EAPI) + + if e.Description != "" { + serialized += fmt.Sprintf("DESCRIPTION=%q\n", e.Description) + } + + return []byte(serialized) +} + +func Test_parse(t *testing.T) { + type args struct { + fileName string + b []byte + } + tests := []struct { + name string + args args + want *Ebuild + wantErr bool + }{ + { + name: "should parse basic ebuild", + args: args{ + fileName: "foo-1.2.3.ebuild", + b: ebuild(&Ebuild{}), + }, + want: &Ebuild{ + EAPI: 8, + Name: "foo", + Version: "1.2.3", + }, + }, + { + name: "should parse an ebuild with multiple dashes in the name", + args: args{ + fileName: "foo-buzz-bar-1.2.3.ebuild", + b: ebuild(&Ebuild{}), + }, + want: &Ebuild{ + EAPI: 8, + Name: "foo-buzz-bar", + Version: "1.2.3", + }, + }, + { + name: "should parse an ebuild with a description", + args: args{ + fileName: "foo-buzz-bar-1.2.3.ebuild", + b: ebuild(&Ebuild{ + Description: "This is a description", + }), + }, + want: &Ebuild{ + EAPI: 8, + Name: "foo-buzz-bar", + Version: "1.2.3", + Description: "This is a description", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := parse(tt.args.fileName, tt.args.b) + if (err != nil) != tt.wantErr { + t.Errorf("parse() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("parse() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/.tools/internal/ebuild/embed/ebuild-stubs.sh b/.tools/internal/ebuild/embed/ebuild-stubs.sh new file mode 100644 index 0000000..85ef33a --- /dev/null +++ b/.tools/internal/ebuild/embed/ebuild-stubs.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Copyright (C) 2024 Jared Allard +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +# Contains function stubs for validating ebuilds. + +# inherit is not required for linting of ebuilds currently, so it does +# nothing. Eventually, if we do more static linting validation, we may +# want to implement this further. +inherit() { return 0; } + +# version related functions that don't need to work for linting. +ver_cut() { return 0; } +ver_rs() { return 0; } + +# cargo_crate_uris is not required for linting of ebuilds currently, noop. +cargo_crate_uris() { return 0; } diff --git a/.tools/internal/ebuild/embed/verify-manifest.sh b/.tools/internal/ebuild/embed/verify-manifest.sh new file mode 100644 index 0000000..893c5db --- /dev/null +++ b/.tools/internal/ebuild/embed/verify-manifest.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash +# Validates that a manifest is up-to-date and valid. Outcome of this +# script is communicated through exit codes. +# +# Valid exit codes are: +# 0 - Manifest is up-to-date and valid +# 1 - General error ocurring during validation +# 2 - Manifest is invalid or out-of-sync +# +# Usage: verify-manifest.sh [package-dir] +# +# Examples: +# +# # Validate the ebuild sys-kernel/asahi-kernel +# verify-manifest.sh sys-kernel/asahi-kernel +set -euo pipefail + +# EBUILD_DIR is the directory used for ebuild validations. Contains a +# /src directory with the ebuilds to validate, and a /work directory +# used for the actual validation. +EBUILD_DIR="/ebuild" + +# EBUILD_SRC_DIR and EBUILD_WORK_DIR are the /src and /work +# directories within the EBUILD_DIR. Used for convenience. +EBUILD_SRC_DIR="$EBUILD_DIR/src" +EBUILD_WORK_DIR="$EBUILD_DIR/work" + +# Ensure that /src was mounted. +if [[ ! -e "$EBUILD_DIR/src" ]]; then + echo "No src directory found in $EBUILD_DIR" >&2 + exit 1 +fi + +info() { + echo -e "\033[1m[verify-manifest]: $*\033[0m" >&2 +} + +# validate_ebuild validates an ebuild's manifest by running the +# manifest command on the ebuild. It then compares the manifest file +# in the source directory with the manifest file in the work +# directory. If they are different, then the manifest is out-of-sync +# or otherwise invalid and exit code 2 is returned. +validate_ebuild_manifest() { + local category="$1" + local name="$2" + + local packagePath="$category/$name" + local workPath="$EBUILD_WORK_DIR/$packagePath" + local srcPath="$EBUILD_SRC_DIR/$packagePath" + + # Validate the work and src path exist. + if [[ ! -e "$workPath" ]]; then + error "No ebuild found at work path $workPath (this is a bug)" >&2 + return 1 + fi + + if [[ ! -e "$srcPath" ]]; then + error "No ebuild found at source path $srcPath (this is a bug)" >&2 + return 1 + fi + + info "Validating Manifest" + pushd "$workPath" >/dev/null || return 1 + ebuild --color y "$(ls -1 ./*.ebuild)" manifest + + if [[ ! -e "Manifest" ]] && [[ ! -e "$srcPath/Manifest" ]]; then + info "No Manifest in source directory or generated by ebuild command." \ + "Assuming package does not require a Manifest." + return 0 + fi + popd >/dev/null || return 1 + + # Check if the source and work direct manifest files are the same or + # not. If they aren't, then the Manifest is out-of-sync or otherwise + # invalid. + if ! diff -u --suppress-common-lines "$srcPath/Manifest" "$workPath/Manifest"; then + return 2 + fi +} + +# Ensure that the porage tree has been updated. Otherwise, refuse to run. +if [[ ! -e /var/db/repos/gentoo ]]; then + echo "Portage tree not found at /var/db/repos/gentoo" >&2 + echo "Please run emerge-webrsync or equivalent before running this script" >&2 + echo "Note: Please do not run emerge-webrsync on every run as this is taxing on the mirrors" >&2 + exit 1 +fi + +package="$1" +if [[ ! -d "$EBUILD_SRC_DIR/$package" ]]; then + error "No ebuild directory found at $EBUILD_SRC_DIR/$package" >&2 + exit 1 +fi + +# Ensures metadata is configured correctly. +mkdir -p "$EBUILD_WORK_DIR" +cp -r "$EBUILD_SRC_DIR/metadata" "$EBUILD_WORK_DIR/metadata" + +# mkdir up to the category directory in the work directory, then copy +# the ebuild directory into the work directory. +mkdir -p "$EBUILD_WORK_DIR/${package%/*}" +cp -r "$EBUILD_SRC_DIR/$package" "$EBUILD_WORK_DIR/$package" +validate_ebuild_manifest "${package%/*}" "${package#*/}" diff --git a/.tools/internal/ebuild/manifest.go b/.tools/internal/ebuild/manifest.go new file mode 100644 index 0000000..3998b4a --- /dev/null +++ b/.tools/internal/ebuild/manifest.go @@ -0,0 +1,68 @@ +// Copyright (C) 2023 Jared Allard +// Copyright (C) 2023 Outreach +// +// This program is free software: you can redistribute it and/or +// modify it under the terms of the GNU General Public License version +// 2 as published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package ebuild + +import ( + _ "embed" + "io" + "os/exec" + + "github.com/pkg/errors" +) + +// manifestValidationScript contains the script used to validate +// Manifest files. +// +//go:embed embed/verify-manifest.sh +var manifestValidationScript string + +// gentooImage is the docker image used for validating Manifest files. +var gentooImage = "ghcr.io/jaredallard/overlay:updater" + +// Common errors. +var ( + // ErrManifestInvalid is returned when the manifest is out of date or + // otherwise invalid in a semi-expected way. + ErrManifestInvalid = errors.New("manifest is out of date or invalid") +) + +// ValidateManifest ensures that the manifest at the provided path is +// valid for the given ebuild. This requires docker to be installed on +// the host and running. +func ValidateManifest(stdout, stderr io.Writer, packageDir, packageName string) error { + cmd := exec.Command( + "docker", "run", + // Ensures we can use the network-sandbox feature. + "--privileged", + // Run bash and mount the ebuild repository at a predictable path. + "--rm", "--entrypoint", "bash", "-v"+packageDir+":/ebuild/src:ro", + gentooImage, "-c", manifestValidationScript, "", packageName, + ) + cmd.Stdout = stdout + cmd.Stderr = stderr + if err := cmd.Run(); err != nil { + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + if exitErr.ExitCode() == 2 { + return ErrManifestInvalid + } + } + + return errors.Wrap(err, "unknown error while validating manifest") + } + + return nil +} diff --git a/.tools/internal/resolver/apt.go b/.tools/internal/resolver/apt.go new file mode 100644 index 0000000..5824f75 --- /dev/null +++ b/.tools/internal/resolver/apt.go @@ -0,0 +1,30 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package updater + +import ( + "github.com/jaredallard/overlay/.tools/internal/config" + "github.com/jaredallard/overlay/.tools/internal/resolver/apt" +) + +// getAPTVersion returns the latest version of an APT package based on +// the config provided. +func getAPTVersion(ce *config.Ebuild) (string, error) { + return apt.GetPackageVersion(apt.Lookup{ + SourcesEntry: ce.APTOptions.Repository, + Package: ce.APTOptions.Package, + }) +} diff --git a/.tools/internal/resolver/apt/apt.go b/.tools/internal/resolver/apt/apt.go new file mode 100644 index 0000000..c859bf1 --- /dev/null +++ b/.tools/internal/resolver/apt/apt.go @@ -0,0 +1,280 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Package apt implements a slim APT repository parser for the purposes +// of getting the version of a package in a given repository. +package apt + +import ( + "compress/gzip" + "errors" + "fmt" + "io" + "net/http" + "strconv" + "strings" + + "pault.ag/go/debian/control" +) + +// Repository is a parsed version of a sources.list entry. +type Repository struct { + // URL is the URL of the repository. + URL string + + // Distribution is the distribution of the repository. + Distribution string + + // Components are the components of the repository to search. + Components []string +} + +// Lookup are options for looking up a package. All options are required. +type Lookup struct { + // SourcesEntry is the sources.list entry to use to look up the package. + SourcesEntry string + + // Package is the package to look up. + Package string + + // Architecture is the architecture to look up. + // Defaults to "amd64". + Architecture string +} + +// GetPackageVersion returns the version of the package in the given +// repository. +func GetPackageVersion(l Lookup) (string, error) { + // Default to AMD64 if not set. + if l.Architecture == "" { + l.Architecture = "amd64" + } + + r, err := getRepositoryFromSourcesEntry(l.SourcesEntry) + if err != nil { + return "", fmt.Errorf("failed to get repository from sources entry: %w", err) + } + + rel, err := parseRelease(r, l) + if err != nil { + return "", fmt.Errorf("failed to parse release: %w", err) + } + + // Fine the packages entry in the indexes. + // + // TODO(jaredallard): This will only search the first component. + // Rewrite to search each component later. + var i *index + for _, index := range rel.Indexes { + for _, comp := range rel.Components { + if index.Path == fmt.Sprintf("%s/binary-%s/Packages.gz", comp, l.Architecture) { + i = &index + break + } + } + } + if i == nil { + return "", fmt.Errorf("failed to find Packages.gz index") + } + + // Find the package in the index. + packages, err := parsePackages(i) + if err != nil { + return "", fmt.Errorf("failed to parse packages: %w", err) + } + + for _, p := range packages { + if p.Name == l.Package { + return p.Version, nil + } + } + + return "", nil +} + +// getRepositoryFromSourcesEntry returns a repository from a sources +// list entry. +func getRepositoryFromSourcesEntry(entry string) (*Repository, error) { + // ensure we're dealing with a deb entry + if !strings.HasPrefix(entry, "deb ") { + return nil, fmt.Errorf("invalid sources.list entry (missing deb prefix): %s", entry) + } + + // remove the deb prefix + entry = strings.TrimPrefix(entry, "deb ") + + // split the entry into parts + parts := strings.Fields(entry) + + // ensure we have at least 2 parts + if len(parts) < 2 { + return nil, fmt.Errorf("invalid sources.list entry: %s", entry) + } + + // create the repository + return &Repository{ + URL: parts[0], + Distribution: parts[1], + Components: parts[2:], + }, nil +} + +// parseRelease parses the Release file for the given repository. +func parseRelease(r *Repository, l Lookup) (*release, error) { + // TODO(jaredallard): InRelease? + releaseURL := fmt.Sprintf("%s/dists/%s/Release", r.URL, r.Distribution) + + req, err := http.NewRequest("GET", releaseURL, nil) + if err != nil { + return nil, fmt.Errorf("failed to create request: %w", err) + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, fmt.Errorf("failed to get release: %w", err) + } + defer resp.Body.Close() + + // TODO(jaredallard): GPG key support? + pr, err := control.NewParagraphReader(resp.Body, nil) + if err != nil { + return nil, fmt.Errorf("failed to parse release: %w", err) + } + + // Read only one paragraph, because the release should only have one. + p, err := pr.Next() + if err != nil { + return nil, fmt.Errorf("failed to read release: %w", err) + } + + rel := release{ + Suite: p.Values["Suite"], + Codename: p.Values["Codename"], + Architectures: strings.Fields(p.Values["Architectures"]), + Components: strings.Fields(p.Values["Components"]), + Description: p.Values["Description"], + } + + // Parse the indexes. + indexes := make(map[string]*index) + + for _, hashName := range []string{"SHA512", "SHA256", "SHA1", "MD5Sum"} { + if _, ok := p.Values[hashName]; !ok { + continue + } + + for _, v := range strings.Split(p.Values[hashName], "\n") { + if v == "" { + continue + } + + // Split the line into parts. + parts := strings.Fields(v) + if len(parts) < 3 { + return nil, fmt.Errorf("invalid hash line: %s", v) + } + + path := parts[2] + + if _, ok := indexes[path]; !ok { + size, err := strconv.Atoi(parts[1]) + if err != nil { + return nil, fmt.Errorf("failed to parse size: %w", err) + } + + indexes[path] = &index{ + URL: fmt.Sprintf("%s/dists/%s/%s", r.URL, r.Distribution, path), + Path: path, + Size: int64(size), + } + } + + indexes[path].Hashes = append(indexes[path].Hashes, &hash{ + algo: strings.TrimSuffix(strings.ToLower(hashName), "sum"), + value: parts[0], + }) + } + } + + for _, v := range indexes { + rel.Indexes = append(rel.Indexes, *v) + } + + return &rel, nil +} + +// parsePackages parses the Packages file for the given index. +func parsePackages(p *index) ([]Package, error) { + // Fetch the index. + req, err := http.NewRequest("GET", p.URL, nil) + if err != nil { + return nil, fmt.Errorf("failed to create request: %w", err) + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, fmt.Errorf("failed to get index: %w", err) + } + defer resp.Body.Close() + + r := resp.Body + if strings.HasSuffix(p.Path, ".gz") { + r, err = gzip.NewReader(r) + if err != nil { + return nil, fmt.Errorf("failed to create gzip reader: %w", err) + } + } + + // Parse the index. + pr, err := control.NewParagraphReader(r, nil) + if err != nil { + return nil, fmt.Errorf("failed to parse index: %w", err) + } + + // Read all paragraphs. + var packages []Package + for { + p, err := pr.Next() + if err != nil { + if errors.Is(err, io.EOF) { + break + } + + return nil, fmt.Errorf("failed to read index: %w", err) + } + + size, err := strconv.Atoi(p.Values["Size"]) + if err != nil { + return nil, fmt.Errorf("failed to parse size: %w", err) + } + + // TODO(jaredallard): Hashes + + // Parse the package. + packages = append(packages, Package{ + Name: p.Values["Package"], + Maintainer: p.Values["Maintainer"], + Architecture: p.Values["Architecture"], + Version: p.Values["Version"], + Filename: p.Values["Filename"], + Size: int64(size), + Description: p.Values["Description"], + Homepage: p.Values["Homepage"], + Vendor: p.Values["Vendor"], + }) + } + + return packages, nil +} diff --git a/.tools/internal/resolver/apt/apt_test.go b/.tools/internal/resolver/apt/apt_test.go new file mode 100644 index 0000000..35c4162 --- /dev/null +++ b/.tools/internal/resolver/apt/apt_test.go @@ -0,0 +1,56 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package apt + +import ( + "testing" + + "gotest.tools/v3/assert" +) + +func TestFetchPackage(t *testing.T) { + r, err := parseRelease(&Repository{ + URL: "https://downloads.1password.com/linux/debian/amd64", + Distribution: "stable", + Components: []string{"main"}, + }, Lookup{}) + assert.NilError(t, err) + + // Find Packages.gz + var i *index + for _, index := range r.Indexes { + if index.Path == "main/binary-amd64/Packages.gz" { + i = &index + break + } + } + + assert.Assert(t, i != nil, "failed to find Packages.gz index") + + // Get the packages + packages, err := parsePackages(i) + assert.NilError(t, err) + + // Find the "1password" package + var pkg *Package + for _, p := range packages { + if p.Name == "1password" { + pkg = &p + break + } + } + assert.Assert(t, pkg != nil, "failed to find 1password package") +} diff --git a/.tools/internal/resolver/apt/types.go b/.tools/internal/resolver/apt/types.go new file mode 100644 index 0000000..72371e4 --- /dev/null +++ b/.tools/internal/resolver/apt/types.go @@ -0,0 +1,65 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package apt + +import "time" + +type release struct { + Suite string + Codename string + Date time.Time + Architectures []string + Components []string + Description string + + Indexes []index +} + +// hash is a hashed value of a file. Contains the algorithm name as well +// as the value. +type hash struct { + algo, value string +} + +// index represents a file in a release. +// See: https://wiki.debian.org/DebianRepository/Format +type index struct { + // URL is the location of this index. + URL string + + // Path is the path to the index as denoted in the index. + Path string + + // Size is the size of the index in bytes. + Size int64 + + Hashes []*hash +} + +// Package represents an APT package as it exists on an APT repository. +// See: https://wiki.debian.org/DebianRepository/Format#A.22Packages.22_Indices +type Package struct { + Name string + Maintainer string + Architecture string + Version string + Filename string + Size int64 + Hashes []*hash + Description string + Homepage string + Vendor string +} diff --git a/.tools/internal/resolver/git.go b/.tools/internal/resolver/git.go new file mode 100644 index 0000000..2885190 --- /dev/null +++ b/.tools/internal/resolver/git.go @@ -0,0 +1,77 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package updater + +import ( + "bufio" + "bytes" + "fmt" + "os" + "os/exec" + "strings" + + "github.com/jaredallard/overlay/.tools/internal/config" +) + +// getGitVersion returns the latest version available from a git +// repository. +func getGitVersion(ce *config.Ebuild) (string, error) { + dir, err := os.MkdirTemp("", "updater") + if err != nil { + return "", fmt.Errorf("failed to create temporary directory: %w", err) + } + defer os.RemoveAll(dir) + + cmd := exec.Command("git", "-c", "versionsort.suffix=-", "ls-remote", "--tags", "--sort=-v:refname", ce.GitOptions.URL) + cmd.Dir = dir + b, err := cmd.CombinedOutput() + if err != nil { + fmt.Fprintf(os.Stderr, "git ls-remote output: %s\n", b) + return "", fmt.Errorf("failed to run git ls-remote: %w", err) + } + + // Find the first tag that is not an annotated tag. + var newVersion string + scanner := bufio.NewScanner(bytes.NewReader(b)) + for scanner.Scan() { + line := scanner.Text() + if len(line) == 0 { + continue + } + + spl := strings.Split(line, "\t") + if len(spl) != 2 { + return "", fmt.Errorf("unexpected output from git ls-remote: %s", line) + } + + fqTag := spl[1] + + // Annotated tags are in the format "refs/tags/v1.2.3^{}". + if strings.HasSuffix(fqTag, "^{}") { + continue + } + + // Strip the "refs/tags/" prefix. + tag := strings.TrimPrefix(fqTag, "refs/tags/") + newVersion = tag + break + } + if newVersion == "" { + return "", fmt.Errorf("failed to determine currently available versions") + } + + return strings.TrimPrefix(newVersion, "v"), nil +} diff --git a/.tools/internal/resolver/resolver.go b/.tools/internal/resolver/resolver.go new file mode 100644 index 0000000..b77d8cd --- /dev/null +++ b/.tools/internal/resolver/resolver.go @@ -0,0 +1,38 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Package updater contains the main code for determining if an update +// is available for the given ebuild. +package updater + +import ( + "fmt" + + "github.com/jaredallard/overlay/.tools/internal/config" +) + +// GetLatestVersion returns the latest version available for the given ebuild. +func GetLatestVersion(ce *config.Ebuild) (string, error) { + switch ce.Resolver { + case config.GitResolver: + return getGitVersion(ce) + case config.APTResolver: + return getAPTVersion(ce) + case "": + return "", fmt.Errorf("no resolver specified") + default: + return "", fmt.Errorf("unknown resolver: %s", ce.Resolver) + } +} diff --git a/.tools/internal/steps/command_step.go b/.tools/internal/steps/command_step.go new file mode 100644 index 0000000..48ac476 --- /dev/null +++ b/.tools/internal/steps/command_step.go @@ -0,0 +1,48 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package steps + +import ( + "context" + "fmt" + + "github.com/jaredallard/overlay/.tools/internal/steps/stepshelpers" +) + +// CommandStep is a step that runs a command. +type CommandStep struct { + // cmd is the command provided to the step. + cmd string +} + +// NewCommandStep creates a new CommandStep from the provided input. +func NewCommandStep(input any) (StepRunner, error) { + cmd, ok := input.(string) + if !ok { + return nil, fmt.Errorf("expected string, got %T", input) + } + + return &CommandStep{cmd}, nil +} + +// Run runs the provided command inside of the step runner. +func (c CommandStep) Run(ctx context.Context, env Environment) (*StepOutput, error) { + if err := stepshelpers.CopyFileBytesToContainer(ctx, env.containerID, []byte(c.cmd), "/tmp/command.sh"); err != nil { + return nil, fmt.Errorf("failed to create shell script in container: %w", err) + } + + return nil, stepshelpers.RunCommandInContainer(ctx, env.containerID, "/tmp/command.sh") +} diff --git a/.tools/internal/steps/ebuild_step.go b/.tools/internal/steps/ebuild_step.go new file mode 100644 index 0000000..b06b3c2 --- /dev/null +++ b/.tools/internal/steps/ebuild_step.go @@ -0,0 +1,76 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package steps + +import ( + "context" + _ "embed" + "fmt" + "path/filepath" + + "github.com/jaredallard/overlay/.tools/internal/steps/stepshelpers" +) + +//go:embed embed/generate-manifest.sh +var ebuildManifestGeneratorScript []byte + +// EbuildStep is a step that reads an ebuild from the filesystem. It is +// used as the ebuild that will be written to disk. A manifest is +// generated from this ebuild. +type EbuildStep struct { + // path is the path to the ebuild. + path string +} + +// NewEbuildStep creates a new EbuildStep from the provided input. +func NewEbuildStep(input any) (StepRunner, error) { + path, ok := input.(string) + if !ok { + return nil, fmt.Errorf("expected string, got %T", input) + } + + return &EbuildStep{path}, nil +} + +// Run runs the provided command inside of the step runner. +func (e EbuildStep) Run(ctx context.Context, env Environment) (*StepOutput, error) { + if !filepath.IsAbs(e.path) { + e.path = filepath.Join(env.workDir, e.path) + } + + if err := stepshelpers.CopyFileBytesToContainer(ctx, env.containerID, ebuildManifestGeneratorScript, "/generate-manifest.sh"); err != nil { + return nil, fmt.Errorf("failed to create manifest generator script in container: %w", err) + } + + env.log.Info("generating manifest") + if err := stepshelpers.RunCommandInContainer(ctx, env.containerID, + "bash", "/generate-manifest.sh", env.in.OriginalEbuild.Category+"/"+env.in.OriginalEbuild.Name, e.path, env.in.LatestVersion, + ); err != nil { + return nil, fmt.Errorf("failed to generate manifest: %w", err) + } + + ebuildB, err := stepshelpers.ReadFileInContainer(ctx, env.containerID, e.path) + if err != nil { + return nil, fmt.Errorf("failed to read ebuild from container: %w", err) + } + + manifestB, err := stepshelpers.ReadFileInContainer(ctx, env.containerID, "/.well-known/Manifest") + if err != nil { + return nil, fmt.Errorf("failed to read manifest from container: %w", err) + } + + return &StepOutput{Ebuild: ebuildB, Manifest: manifestB}, nil +} diff --git a/.tools/internal/steps/embed/generate-manifest.sh b/.tools/internal/steps/embed/generate-manifest.sh new file mode 100644 index 0000000..f725e81 --- /dev/null +++ b/.tools/internal/steps/embed/generate-manifest.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# Copyright (C) 2024 Jared Allard +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +set -euo pipefail + +# EBUILD_NAME is the name of the ebuild. Should be 'category/name'. +EBUILD_NAME="$1" + +# EBUILD_PATH is the path to the ebuild file that should be used. +EBUILD_PATH="$2" + +# EBUILD_LATEST_VERSION is the latest version of the ebuild. +EBUILD_LATEST_VERSION="$3" + +# MANIFEST_WRITE_PATH is the path to the manifest file that will be +# written to and read out of by the updater. +MANIFEST_WRITE_PATH="/.well-known/Manifest" + +portdir="/src/fake_portdir/$EBUILD_NAME" +mkdir -p "$portdir" + +pushd "$portdir" >/dev/null || exit 1 +ebuild_path="$(basename "$EBUILD_NAME")-$EBUILD_LATEST_VERSION.ebuild" +cp "$EBUILD_PATH" "$ebuild_path" +chown -R portage:portage . +ebuild "$ebuild_path" manifest +mkdir -p "$(dirname "$MANIFEST_WRITE_PATH")" +cp Manifest "$MANIFEST_WRITE_PATH" +popd >/dev/null || exit 1 diff --git a/.tools/internal/steps/executor.go b/.tools/internal/steps/executor.go new file mode 100644 index 0000000..40583dc --- /dev/null +++ b/.tools/internal/steps/executor.go @@ -0,0 +1,128 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package steps + +import ( + "context" + "errors" + "fmt" + "os/exec" + "strings" + + logger "github.com/charmbracelet/log" + "github.com/jaredallard/overlay/.tools/internal/ebuild" + + "github.com/docker/docker/api/types/container" + dockerclient "github.com/docker/docker/client" +) + +// Executor runs the provided steps inside of a Docker container. +type Executor struct { + log *logger.Logger + env Environment + s Steps +} + +// Environment is state that is passed to the steps ran by the executor. +type Environment struct { + log *logger.Logger + d *dockerclient.Client + + // containerID is the ID of the container that the steps are ran in. + containerID string + + // workDir is the working directory of the container. + workDir string + + in *ExecutorInput +} + +// ExecutorInput is input to the executor. This should contain state +// that existed before the executor was ran. +type ExecutorInput struct { + // OriginalEbuild is the original ebuild that can be used for + // generating a new one. + OriginalEbuild *ebuild.Ebuild + + // LatestVersion is the latest version of the package. + LatestVersion string +} + +// Results are results of the steps that were run. +type Results struct { + StepOutput +} + +// NewExecutor creates a new executor with the provided steps. +func NewExecutor(log *logger.Logger, s Steps, in *ExecutorInput) Executor { + return Executor{log, Environment{in: in}, s} +} + +// Run runs the provided steps and returns information about the run. +func (e *Executor) Run(ctx context.Context) (*Results, error) { + dcli, err := dockerclient.NewClientWithOpts(dockerclient.FromEnv) + if err != nil { + return nil, fmt.Errorf("failed to create docker client: %w", err) + } + + // TODO(jaredallard): Use the Docker API for this, but for now the CLI + // is much better. + bid, err := exec.Command("docker", "run", "-d", "--rm", "--entrypoint", "sleep", "ghcr.io/jaredallard/overlay:updater", "infinity").Output() + if err != nil { + var execErr *exec.ExitError + if errors.As(err, &execErr) { + return nil, fmt.Errorf("failed to run container: %s", string(execErr.Stderr)) + } + + return nil, fmt.Errorf("failed to run container: %w", err) + } + id := strings.TrimSpace(string(bid)) + e.log.With("id", id).Debug("created container") + + // assign the client to the environment for steps to use. + e.env.d = dcli + e.env.log = e.log + e.env.containerID = id + e.env.workDir = "/src/updater" + + // Ensure the container is stopped when we're done. + defer func() { + e.log.With("id", id).Debug("stopping container") + dcli.ContainerStop(ctx, e.env.containerID, container.StopOptions{}) + }() + + var results Results + for _, step := range e.s { + e.log.With("stepType", fmt.Sprintf("%T", step.Runner)).With("args", step.Args).Debug("running step") + out, err := step.Runner.Run(ctx, e.env) + if err != nil { + return nil, fmt.Errorf("failed to run step: %w", err) + } + + // If there's output, merge it into the results. Last always wins. + if out != nil { + if out.Manifest != nil { + results.Manifest = out.Manifest + } + + if out.Ebuild != nil { + results.Ebuild = out.Ebuild + } + } + } + + return &results, nil +} diff --git a/.tools/internal/steps/original_ebuild_step.go b/.tools/internal/steps/original_ebuild_step.go new file mode 100644 index 0000000..1742491 --- /dev/null +++ b/.tools/internal/steps/original_ebuild_step.go @@ -0,0 +1,51 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package steps + +import ( + "context" + "fmt" + "path/filepath" + + "github.com/jaredallard/overlay/.tools/internal/steps/stepshelpers" +) + +// OriginalEbuildStep is a step that writes the source ebuild into the +// filesystem of the container at the provided path. +type OriginalEbuildStep struct { + // path is the path to write the ebuild to in the container. + path string +} + +// NewOriginalEbuildStep creates a new OriginalEbuildStep from the provided input. +func NewOriginalEbuildStep(input any) (StepRunner, error) { + path, ok := input.(string) + if !ok { + return nil, fmt.Errorf("expected string, got %T", input) + } + + return &OriginalEbuildStep{path}, nil +} + +// Run runs the provided command inside of the step runner. +func (e OriginalEbuildStep) Run(ctx context.Context, env Environment) (*StepOutput, error) { + outputPath := e.path + if !filepath.IsAbs(outputPath) { + outputPath = filepath.Join(env.workDir, e.path) + } + + return nil, stepshelpers.CopyFileBytesToContainer(ctx, env.containerID, env.in.OriginalEbuild.Raw, outputPath) +} diff --git a/.tools/internal/steps/steps.go b/.tools/internal/steps/steps.go new file mode 100644 index 0000000..13b00c0 --- /dev/null +++ b/.tools/internal/steps/steps.go @@ -0,0 +1,95 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Pack steps contains a generic step runner in the context of being +// able to encapsulate custom logic for updating ebuilds. +package steps + +import ( + "context" + "fmt" + + "gopkg.in/yaml.v3" +) + +// StepRunner is a generic interface that all step runners must implement. +type StepRunner interface { + // Run runs the step. The first argument should be the input provided + // through the configuration file. + Run(context.Context, Environment) (*StepOutput, error) +} + +// StepOutput is the output of a step, if applicable. +type StepOutput struct { + // Ebuild is the contents of the ebuild that was generated. + Ebuild []byte + + // Manifest is the contents of the manifest that was generated. + Manifest []byte +} + +// Steps contains a collection of steps. +type Steps []Step + +// Step encapsulates a step that should be ran. +type Step struct { + // Args are the arguments that should be passed to the step. + Args any + + // Runner is the runner that runs this step. + Runner StepRunner +} + +// UnmarshalYAML unmarshals the steps from the YAML configuration file +// turning them into their type safe representations. +func (s *Steps) UnmarshalYAML(node *yaml.Node) error { + var raw []map[string]any + if err := node.Decode(&raw); err != nil { + return err + } + + // knownSteps map of key values to their respective steps. + knownSteps := map[string]func(any) (StepRunner, error){ + "command": NewCommandStep, + "ebuild": NewEbuildStep, + "original_ebuild": NewOriginalEbuildStep, + } + + for _, rawStep := range raw { + // Find the first key that maps to a known step. + var found bool + for key := range knownSteps { + if _, ok := rawStep[key]; ok { + found = true + + step, err := knownSteps[key](rawStep[key]) + if err != nil { + return fmt.Errorf("failed to create step: %w", err) + } + + *s = append(*s, Step{ + Args: rawStep[key], + Runner: step, + }) + break + } + } + if !found { + return fmt.Errorf("invalid step") + } + } + + return nil +} diff --git a/.tools/internal/steps/stepshelpers/stepshelpers.go b/.tools/internal/steps/stepshelpers/stepshelpers.go new file mode 100644 index 0000000..de3527e --- /dev/null +++ b/.tools/internal/steps/stepshelpers/stepshelpers.go @@ -0,0 +1,101 @@ +// Copyright (C) 2024 Jared Allard +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Package stepshelpers contains various functions used for implementing +// steps. +package stepshelpers + +import ( + "archive/tar" + "bytes" + "context" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "strings" +) + +// CopyFileBytesToContainer copies a file into a container using the +// provided bytes as the source. +func CopyFileBytesToContainer(ctx context.Context, containerID string, src []byte, dst string) error { + tempFile, err := os.CreateTemp("", "copy-file-*."+filepath.Ext(dst)) + if err != nil { + return fmt.Errorf("failed to create temporary file: %w", err) + } + defer os.Remove(tempFile.Name()) + + if _, err := tempFile.Write(src); err != nil { + return fmt.Errorf("failed to write to temporary file: %w", err) + } + + if err := tempFile.Close(); err != nil { + return fmt.Errorf("failed to close temporary file: %w", err) + } + + return CopyFileToContainer(ctx, containerID, tempFile.Name(), dst) +} + +// CopyFileToContainer copies a file into a container. +func CopyFileToContainer(ctx context.Context, containerID, src, dst string) error { + cmd := exec.CommandContext(ctx, "docker", "cp", src, fmt.Sprintf("%s:%s", containerID, dst)) + if b, err := cmd.CombinedOutput(); err != nil { + return fmt.Errorf("failed to copy file to container: %s", string(b)) + } + + return nil +} + +// ReadFileInContainer reads a file from a container and returns the +// contents. +func ReadFileInContainer(ctx context.Context, containerID, path string) ([]byte, error) { + cmd := exec.CommandContext(ctx, "docker", "cp", fmt.Sprintf("%s:%s", containerID, path), "-") + b, err := cmd.Output() + if err != nil { + return nil, fmt.Errorf("failed to read file in container: %w", err) + } + + t := tar.NewReader(bytes.NewReader(b)) + if _, err := t.Next(); err != nil { + return nil, fmt.Errorf("failed to read tar: %w", err) + } + + b, err = io.ReadAll(t) + if err != nil { + return nil, fmt.Errorf("failed to read tar: %w", err) + } + + return b, nil +} + +// RunCommandInContainer runs a command inside of a container. +func RunCommandInContainer(ctx context.Context, containerID string, origArgs ...string) error { + args := []string{"exec", containerID, "bash", "-eo", "pipefail"} + if len(origArgs) > 1 { + args = append(args, "-xc", strings.Join(origArgs, " ")) + } else { + args = append(args, origArgs...) + } + + cmd := exec.CommandContext(ctx, "docker", args...) + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to run command '%s': %w", strings.Join(origArgs, " "), err) + } + + return nil +} diff --git a/Dockerfile b/Dockerfile index b5ea0eb..6b4aa91 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,7 @@ -# Contains a gentoo/stage3 with required tools to rebuild manifests. +# Used as the base image for elint and updater. FROM gentoo/stage3 -RUN emerge-webrsync \ No newline at end of file +WORKDIR "/src/updater" +ENTRYPOINT [ "/usr/local/bin/updater" ] + +RUN emerge-webrsync +RUN emerge -v dev-vcs/git && ACCEPT_KEYWORDS="~amd64 ~arm64" emerge -v app-portage/pycargoebuild \ No newline at end of file diff --git a/app-admin/chezmoi-bin/Manifest b/app-admin/chezmoi-bin/Manifest index 7bff589..771e754 100644 --- a/app-admin/chezmoi-bin/Manifest +++ b/app-admin/chezmoi-bin/Manifest @@ -1,5 +1,5 @@ -DIST chezmoi_2.46.0_linux_amd64.deb 12290900 BLAKE2B 1340ce0891568ffb1490ca6d43070f5015c9144b620a0a84dd53c78e159bf90deaafd4fff5e548399b417d906153b82274a8b9338de037fb7b18401075a87b85 SHA512 98182b725d58dda0b1094a4a6d343b6a8968bfd17d7a8d01e5cd9f683abaf8a1f6a85ca4f40278f655f963018fe2e7cec0b63364c94f85dbac460d96d11fab04 -DIST chezmoi_2.46.0_linux_arm64.deb 11152510 BLAKE2B 206cf5409d777baf2e6424b4fe34acb943cb323b39e7a87a6a28244179144622ed978b39d1d3ccacdd2bc759166eec79d33b88a62efbc55e46ff628380e0148a SHA512 61884d4525df824de3736d8e9a577ba652c1d236262b1b0de82fed2cc8f55e3730dc888cc9e85c2d5205150fd3e9557f04359f1e5d92e87cf6f2fc64f9a33954 -DIST chezmoi_2.46.0_linux_armel.deb 11611466 BLAKE2B 123112dfb6ce5cd50c44dd03259cfd20a07eb885f10c4cda6522ab2ed1968ab33f50bde8529e5f85fe3213847e8ef445face9c3bae25d0d11629f15bb8d7f569 SHA512 7abe0f18d3e87a968bf4ea3953aa5803771d4e88172794ba4a61b7caf7dcccffbae81c2a9b2a5c339b98097baff119f8a493cad8b9c2fca59611b44d832698f8 -DIST chezmoi_2.46.0_linux_i386.deb 11326530 BLAKE2B 3879fc4237a9794f538065ab1c32870c0437a094df35e55f89fc9be682f2c6f12b107804c9d6459761f1d4284a108ab68c2b76b9d8171fc6964aea7d29e65a55 SHA512 3b87bd424b5af196100727577a76b0a4cc4051b556bb917539fa9c55be0c378ebf93439b0106575cbc0216ca78758defc1bb224005ea8f8c0c86b175b1ceb212 -DIST chezmoi_2.46.0_linux_ppc64.deb 10907014 BLAKE2B 08e4287c345d696cf0ab97d3cf094078c4ce0df10c30f83be5eb90b6d3eec9d2320f79984a6024c8b42d83ae1a10cc255b97022627abc14475f352a3cea11e32 SHA512 b6b34688cbe92faa91dfc410b70c703f1f6a58838211ba9df5d15fc877fca9b4f9a79e08c80d78f6cb7a9b5a6e2b7cb4ea43b8156ce7633c11dd1528a58af9cf +DIST chezmoi_2.46.1_linux_amd64.deb 12366446 BLAKE2B 4b260860334ac5da8cf8de33cd866e9a64f4bae02cd090b3b644a4f99dc853e7d19b62da1ed8a4328e7a824899c499f913378f30aab8e6bd79ba5c9108b71046 SHA512 51b7c1fe608febb5c70f26e16a6b88bc07858d50e8b9fa6488e5f2de55bf38e064828ad3ca338335fe4273d5df41fdbbd4a2000dab75b900974d6d31515a39c0 +DIST chezmoi_2.46.1_linux_arm64.deb 11270716 BLAKE2B 23b8fd1dcd90c1472c2ac5a5c7de1e4ee01437b52de9de66d0aca722e7d5714991c1312a48820562762825bf5859bf9af102d6f8194c862fab0d741b10939bac SHA512 be8855998b8a5ada47b885346e37412aed3eb2b55dded7139282c87fd30e4a6eeb333a97d383fae5749cc43fc56abab99c9f3d704ea1bfa072de906526f49c9f +DIST chezmoi_2.46.1_linux_armel.deb 11609984 BLAKE2B caff6c2180f8eb8a66753001c3d12729d25e69a9162115972bd0a54d7adf7804c152cccb589099054f3544845a714f4b762471c21e59653abf052ba7e102180c SHA512 1bb1e80e4a6b5b9fa49df54ee887c2ee3ffd98f8ad7de0882761fa8405c5047cd2383da6b44f6cc5e1ac0dd252c5e0376ca0ec5d94ee848a363d279b30e0f522 +DIST chezmoi_2.46.1_linux_i386.deb 11365792 BLAKE2B 73e06b464d85511ce50e2d8c378bb2c5d4e3427f67e057bf9598dffdf906d8ceaf914189fbd9dbae8e2bcf141ec0035d9c966df8c7fab1b5c6ebff6628394f18 SHA512 6492276c2d24266228596dedd24ee08d64c29b9839b7aa0c287ac72667a3cc5e999bb872ccff07434aa15d9c77c5cd7f2a1d7087872e867e1d8e6cdeccd526e7 +DIST chezmoi_2.46.1_linux_ppc64.deb 11021290 BLAKE2B 6f951a16884828391a850c2526488c2fadd52f5dc57ad2184895289fc835715fd37b832776e4d87b3a7b595928c2025c252e6ad4ee00267d8b0a16b2bbad9cb5 SHA512 b1ae45bd52be648d485a43a27a76c940ed7cbe616cae6c4c3eb5d8402e936b54aeec58d98e388acaaa389c99eca412e74f135aea31f1d9e5190ff5370dec4a52 diff --git a/app-admin/chezmoi-bin/chezmoi-bin-2.46.0.ebuild b/app-admin/chezmoi-bin/chezmoi-bin-2.46.1.ebuild similarity index 100% rename from app-admin/chezmoi-bin/chezmoi-bin-2.46.0.ebuild rename to app-admin/chezmoi-bin/chezmoi-bin-2.46.1.ebuild diff --git a/app-arch/7-zip/7-zip-24.01.ebuild b/app-arch/7-zip/7-zip-23.01.ebuild similarity index 97% rename from app-arch/7-zip/7-zip-24.01.ebuild rename to app-arch/7-zip/7-zip-23.01.ebuild index 6bc1022..263eede 100644 --- a/app-arch/7-zip/7-zip-24.01.ebuild +++ b/app-arch/7-zip/7-zip-23.01.ebuild @@ -13,7 +13,7 @@ S="${WORKDIR}" LICENSE="LGPL-2.1 BSD rar? ( unRAR )" SLOT="0" -KEYWORDS="~amd64 ~arm64" +KEYWORDS="amd64 arm64" IUSE="asm rar static" RDEPEND="" diff --git a/app-arch/7-zip/Manifest b/app-arch/7-zip/Manifest index 8866e9a..6bd3193 100644 --- a/app-arch/7-zip/Manifest +++ b/app-arch/7-zip/Manifest @@ -1,2 +1 @@ DIST 7z2301-src.tar.xz 1378588 BLAKE2B 348484b24b39db70e513fe50d79954ea0e2dd669f83e3601fa796c8f0ca4734132ca20fac8cda9b8ba550bad9146627fc0ae07056abb99028ef6d825b6a533bd SHA512 e39f660c023aa65e55388be225b5591fe2a5c9138693f3c9107e2eb4ce97fafde118d3375e01ada99d29de9633f56221b5b3d640c982178884670cd84c8aa986 -EBUILD 7-zip-23.01.ebuild 1143 BLAKE2B 782264f6ffe91bda3e57ea56d908370a27fdf058afde21623c34e968a4c83071abbed3c260520e8801259b8a7f2414b439a7ba0e442e1d53363621a03e8d983c SHA512 851df830699f86d11c8e1cd081c0cadc9ba5384449020f1312512b3374a52dd05f0c030b00648e1546edd2aaba204f5a5d987fc663f8434d522d9e9e18d64080 diff --git a/dev-util/mise/Manifest b/dev-util/mise/Manifest index 77edd5f..83170e7 100644 --- a/dev-util/mise/Manifest +++ b/dev-util/mise/Manifest @@ -6,7 +6,7 @@ DIST android_system_properties-0.1.5.crate 5243 BLAKE2B 86f68ec3bdabf8c6ec47881d DIST ansi-str-0.8.0.crate 19427 BLAKE2B 29ca9a477f981e1904ac5857749810c1ac17f7e590bd77694b7f479e2fb250ff6feb5ea264736695e0ba4c7dd79871420ea8748dfdbabe1b1ba51edff4e83f8b SHA512 e76b39e757f6b2244e087a214b8646f8110ae6ed537b083f05d978616c063d207c8e50c38212283b27a5959e956eb4187c5679c72326fc5ee6f64f4bee06325d DIST ansitok-0.2.0.crate 18021 BLAKE2B 2058e46f13be980908e3f31b9b6665a65714f786042c7230874c2cd2b9825e919e3a66c10cb7a500fbec0f97e4be85669df9a91e6cbec82e19a518866baa7156 SHA512 7619a51777ee642d3f96f8e47cce96f677085d57600875893779a12affd92915d6db9dd767814f6fab81713200d371d0579ba16cd004d3d5238ed067e5e77c19 DIST anstream-0.6.11.crate 30239 BLAKE2B 4ac585ec56a804239d32ad3e64d93936ef9d5c8e0f0e2df17f7b081b6a3b2c4c32ff4ebc09ec02507bbed22b025628029d859610aed90c024e19a3216de73c8b SHA512 f8dd65cc116a1495782a3bfc98edfdd0973ab22ea2fafd292fb4bd3495af7b5ea410f320d3fa05f7f812fa96c2a20f4cd2af9fc58869a1a306f32714cbe45163 -DIST anstyle-1.0.5.crate 14371 BLAKE2B ef224232c88f757877f21ba135cfa1f37138e85697bd202ba75256a59fc49e959557eda0008f04004952aedd6695a515dc7ac9353a76a6f7b0472d2ed5f5e5b9 SHA512 c26e060536126479b011d6e37e9fd3433eea5d30f650e57d8e3c5ad0f0fe3654f48baad68774099b34f815a31111f21fca61a84e0c8e6dd99751d2d98ca0dfd7 +DIST anstyle-1.0.6.crate 14604 BLAKE2B 0716d0dbb62bf05c63c2bfe1c689896660073a423d26965ce2570f11e1925752a61209d78c2f2fe65ec4eb64ea4ffbb39669e789c0ba5d1b71e75de929153b20 SHA512 dc0e505465be54799b9faad70d0c6f7f0dcf9f5e1aaa43177b826c85dae626b054910244da0499862f066f6723a1560ad12100aec523f28c6198f1ea0d1b78fa DIST anstyle-parse-0.2.3.crate 24699 BLAKE2B 17e8638187ccc1ca0174a8cec7f7daeee7e0d8b8c430f7e74f9b10d8de4b49fd1c6facfdafde305b7a3e55b1ebf2b4e8ec4975a0cce691514ddae9eb5b5e711e SHA512 4a6d0f706d75c9b3c5144f34efdef3ef8fcd075962c594a23a6209ed56112563a34b3c01e05a08a0868d59204272d06211b2585cb9d06ce075ea875bedb2f399 DIST anstyle-query-1.0.2.crate 8739 BLAKE2B c06643e8616f1f4469a32f9c0512941ce53ac5db9ebfa7a5b2f19233040cd4438dd2ee69ab89ecbc1c239e92b674dea9df15ed673408c6f3fe21787cc17d76f3 SHA512 f409b624cbeecf58fd87c47f85be28cae1fe48f65d692195fb80854c514e38c40d0e0ffad3a5b388a3929c47bd2060302ebb635aa98dc57329f3a5ed7be3e2dc DIST anstyle-wincon-3.0.2.crate 11272 BLAKE2B 73e124773f618a744b17017d4680ec6ccc84ff94fbe2e565073fbcc0facecd3cb65356cf27746d07f453bc917cbeb2ade3a618c6b8578d64cff4828c99569868 SHA512 4cc194faacffa01c6989354c1cadbf1134f0945250f67b7020ab5b475e30db34c799176bd335a6265386cb9c5e8b5bcbdf35894ec0c809b140ffe1c406751931 @@ -25,15 +25,16 @@ DIST bumpalo-3.14.0.crate 82400 BLAKE2B 13bde02e2e60ea3099f4e46ff679d07b2e804674 DIST bytecount-0.6.7.crate 14642 BLAKE2B eabbc141f2a277d07fd002869d1746e7f743b96c3dc72b8708308e826d3934ecb01407e77653ef46d06b3bdd9d931e121c9c66a784d46116a9e6b98e992512f4 SHA512 afd46ec3f60022a173b57dd954a06c7c86f21fc153a0ee6fc2052ada5a630515a386bc8344680ced57dd19a205480c694b9a04a6da0660b6e854b4a712604d53 DIST byteorder-1.5.0.crate 23288 BLAKE2B 7f85a7948406844070a2c8202e0bd52f73b3dfc7c666a97046128044eb9352195afb80e2bf894c0742ad109e4473339de1365d09591de70dfec6c8c02a8e1453 SHA512 96caf981177f6ded9f27f025922cb94eb0cd9de5303bd91680099912d922092e77b7361efa70011e84f1595e443193e4f1b354443b9980c123f6ae573b236f7f DIST bytes-1.5.0.crate 58909 BLAKE2B 2931f19e813eff73be407677622fa29e45f9b49434d5b3a04104b56563fc0e941fd8c5f996258a1aa660000ef014668d70b683b751af8e48d28d0aea76890c92 SHA512 6654cf41d8f0d7e19b05fd95044b9a3bfccd81f469c797c6aa763a4dd29e1b34064bed2e094548d147045cca7bc4706059de5bcf9f6579189e6068fbbf1c29a3 +DIST calm_io-0.1.1.crate 6908 BLAKE2B 00faeb730eda4412ec21a753a05b6aed9476dd4c0e64954dceef853e7915f6b02dd88c1ba4b79ea76e3dd2969268f7d8b526cdd5e27791f8006f5c5b2175df67 SHA512 1411494d77303ced82d4936bd38cce0d0c8db1b86999020a49f1bee7b1bf51428ba3e7d7d8e257958682afc7fde0dab69451e078fc2ad20e0acbdcd86d80d48c +DIST calmio_filters-0.1.0.crate 1930 BLAKE2B f3470da54e546c375d8743178738f8865d19a5dc56e2d0ea043a95f26f741efb6120d31b1a9e4f7e5448d584024046981adf32e05f4788c3fec61724c628cb86 SHA512 dabf17abd4e2985cc94c4d8d4f7354432e90ca14acc4f95ab186e6bb77ecb476e5780289123747b2066e3e662f28facd49ec6f5f8666dc3a01a7e95c68549eed DIST cc-1.0.83.crate 68343 BLAKE2B 33245b33fa845ea2f36da36e3830ec835f937e4319865b357ee9d5ea29a0f9f8392eadb38bf1d95e3c15ed201e561acaa87aedcef744f8db3dabff87a96c7f02 SHA512 742a248c3a7547bb220a0b9c97b67a831fab9b4ac21daa08c85a3966b9fe576088def33e16132fcabec9a2828a6fc437088bb045bfc98b2cea829df6742565a7 DIST cfg-if-1.0.0.crate 7934 BLAKE2B e99a5589c11d79d77a4537b34ce0a45d37b981c123b79b807cea836c89fc3926d693458893baca2882448d3d44e3f64e06141f6d916b748daa10b8cc1ae16d1b SHA512 0fb16a8882fd30e86b62c5143b1cb18ab564e84e75bd1f28fd12f24ffdc4a42e0d2e012a99abb606c12efe3c11061ff5bf8e24ab053e550ae083f7d90f6576ff -DIST chrono-0.4.33.crate 221279 BLAKE2B cc7b71b996a1c15b6b013d06f57ffd8af78b72fab87c0e9123f87918d404787ade2217e8e58fb0153552e49c6e11ca6e820eb0c0f1add8c43619849fa096a214 SHA512 172996d2ccc8733957d45fcc24fefb3531c7b33a798ab9f494be23f08d6d2bc350401574c626fd8eec0191ba28c0f7b73af7bc4235ec72a4b1d437fb7e89c875 -DIST clap-4.4.18.crate 55269 BLAKE2B cb5d4b093bb7958d013b28ee25f9cbf0479ada392b81265834d75a5fa2e6a4a687f8d4a71520d5bdce05785a874ffaa09beb5707766d59e70928dab00bc122ad SHA512 1f151864b92dcfcc69a66c2a8aa8310ce28171895698d82e2e69e19a6b51ed8780e5eaa77410df9aae2d17c9b45117b913a4c23ef879106c1b7a96182656ebb9 -DIST clap_builder-4.4.18.crate 163538 BLAKE2B 9991c1a8aba5feda466fc878f9415ad9b5922ea1835c17e1dd6c640234ee85e623bc556ba0e4edd84100a0879ae462028c74304465310d69f9d58e333c2ba8a3 SHA512 ff04ce8e700d8df4a0ae94e8341c3bcc1ebd415312e3b21d56e6beadf604aa5576641861506fa1c901a615a013e4f30bf8e6467889d637b34fa37ef22e2a15c2 -DIST clap_complete-4.4.10.crate 37761 BLAKE2B 41364c37c96e82bfdbf0fde377512e894ff720542ded85fe49da4e305ebfdf39a2d511a48d6662c0ff2e3d191ea95c59704dbfe89e7531a969be42de9409e82c SHA512 d0f541bd167c9f755f149e5ab3171a4b5a9e4a37dba2de62ed51eeaa20691eb7602ef0061392cc7e4ca3594a0a69a7eeec75bf65f14e92fa6bc45285725c3f1b -DIST clap_derive-4.4.7.crate 29046 BLAKE2B 96ca919b8f9901b2e89c58ee8cf8bd3881ff715ac27999c03c867b317321e4839d9e923f68d411a05b45c34d54557af12b8a173f2445732fb6de16f30dad8e2b SHA512 4be40460468f7ce22906cdc9eea8d01bb07cb206d4ce0c3df2abd929d6925b175a49cf63907925ca16ae6297d6f4d933087fa5b35958e551117ec7ae050be167 -DIST clap_lex-0.6.0.crate 12272 BLAKE2B 22aa04997fffa15a2efc7013ae27fd223c3247cd31f8fe96aafb4e87e3224f075e887df10a95a2da80b468d4e16088ae9f171ba6551c0ae06d77bf3b8920ff9d SHA512 3651aa5e27ed35b6b75b1d25fd9c20c26a2a6039116e54d84c51469087732a4f0fd71754326456b367e341b017d03749e9a6774cb7b62250ca8745f5af46574e -DIST clap_mangen-0.2.19.crate 14857 BLAKE2B 713c5a6b52c60f2310c4f3198f39e7ff97b5eec2bffec0ae8c885472caa7bb9d26e99a31e2c02587899ed5f825dee2d739f0c927ba8e27bd3d61e22e1830a4c7 SHA512 2e6961efe2ac33278ab6312ee3bc2ae9faa098787d9086b7e33901e1df91776e75e60ab0efe6c73c1566e39655eb6eee8cc331b4001d06c87aba1e0ef8eb0ed4 +DIST chrono-0.4.34.crate 228932 BLAKE2B a2feab8d8b079209f8661fd8c5069f2a5fc3e5b0a6233187ace16f8f2ad8b4a147253e47af306cb31aacd82bdf490a8c8a171ad702b8dc22f9b934205d080c55 SHA512 2aaccde5e5ecaec744613429f807b3c34b92632973de7fdbdafd7ca510b917a23a0abc92a6497754d0d3368d684305648aec1fa2a0a61c88a100a20fab2348f1 +DIST clap-4.5.0.crate 55379 BLAKE2B cd81a1347f2dbb0fc16ac3263d0dd653d6bd948666c8e05cee9c842550e6dfa2373eb68b16159466ded6c679359421586687204c7945bbd7b7c50fd1fb0e422f SHA512 2956b6e65220188b2d11fc532480b78f0f3574dc4137adbae2519d77b9f581bc89a10ad044e8e533a032633340ff09e21dc35ceba41b8f0f2e2b8917ea00581e +DIST clap_builder-4.5.0.crate 163521 BLAKE2B 597b64b2bf727186d9bf1c4b55227d96dbb819313ed1f952b2753d24cf6c7737075acdbd0091a919e6e4fdd60bbee4a1e7707bc09860e49068556a1112842204 SHA512 d0df594d0c15687d2b9c19c51f86a9fe1cfb9b8b78a8220d77b0e4d9252a850e217312fd3e1d1aae57703ce973f194241acd4e6ae0c9ab79e45d0c14ea8dae57 +DIST clap_derive-4.5.0.crate 29042 BLAKE2B 80a7646b2e30432008d52e27494e2563637e408a90557e5b0009a9db6a39abfdc79c04139f99caedd433a94b45f7d95fa11b49cfd33d203fbc4bc911fad4f9d1 SHA512 0a9d79f957067b929f8e1340b0e0623f78808c5d287cae252e6508fe8e07c4f11bfa39b1d3b60bb6a531d888d809c43ad3f6a491a7dd1e3d3ce89af7e1b670f6 +DIST clap_lex-0.7.0.crate 11915 BLAKE2B 03287f02067f6cb33bb3889e8032b0848e9a9cc17446eb0e2767768cf6ea8c579a7455d33c8af735fb8d0c16095b19f991a5e2528dee3a7628d68c16f9307fa4 SHA512 638feb2e4571677dbe15ef0423866d2f0df309723e5ad65ddeaff7fd5e2e83adcb973a32d52a5f3924ea88fcff865e956b7d30dcd569df0412ef47848af14036 +DIST clap_mangen-0.2.20.crate 14861 BLAKE2B 68fc1a18d0c2df088b4c11ba2bd4de73b8d272f888f9c1e7da73493012bab26a47cf178769fa657e4b893bd11eeda038135dd7a606a31b86e03bbbe57422deb5 SHA512 f651d0c044cea804c469a59a6f4e3024546cd018d73aa4dedc4f2ddd78c04fe0cf6790d442fc16968146068cd61c685819e5f39fef6320aeaf6dc210f61582c2 DIST color-eyre-0.6.2.crate 635042 BLAKE2B ab35f335a29d5698322b44d144f307ae5968e56622dfa89c6d438071026c9bdd79f2033c8849acb3aef86d3590561386e02c7571b079abc4e928bc966fcbc233 SHA512 b7e83c8fc196d0c163b64d0165e10c70f15ff7e64fa8b1547f45d696f45f8a8ce7140e04901c4fa4caf15d868334253db64be2bd201ee964eb4dd5f494549435 DIST color-print-0.3.5.crate 11245 BLAKE2B adc6907db10692a18f99967341f2da59ad816d3104408f3942626e72f0f8bb29b778756ae37c664817b016dd7552fcaccff3327bbb00af8fcd4f94f3582675ad SHA512 79819069e71b120bf9f8bc42fa71d902f8dff569988ee4413454cea9b5500fc2c31a493b9fc28795b327e099c09109ff6336219c65c89ce87aea5507982a0a15 DIST color-print-proc-macro-0.3.5.crate 23434 BLAKE2B 76aa0a806a8737b60e865b6bdd4763642ed38943367319c4e4dfea9e96343c84be8e4c4db17be0652e30daef7bcd397204c1a400b7cf15d126d8876472a5f6d2 SHA512 03ff7fa8b80ac3bc2186853787a592b1d8fac75ad32bbdf5f2ff9ba6c27a56c57b90c0d23f40cb43595a4e4f9f6d817d2525e8127f62b5b94f58dc7070a7e3f9 @@ -47,13 +48,13 @@ DIST contracts-0.6.3.crate 27850 BLAKE2B f661e862c711d94ea71e163ac5b4f69bb153ef1 DIST core-foundation-0.9.4.crate 27743 BLAKE2B 5b695e671cc833170bc6bad436b2d0d8d386ffb8181bfcf2e92a1d93cee67c3ba1768cf57064fb91b0897c6aec1be7db40b5bd256a052c1bdaf872ec19f6e15e SHA512 82d0878a1b9e3d56b3666fb5a78f92c6f7806d01665c242c06a640bd6b1fd36260211e92dc05e1a16d1430622bfdd650aabb0b5bd8e5592f74abdcf412448e33 DIST core-foundation-sys-0.8.6.crate 37629 BLAKE2B 683d5a84b6a3816317f87359532a8339f08bb4043f1d70a8588636eb5dbe6ebb3843e2a12d9a7e5fd1637a912c52a5aefbb8d44796330b09593e7adefd3babd8 SHA512 24a8958cb16b081862a9000affb0147b8b3be1a664b834c3dbddbff03e709de3f4060ff4800e5a35453f4392ccf33168e8b864be71b17be38cb264a39b915100 DIST cpufeatures-0.2.12.crate 12837 BLAKE2B 5b518c58c548d9116f94cefc2214fe2faf87c3aaf3fffbb0bf4085f75372cf7fc5144bc3f827101a3a14a51363d06d8075db94ff5ed853ab2ccffaf597728093 SHA512 52742595702fc3371d4126fb355f3d7a6da514a94e43170f1db041cc6c560027f92115eab7846131dba1018ca5c72003ae36f945c1de88d57a0e7f66331623c6 -DIST crc32fast-1.3.2.crate 38661 BLAKE2B ce3762b03d24d5367d89738991c060f4b3af7840e0a7ac7fc17d01ed438caf964bbaefad0fc4d0c438dafa5a578429ddd353c71197f8b54b1ec441395f2f7ee0 SHA512 a683943e252afdb1b9d626a07533ed11cf7a63af603c19640056c5d2b9c884ad9aff33ac54c0853ffca2f6cf94b0730eae6c05abf3e53e55e709d180c8152357 +DIST crc32fast-1.4.0.crate 38665 BLAKE2B 77398dedfa5e61357fb9abe3415ee53e45d3f1f7aaee959cbc9774f31a10ed324da2a558d20fd7c0674d450c8985b1e9c78b0b65e6ae2d9da6c873fe631c5ce7 SHA512 3e0bf1d2411ad9c651e0242c574cfda09403db24ab4b55560145ee73b31b08be45e5e12ce2db991d165ff056c7f2f67203fb2c048651f1c66ce90ec3276c455e DIST crossbeam-deque-0.8.5.crate 21726 BLAKE2B d97b35e8e8858deaa7fa9a836e836d02914aad29e5c34ab121f52ed65e95213cb2574df82273277365889ea771f04eb40bb2439347c259979f1dd6d5e9853bcf SHA512 0f0c9745763ab156136227cf1415de514952a3f8282ffe413cc249f9f4b345b029940e6a6c87b3be8331a7c783655a35b89c7a2547360ea5ae10aa64ba7ae864 DIST crossbeam-epoch-0.9.18.crate 46875 BLAKE2B 200c256cad6011a3a14c4664bea6b150fce72d561c4fffc387fa561b08c0480e8756bf51c14874c5fb19f427424547f72d2cd7dd6f56fb8b6666a85f8d52bfd1 SHA512 0a8a199b9d77f4e28e91fe0a0cbff7e0dec58cac283631fd972477fa912d2f6ddfddaed2c695e4978b01cb5440b702822af6333e7c3dfbcb9a2c2086999516b2 DIST crossbeam-utils-0.8.19.crate 42328 BLAKE2B b2846f569555818fe7a3ef4aa29f68c638f933ee0251713c2c92624bee5f8013def5527027022963f572815991abb98d5e68d0fa00f478b2762133f84ffc84c0 SHA512 6e742fbb0d2a6371db87e81f8ac583259530a288237d0e8347394581c60004703a822318ec945936c410bb44001b115d8d986bb264e5b2d8091bb63a8edd93a9 DIST crypto-common-0.1.6.crate 8760 BLAKE2B f2422bfb89c15d47a8f91c8f6695e05eb56990a922e3cdf3d426044736f9932324c0d899a151a6df4d6683e6a6b21659c657d3988734014c02cd854bb4b924e7 SHA512 471dbc43f517089d2cfe0868e29510c6ca579875b3bb5d013c70796db969b609b6c4bb35c9a07b9a2917012dc5708b717d48e317a20038adbe7e7039bf3ada6f DIST ctor-0.2.6.crate 11034 BLAKE2B 125bf45be677526d3e14bc28ed1dc6f79902d9facdd3b809d33a7d1a922056695b896aa4431f730132500bb81d6e7205ed9614462e9c5c539ab52b082f042d8b SHA512 2fc384ae21a7529fb4320ea3b242cb323cc90ab21b35ab85618e3e3767625e4736e8093bb7677fe018d33676c5591d159266fe2c03023ec130d8c17363d3d4cd -DIST curve25519-dalek-4.1.1.crate 305441 BLAKE2B f8d48a0e584941477b409eb24b23a4ad531ba909a8d01bfb61e7e7a685f5f96fd4be1f9de77a52a429d2654f574f900837310612c42bf0a9373ec5010f2f659d SHA512 bdb846e5ee6f3cdf7e67bf3a3ff6367c17027d5222972c4476795bfbf3c2aa2745abb72a684c5997af2ee44f40f23a1d2565a8f29741a7d7b6899b1c3130cd90 +DIST curve25519-dalek-4.1.2.crate 305477 BLAKE2B 7553435f9d431739793feeb503a542619dd67178bfb0f41fd3d56907e9217f114e68ea78e6d6ad57c746b6e6a281f38023cd9b6f78e39e65725591d0295a9d5a SHA512 a6aa320a16c5a64f1a151717175978df651765d0772bfc2e06590e7656d34ff898e47fe11a5590580340a028b0d3524b1a5e150b37996e3c5774b8bf93c5f3d5 DIST curve25519-dalek-derive-0.1.1.crate 11723 BLAKE2B 442b0e4fc519f233d3fa46c17c2e25807374360bd6576e97b4ec33e6c2cc228bc917e4e395a1d70aa19be7bae57db36d2c09c4c7d505691b53d5a624db67eb6e SHA512 60861002465d2ba12a6089b31fcd7a75f7a6d77319159d5383f29e857adea8cb7e5c9c0ab6977c8cfa34b60e1012a1a5dec57f637e6a225e60269ff49c25b29b DIST demand-1.0.1.crate 746951 BLAKE2B 205659ab70914253543c4a1b1db2e1c3f1127e81e957964700f523722abccc3d42a86ddcfc04786e0e42496137dbf458c004eac14536272b39c8961e7229a69a SHA512 e5b991dcc4ad358d99a6e2d9196b0b60dc16b7a7630ce2ae412c018b9e07f25cf232eb9ece96c41c74e26e8e00a2adbccaf04784c72bed94b9604925b574ada6 DIST der-0.7.8.crate 85085 BLAKE2B 062d494ed32f3c97a6ef4999ef050ee07b26a854bc934304588c0b85b1d312478d1ad1812cd303e4e5aca967a2f4f76ef8ac7dea4ab6909e1a534a7dabcd46c4 SHA512 9cc5995cdb99c376cba473d2db476d81c824cc47c1924cf9c58d37a5508e2d01d3f10a009515d2ab456b1577af8de94e195bb315f61516029307ed860bc403dd @@ -63,8 +64,8 @@ DIST digest-0.10.7.crate 19557 BLAKE2B 61e69d78cb8d6850ae26ad7ff2d52dd6dce820d8c DIST dotenvy-0.15.7.crate 20293 BLAKE2B 89a205ca637c31678fdc7249212a6a71a10bea47607279087f719a4929ca30e27f5cf74d4560390ddbb825a58bebc8851a82c3c6ed525922a74206a85bbde6f2 SHA512 208eba7f7d012b71dbdd19d27fad4fa1d2982507d3362167fab72ce819f44972ac0dab6a10f3842f3f8b44d979cf8517240fa4249ee066f4806ef4e38e343bfc DIST duct-0.13.7.crate 30055 BLAKE2B f1259e9818a7c2f1df3dc387be3837a987e0246dacac84d3ac3443a0c6870b6cb4dab36d380ef8d04db47545655ef4def8c713c62f6e86f2b995fa3b69a16b6f SHA512 b6e524144360b61b5c134d40aec409664388e88ada241443d152c5f7ef8795535ba243cc792c881557412bf75c2ba73c84e2f620eaf7d4668a15ba6bc274b1e7 DIST ed25519-2.2.3.crate 17802 BLAKE2B aff96de3343d0cfba058203e90b6fd2c6cbd24531abca3a37977a1ed2f1eff0f4d4b6decbfcd9759617f381f88eed32d78397e6fa8d310b99b98d603b809de44 SHA512 3bfbfcd7f442dbb6d49860c530525bac60182bc57f6778e4ee097c7ace9c6a9d32ce430339ec15931070a538d3bb1e1f7b1cf572537ffb782bc5551fab49b2b2 -DIST ed25519-dalek-2.1.0.crate 85752 BLAKE2B 4af18b71c20e92e53ef6213c645c2b49eae208be7604ecc487207ec86d8bcdc4db7c14f485d98404059dc92dacaecd76cb9eac4d148965660fd326041f41b6d8 SHA512 66aaa5be3a3dc0efafbcf97fcff7bafa30ade2f476edc2e4deefe3b757aa180265898171755258e4d37d81d4c5a356805499bf169be4cd282856fc2906f8d4d2 -DIST either-1.9.0.crate 16660 BLAKE2B ad61038bfacb16f678fff5dd9ccf8f345e1bef18bd7aa0aa9c99d44abf8428939362f32fc8dbb1b60ac56016e0096201071d0bf8c0431b660605d0dfa97da466 SHA512 4978d50842386f51e31a47ad037d5e491106a668bc701bb833e6ec3998afe3ebd80efddc47756b2f300f534b39b26fc01386dc878d3b02cc8c1fec6a474c2177 +DIST ed25519-dalek-2.1.1.crate 85736 BLAKE2B 77dd4019467da3dfbe574ceb574849ea665ffd8dc91660f6a9b2596fb886400508bc632dac10a06461f35fce5400f27b89b1270514188ab488a952288309beda SHA512 a3e3838a3d4eef726b65a38196e66456f586b7e29cc328eb243bacc5a247b50f10ce76df6259aa102a08ca921f07d0395793088445f36de33f5dc1aae5223ed9 +DIST either-1.10.0.crate 18334 BLAKE2B ac5d81e0822132846e29f8959671b14ac6047330d54020ea7d4ad790ef985ecb4ddcb96ec7e327b1a66b9c89d37b112dae33c9ac35232c136f60ad9baab7d5a2 SHA512 2de38a37b7f3e61effa89648acadbf220eacfda1ca7c82fb77484e45577769b724f7dbaa297e73e3d355d6b1bd5109373c3e96e4c1a13a918176162b33ea2432 DIST encode_unicode-0.3.6.crate 45741 BLAKE2B e1e3792bc2bf9db7df33a516d0d755eef5eff1249aa9b2fd7f0dfcb155786c566fb619c9b2d73425a8625c8593988b117e9676c341f65e8795ddc838bf9881c4 SHA512 64193d6ac75f66d58ed864169b5d6228ede36dcf100614395e086bc8e847a3ddd287734d88e8ed50f38c679a99c80ec68449175a67d8ee03b02ec1cfa9d55e77 DIST encoding_rs-0.8.33.crate 1370071 BLAKE2B 0e81419086ca6e18f2aba5194b87eaba49ddf20493fd6ee09d479db86306e39dff9b23f399594afc42f1fdb33855e070beaa1871794dc0b0371c35d296a6369a SHA512 20d28a4c0ff0710f911f510be56c2bc5e7514b76d370493d2b89b7f25d1c0cd46ffa64862e54fc472f07f928a2cc24cf9d790a37751cafafc81f263705aac4bc DIST equivalent-1.0.1.crate 6615 BLAKE2B 302d78069d9df05e78b53f0488a9e4eb98fa2bc1e21893dc8a0acf2234347ba7c4df4b9d6b380ae77d8ffb1074b9c790460fe2dae47318aa1c4fe4208244540a SHA512 b2bc60e804c1b02c461dcefcfd60fc37145af710d183ebe65f9a4d63f2b2072d23193f98dc550a9213c7fdc6a2a837af23b04a89294ebbb681a4aaf5d5031140 @@ -75,7 +76,7 @@ DIST exec-0.3.1.crate 8748 BLAKE2B 8ac31f052d1e8cc5a1dd1b199cca78c998e812b600d37 DIST eyre-0.6.12.crate 45330 BLAKE2B d5bae0dc5a45691ce5950daf30d27c7a0824bd03ccf4305e71e71dd9805e5f306ff0796064f07deb6c366b02b81fb6fd22a78682f8c620f7feea9db3d2f452ff SHA512 6d5e3bcc138189e958693dda0c2300c6a30567f60f65432c4f24e41a3def7431366e45de62f74f21485d678daf831e77ab04ba80346c57cffb694a179380e769 DIST fastrand-1.9.0.crate 11910 BLAKE2B 570c66ec1d4ace08b9790299759e3b6f0394aca52c4ec2e02258229c198846cba7c0627807548bac3ef1f86c7e512c4bd105f1e18e35ac0ea6934f76a6838e1f SHA512 321567b5fad8552c0efc4393b1e77d1bce288b0a88c475d432f79e91b3457ee6eb5db9e4d65ac6381b9990c9916f4651b6a76250df44d51ea3e25bd8184bdc52 DIST fastrand-2.0.1.crate 14664 BLAKE2B 7a5812153500170dcc53ca8d66384fef46eeb5a8f970be43863f22f82bf427672d07cb053f4e04b0fea358ca89178399871235680f57223b8561c07b8d21cf13 SHA512 79a1e1b3f39264f037def236afbd87b732f5e0a2154b1d9e721b3c7990c52be45138320e2571fe628f482e0da7e3cf867abb745e3c277b19015fc031fd4410d9 -DIST fiat-crypto-0.2.5.crate 495387 BLAKE2B 9011b63786ec723ebf77fdcd8247425d69d9522778c008629f3deaadb1716ef6034bb8f092ea77eb0c9255e8235cf3b687e0166d7d260c9d3a9170c10a01126c SHA512 c2b40d8acb78820fa74c8c427dabbc09f8eccbde806180cac3110268cd947be964d78b23fb62506cb9cf0a89da42347454bb9e516803fe4027bb633da8d87f06 +DIST fiat-crypto-0.2.6.crate 495387 BLAKE2B 2dacb1cb45435a1a4bf577e3ea2623250ea9c30485a934d7afb63dd81ffdd35c411b04f68e206e9747f572c730ae0f5ebbd696dd45673d3b0429ebfa395eb561 SHA512 810cfcf91d959f7fc765295982b69dee141f4a50facf72a2db1832e1216e8166886c5dc6a92b6703deee27f3a64c7e1f91f7f377ddecf0d6f0ba37f7ab1462c3 DIST filetime-0.2.23.crate 14942 BLAKE2B e4d2d9c11745dfa5592903f3c3c6a9871292a02f9862607b610ead7562b5d1fc3b64d37e779cad0630bde8012efda72d86af5e687cd2ef5d3627d8a89bca517c SHA512 8d5ac82482758577d1d0669abbe7b880efc44958687bba745c9ee4a5c16bddb44ec0fbe9c29cf424e7120905f3c3da607f3a7ca1e50287154c0475ddf2148bf3 DIST fixedbitset-0.4.2.crate 15954 BLAKE2B 91270883db5ad0e999ebbca1123d8729d3040eb936034ab8da3cda72a830e45fcb977b3fe3c2b94e870c1fbc366ee8602357bb77e8b9a40cc41a04afad1b266b SHA512 57c5d756b0a202b2506270f0d5e890f7617a1e0c015b6059ea23fab49cf7af47fd06927eb56feb03b37cb2b6c467e326b3f0da1e32cfcb6339cf11a130a3ccab DIST flate2-1.0.28.crate 73690 BLAKE2B c9f141bde0eda6b9c42da0a3ed69322c12c6c29bc522131f51ad56f6e2758646aa5585382407409257a8301f5f07a1825d150838bbb55822f2d49037f6279aa8 SHA512 9db6f3ddc4e1e91960b07c08712beabd911b297d93db8be3ecb97a392a4262e608c75ed8e9e34d87d58c3e67d1b7987734e14ab3d45fd837a2767e8016380284 @@ -93,7 +94,7 @@ DIST futures-util-0.3.30.crate 159977 BLAKE2B 9012edf76336952dab02cb61db48dfc74b DIST generic-array-0.14.7.crate 15950 BLAKE2B e74c785e3127095625951da192a018281ea9976aaeb11019f9088c3f27748c5fed1ef25d577150864486dc48b5138d6892e42f99979339f711a66fc70756c82b SHA512 363a7b04e4102f9ca63d429721c1ada6272be6bf0a2e97da681faf76381f73f0e3acb86623b9ce2dae441de9fda704088391779b9769ec02b3c8c9f9f35f897d DIST getrandom-0.2.12.crate 36163 BLAKE2B 0afef8504932ea0ea051cde1d14bd5b79edde68d6ebae6fe88fa4aaa532605a16f466d0d9c0d0aa619eaa105600b6d5ee4e191865a3fa041549a78f78ca82396 SHA512 dd97d7dae1a7ba653abdaf2db719e1a9c8eb721b08b4af0f1c45b1ed5079069d1b57e4f6d9d879e7fae3a890763f4b6aea9bc2d945392b98e811e7b348589bee DIST gimli-0.28.1.crate 270497 BLAKE2B 4089e0f871295d464e548610ab5f0c2fd863825416109cf58ca827e482897f00eab23b795295758f1e3af16167b52c77c91df6f707f1f445984a6c4bcd68c6ef SHA512 695e46471fc07813dc4a47744458729b097f6efbfceeb57eb3db4165654e99bebb98dde2d73230b90bb5dd7c0ca0c6e77c7c3dc6f2abf70058b830a2fb386d25 -DIST git2-0.18.1.crate 211466 BLAKE2B ce5a8175f734bcc2504015271768ff4bda7bd18f615e5ff2618d06f758f041827aa9e58afb8149cc290619cf4e0fbccca460e4d38bf6f3cbf08193a2548c16cc SHA512 3fb535e820365ac5aecc5a1cd3af869ea952ed6741a7890b095ac6f4509fdee7389949da45e4f66188b5e261fb4c47d49ffc1043b4b2b39020ea21e22bc69fa7 +DIST git2-0.18.2.crate 212536 BLAKE2B fffdea2d9a279ec6c371b03489f85039a50250bed9177ebb82090b74a7deddb988b3456ac7e7323be00822e3c243820839f00bd2478cc4d17d0d5d9ad943b4c6 SHA512 d7b7f61ee2c074da28b85bce8475d1b0b953e047ddea70d834fbcffc58a910f0fee3cb91b6e3a0e6fd14b76d142ea02909330db0266299b73c743463a8443a99 DIST globset-0.4.14.crate 25090 BLAKE2B 2c3e6f8384a066ebfa1f36bf03125b5eae79329255674e32c58963451d4b342ada10f17524232a953bee133b3c77b678a141543759ebc622b5fd659fe55622ae SHA512 e83e4f5e42a97609e2579b09f49c2cb0a76a94e7e2975c5871f2c5af5d3b809736e0a7b220404c582f4a0c7eebdbfad6cb432e89b26401b58f2b253f8c0151bc DIST globwalk-0.8.1.crate 13705 BLAKE2B 4d0fcc805cfddb47af24f5d8f2c4f9bcbba48a8a523e565f7ce7bea767b6d108ae5e3f5cccf6647b497b3690f862e1652812b9d83ffd02c634119d5e03d1a7e6 SHA512 3235fdd9c24ffc54994a0b37862c44e16a4c9ef6a7e1a008c5d83dc62a9683ade97e451e4da7f6db710be2532339a55038fa3bb85dbe6685d1c807cf42f6d955 DIST globwalk-0.9.1.crate 12572 BLAKE2B 3518672646219e391aa0f157ae6597c78603bbef776d92403b874f848846d60ff8734e75b117dc76b1be91f830157cfce698058f445773748b9dda9cdaf3afce SHA512 9c95d6832950b35cf6ac87bd986116a75c847f11dd2e96ec0cbeb6c223ff901c949429669698cd75c4244a60c3de7df9adec648bc531303cdfba889e09f29448 @@ -101,7 +102,7 @@ DIST h2-0.3.24.crate 167814 BLAKE2B df25fee9f6e39f8ddcb9c1be4775d055328606b34547 DIST hashbrown-0.14.3.crate 141425 BLAKE2B 23c63a99c6c6b7a6b9b9e8bbbc7f1e342e1eb9d7582fc9eb408d3eec50c99f34502d450170bcfef4da7f2b1e743e1d1619875ec879e4753dffcb84f3c10dc3b2 SHA512 4d344e5c89ce58e04668b80ef10e4e110a3a5daf4d610c52d980577795d0e2050c7d0b151d8ba97128117665e27b92ab0300f85b88bd6e1de943c62d49249356 DIST heck-0.3.3.crate 10260 BLAKE2B dc756738081d855583f239908f671e9b5dde72ebfb577f6387b1a169817a03332464cf67071708a4c4f06b1ecb222118e8c719073ccdec1c0f938e5ef378b13f SHA512 b3498e033f44e03206421e565efec5b21d13107b60d35e4476331c44e6effd75c81f7678f2452c822eefd581209a2ffefd2034779cca2d8b4fac4583bbbf777f DIST heck-0.4.1.crate 11567 BLAKE2B 520aeea740cfa30b0cca12f73594ffa655f32959673b1c9caaca1ea0162e455546ae3033881394c0ba0516bcd5c9a997da02162e1585522d665813b9096eabd9 SHA512 8c80e959d2f10a2893f9a71994720f90747742bb5b61fc0a539eed3ea5679b140c48fd7f7690d7122cd6af5f7f20a19d412e3569fe741c6d31f6b2ce1e0b80e8 -DIST hermit-abi-0.3.4.crate 14445 BLAKE2B 4dd00ad81a5ba9f94e6658c2964ae7983990c9e7df228cb92039964bc5fec537802ef221812adac53b2adac345df84179c03fc982b3c90bd097175fa5f8c4a49 SHA512 61c2d4aa1f5edc1a51e1e6c07cd360b88db1ef7302b583ea9b97ce62d1020b8864e7bbe4b5d7de82760cc319c15c7cf75509fcd536ad5913f50046de662eeea4 +DIST hermit-abi-0.3.6.crate 14884 BLAKE2B e46434195f0cd710ad215bb740ae5a012a1cd9d9286f43b5922a90ded832d02f82812790a1682ca5211fd22998a86cf9a03d267d71c69fd302a0e3f0c9c55816 SHA512 ab920f843f7061949322597ccc3b6c64f2cd9be106deb71bade5848c379e0964892fe154ab89eda93d767298ad44db7c66604e6e0c065a8921089d873940e66d DIST home-0.5.9.crate 8760 BLAKE2B 02277a6d0e54a88e62a50ceb5b50b08cd5dc1ca5ddc17a799db0f49a17fee8560df53f616ae22cd16020ae2a89ce7c6ec22e5e2c0d513405bc2859a6e3ec61f9 SHA512 3f1f7b619f1a47694cda92321a11d66ebbb2dc0b0c33446a7a4b886f547ee88231b61c038de04bb82acd50e617f19b5085893b8401206d32cd54502033e04bf1 DIST http-0.2.11.crate 100478 BLAKE2B 1ef12d67fc52392322c24f79ca49c52fcd7dcad0145b761c8aea21fef38682919d664161f242c606a1f3737987368c08432f33e2abfa53d681c6c2aa5cb000cb SHA512 71d98f5fa55c7bdb9fb31e36f898e8b2b7596dcb30ef9b5df3e34581b7306b66a782e82c2797732e28626eec5c9e432cc0475703e5a0e0e47aa1d6f22235ef51 DIST http-body-0.4.6.crate 10773 BLAKE2B 828a43f8ec79a7187cd6f5379edd50127cefa8e80e9bc1205e80c567f506f4778387dcb1d2808e68f1b88bfc7e2d6405ddf9ede9403d35584e31bc62db0b7756 SHA512 fd74fcbd25044aefa183e3caad6cde0967cbb00b6d80addec2589d037b752cdafcdfd02d29d38a12b5c7d87cf1cb5e5ed80488057735b9dd73e03904006a5462 @@ -111,37 +112,40 @@ DIST humantime-2.1.0.crate 16749 BLAKE2B e2ae8325b037fb175b9200cc5c1944ce579056c DIST hyper-0.14.28.crate 197204 BLAKE2B b99c91eaf65947642e217d159372750ce57e332675705cabfdcafdcc9ed3cd90130a9c600118c76e167b927a481b2120d0f4b499772e4fa710803abbec5385cf SHA512 deb26e3815e6315dd193c4db22efe1e73e44bc7c1d400bc7654e950bd074a200b7cbb730ca30faac0940c88529fea60d5737a4fc7ccd4fa24c2ecdb2a0b450a7 DIST hyper-rustls-0.24.2.crate 30195 BLAKE2B 79d5c6512877c98f3040a6ed26027e5345d42cd55ee9e9bb6e020cb7bdd4345556d910c338ec759a6a9a2907e645aa841d5666879ba8254ac6506a980811a7d9 SHA512 f30e83408376b985ee9df26728f8183a7048d4586c5fa3d797cc837931e13300018929583a087767bd19d4bd60d85ea1c2696601c236fb65be9a6805ef6fc193 DIST hyper-tls-0.5.0.crate 13257 BLAKE2B 50cbe4ca7c1862fd3fff192de070341dd32bfb9f108b516e1e261ec8da7c4f7972b7b66e3d45c1497733a913b0281bef706994270ec8bd03eba7368612127aa4 SHA512 45dc16cc9ce48706e0b3575dca35ba1b6b3084dda8c2cc489d126e1c4f0bb96a9b2baa860d09f68c5e0a48c2a69e3eaf62f4f0406fffc4efefcd79d26c82896e -DIST iana-time-zone-0.1.59.crate 27033 BLAKE2B 5d7c9fa38c85a99ae9da34c881e1b6b626c6a1356d7de412868a26fbb469bdc8408a0baac4fc940354d5223b3004924819a1d1663b129d9addb22689a55f900c SHA512 3c9da44a31423b451cda42b1fd340b29f18c05fc88f4e3c5b0ad5d1e6cf426691cc87b7ffcb9f47c12c4e8d9a3b504e44edc7f6975b867cf8612e93e6eac1f91 +DIST iana-time-zone-0.1.60.crate 27074 BLAKE2B 6f534056e220e2f721fc7c7f3ed24152eea7f07d1f4cb3609ca734ade32a2d6b18fd0164ed831170cdff192cbe48653b2c4eb0903fb6f157292b3b5bf47299bb SHA512 5619b994d3277f56e65322a7903e4c5e03928a87bdb72831cbef88788aaf5573b8460abc0a4d5488c5df7052bb978531d973dd66002b0ec4a3af468928c9b722 DIST iana-time-zone-haiku-0.1.2.crate 7185 BLAKE2B 37fa14b589ff092377b9271c414d4e584c5a531f13f70ac48df26df3cc03353db635b4630ba192fc65b800cce11823e91b91f03dfad85e4bed55aa18398156cb SHA512 448224ecafa935472ff6f0aab7cb71f9dabdbe71569c4b94fcc65baea925ef48841577687c9a31106a1826c2105e8dd73c748e9d27fd002648e5b0ce838af6b2 DIST idna-0.5.0.crate 271940 BLAKE2B 0b781c2e9bf717af429efb53bdfd18244f2b8c58e5111c3bd3bee50c8a01cc747513fe20db75c38b6b771d5845647bf6c1849ae6667766c9623e018c1f399a9b SHA512 bee6cfbfc99859b113aa8c7b487429a836dabc4e317980f132d28ff8333336f33480bf9f8b186a07115eff33024cd855bc85d346fce85e17c4132e886769c54c DIST ignore-0.4.22.crate 55462 BLAKE2B a9a29e5286c9a9c132f2fa319226bfa85c9555150afd18e34bd3b37915250842c46f6079208dce75674fef448450dfd23242858ee2e4e2bdb7eb65f89d689d0c SHA512 9647a4887258dd970c87798dee32a16c1cda75ce3e352829f78d97e1b786d67f74d89b2fd76d48a607fe795213965c04c9dfb47713f8fa80561f87ac465956d9 DIST indenter-0.3.3.crate 6587 BLAKE2B dc4a73eb90bf05ec939634d3f1543f57c8b612e44e0fb3b38329ed2b9bdedcaedce84eb3f542f71c726b00c7cd273c3c390f827da170b5ba361cf669de4d1d3f SHA512 6585964939ee84739cdd19576faef467703415777e159ab2ff8b0f2a371fb2cd6c7a83dff4df954e9bea35844a43b72d93131dd4d23d328e9f365950ad831a71 -DIST indexmap-2.2.2.crate 76160 BLAKE2B 1b020e3e33204e9e0cf15e0b91a600296147432002e94ae1061f1d7511e3435a29c1c0c438933eb6a56c7c522cbdfff29a106622041815cbd706b9515e2ab82d SHA512 814cffe0e586940c82c152536a970917ec8702a9b946151ccc8574188fa2cb0fab094888c0e910917c99e37f5f53723ab799999fab4bee395bca7d45adeed40c -DIST indicatif-0.17.7.crate 63108 BLAKE2B 665bc2077207cac6ca2071d9e6ead76abb30d5f7c209d7b4a2ff5a1fcba566b331467239bd9168082839c961acf5a0522ae4c899aec141ccc649025b2eeeacc3 SHA512 412955eec523e961a20bb48f9921128004e723b405c8f1bb73abfaeb4f532ac6f883794fe6c8738a40c2e0a400a6ebf94ee17d89f7cdc98d9d0f8611d84a369e +DIST indexmap-2.2.3.crate 79019 BLAKE2B cc87bac104efd9aa565e3b8d6071f271b33501e2192b3a478120c41d015537e807bf3ae808ddab930aeb861f353022ac76522e5102e32f72722b93d36d5f2236 SHA512 ddc45ebcfb36d761d8c11b8f61bcef046a51eea71692d89495c897cf9b4cdb5e14287600285297c8a6aab543761d9f5ba3ab45442803837a810b945aa346d48a +DIST indicatif-0.17.8.crate 64869 BLAKE2B c534020b2c7b25bb07cdd0fd4414fc817506647cf5b8e2081c22be58857d5adb170082a3756004c69187619fc5625f8b9a1904566dc51c621838e09ecda5b43e SHA512 487e73445c5c7d3c16d6f93a3d9767f41b37d2832e56851154f8b69e678ab7d9ab04eba225a6bcf8b48842ae0db0249b060e998e29a252dedf8afacdc88b1aaf DIST indoc-2.0.4.crate 14311 BLAKE2B 8d604e20825ae64530014081c627abe4ecec6447e1e214408743aca79ed217531baad4bd7021137ae6628555d769a248f06acc556cc3254d2626074aab110a44 SHA512 ef1b8d19d89d848c1133f2865247e0ce23cbe5552454805910ed0478ac4acb11b11629aa4a5ce8756d0ed5cbc0644abedeac0246f433166c68f47cf58cf4487a DIST insta-1.34.0.crate 550760 BLAKE2B 56ef9742bf38cabfeb26226fcfbe70cb2372964711a9d5f6b9886afdc3134d272a827f77f858c29e7ef2b723e50a7da9030ebec3ffcfbc37db46a7540f848226 SHA512 792eff6de9d7d10212aad14566d0509ae66c0b43b2a38b187e8387ca131162daa097b92abfca801f3b4efa052a1adc1464a07f5e9c6d564832c2310b8a7f544a DIST instant-0.1.12.crate 6128 BLAKE2B 728923f757c1ee4e4a7afb90e460eed81392068961240a538e5c6468e15a0b6491f590fb5f6cc46e6d78901ca232351f65abb9f2f230d8f4983c5e58c4011902 SHA512 fae494c00111c51c840f9dd6a10febe403e27ebb933dd16633a213e9c20f2bc11adeb431c71f8a6713bf88f270a010941e15d83df294e658791934f83a5d2407 DIST ipnet-2.9.0.crate 27627 BLAKE2B e7e1c74815b965e9cec1cd37cc3dca76671168feb689620d44d5e635f3a5fa92a7276cb3022f25a9512ffbaaa11b0a8719cc1b838a7dacda71a5beb1a992ecc0 SHA512 8ce429ba2bae53cfdaf8a7d6bf980e10b9dd515446ef3ed4e4e11432043a18e09454260567419818f523bc589fc367194bc345660f2cc808d281db235d3e0b54 DIST itertools-0.12.1.crate 137761 BLAKE2B d7db67feb7418d6a779dc17d8a2f33481114cd81a4d53a10cffe08e13f0d3cf4525a5ef43368fe979d5a3ce230872eaf993f7065885531aeb5a6479351857708 SHA512 0d9c1849dcc0ddf7555b0aeb7e4f2ef3b101cfc6f03310ce1b6072d70ac8c8d3387ef4c726146102012e75171e0b0bf13465704b6edfc02752e349dc6af7cf68 DIST itoa-1.0.10.crate 10534 BLAKE2B 8ffcb345d07070cc01651fd44c19f3e0659185eda733c407fd4be0955a301879ae1272dae7f425279dae8dcb7f7dc954465c9a09b5c521938a503d34fecfe2a7 SHA512 fc496be0873e31afa6ddf7f2958030f8fcb517cadb86a48280a0c50ce50460afda189af1e6c26e5ff6f85c750d772c21503864c32b526c4fe4bcdb5b07918538 -DIST jobserver-0.1.27.crate 24774 BLAKE2B 259c854f3cca79f769dde0a796aef4dc135574d816e7d0b8aed4b3d4e09d4eea600db30f7c8a8f7c68c9040efa1ab99029b1380ba6240dbf21634e7b5ad141d8 SHA512 2681234952be7a5ae67770d45f4d52e8278347f79b349bda594626712b1fba595a4cf46e8fb5426b548c325a23243facf7fbdc01ae0e853e492aff39444879a5 -DIST js-sys-0.3.67.crate 80764 BLAKE2B aee8b96c8c5811020b3ee4277524902e27d96a027add7b21a8ff94eaac7db15e8de08a9e203ff462b05ce10d0a44aff78a355c07514794e41f49fa936a3c8fb2 SHA512 590d947a869c3435166e34c25b3011351f6804b43887ee76bc2be69b7407b5181bbbc3a5bf6c50867c65d73fcd8e65ac7b0d395710ccd52000beb87f8826be96 +DIST jobserver-0.1.28.crate 25543 BLAKE2B 90fb1d8696b575b16b5b12d6fa4e7bc7890f5f09110b147d65eef8888a16ace1446a789f8079a3706f0252be8a04061d989bc8fc53e6c004d6b8a4094baf1642 SHA512 8ffb33b8c162935de1226e0ca4048f36e6e90bd1731cc7f06110bc97e2adef904f777df0ca4ed48b3b8ee4f2c243b2f883f6897427867904aa3385098abcbcee +DIST js-sys-0.3.68.crate 80764 BLAKE2B 961f58c181f060af37c00e99f55906140a4c8f1729847d6dd7da7e29b715d69ff822853dc6affb185195347e3d3bfeed392b8969c9d15a5ee28e9f01febbc148 SHA512 9b1b59f1688f95f9bd5031f68c18c0bbb8c16519c7b09aa3042e08e57921a3807d86f15407bb4d9d63c49747ac4847aa963f83373fd0d778a7e7962ea6551b6b +DIST kdl-4.6.0.crate 57472 BLAKE2B 1e942a219f800a1f1907142a501c89553d10684d87382f518cb08790b34c80f943dffeb3bec7be7daa4792074065b3fac4ef1a83428f98500a38f6cc2c6475a0 SHA512 4f93b1f1dcad45dccf364a779023938bf61a164e5935500cd62772bc74f4cb1565185c5cdf6954fe14e7db7aa68556ec051b5f11e660ce98bc109b15f208b859 DIST lazy_static-1.4.0.crate 10443 BLAKE2B 25b2e61bbac48f0dcbc79c81d7bf01f2403d8269ecb6be3ea6147bd00f7a588df15a91f44dfc18ada19b21faa71de4637c7d493a8628cbecd0e547d74e616a23 SHA512 e124c0521ec7c950f3c4a066821918da7a9c6e711115d98009ae7c351928fdddead852e7596fea5937a9c30e4e4ce8eee7099b20248b5d6e3b2494b6a6d88cb8 DIST libc-0.2.153.crate 740614 BLAKE2B 523a41bc8cff4ebcba0edbbe9e6a2286ec7cb3ba5e90ca5926c972b68e4b34188bc077d20c22376238c3cd91b7455898a95c505ace4ededea88cc496edb4c5a7 SHA512 3f99e3a192974fffdc053ef21e9ad5fb54b7cdbd4755df176704a95dba38047138ccab76763e89c6b565f37f98fd549fe368749f84f6d1638b3209cb07eae9b4 -DIST libgit2-sys-0.16.1+1.7.1.crate 1773446 BLAKE2B 050b7832dd48c642c3a790481a296fe1b15bcfbddcffcb0f4792735bd135f6c499e5b6f90fe394ddd891c2c055af86041f0b0fcac26832975755a432dd0e44ac SHA512 746e80309af40af7f6d11a7d45721054a6b7f456e10af5b25ea5ddc3ae1f8d934196e9e3b9948f7d7b41b6d9dc45a660874029a39c1c3d67307daebae3f2cb69 +DIST libgit2-sys-0.16.2+1.7.2.crate 1773674 BLAKE2B 86eedb63c1d92a15cbe2ce735530b60abb3d915a9f6051f7a084b9f6e6402dbdbffad2a261689f5e5abc2353b7765a390eff7cb86e88e50fb4cfe4346487bb8b SHA512 45e23f66e1823c551b1f91d1466d971b05927e591684b35b75047ac5f7d23de889910b662ec403388b88a35dfd19b8ad9787481d36e10949e610aa02fcc35c40 DIST libz-sys-1.1.15.crate 3958887 BLAKE2B 989b33d3a0ce09b0268f81d86c33979c7627379d921fce4be83b8c31419aa0613a9e3d82aea400861090fe6b0bf00612396cfbe0b8eff2cf682576b62f81f807 SHA512 316a3b961d8f9b47ac763365d36a4171afc0fb19a01f9570f1962765da0bf67e7f57b848e16f370d653b40a2526fb8720a4625062cd53d4e4f12e1c69d158097 DIST linked-hash-map-0.5.6.crate 15049 BLAKE2B 0f30e388633c60433dcbee353507f1c6857bd210f0b61a4d166a9b95067bdadaebe49d5fca4fa6ce13072e26037c6f75d46cc30cf8dc3c9cfcb3f33b33630093 SHA512 031a87645381c96beff33572e4bac1a9877e52fd2f99d39918fbede17d72291b35e2eb69e07edec20c3058554c35cc38fe85b8f175c2a3c69366136fcc71f707 DIST linux-raw-sys-0.4.13.crate 1493855 BLAKE2B 1298a038276e2424eda9873c642fb43d864b343b03b7962446122d2dbea94d58d9fb2b93e890769e6fe4092378755413ed6afba81ce56fd61e512146e44148a3 SHA512 3918da6b667a08ef8a51aa0b087129e2dc5ab101669cbba7690fc98ae2659a36861bf9410a3b87d18522a7549d43ac169b995ea192d3073f7249305a809cac62 DIST log-0.4.20.crate 38307 BLAKE2B cb9c9a401b49bd68c18d5e42f2ed94446f1aeb184caa23cefacad4ce54a2a357143af54a5595c45d6f3c3d20b054c451d9e6ccdc09c19cca99ffffdaf8bbfc72 SHA512 8661b0c71d3b7fc0d679aa3d7f06910e6d3da1c53862aa06526000e1bcaa0b0b068415a1a9ab317c318f00d15346dba8a4f5d2a60d8850790bed9cfaaf757b3e DIST memchr-2.7.1.crate 96307 BLAKE2B f1a008fbdbfe84852a8ae1d9d9574306b1bf120dd5087903adbcca6af342c9abbb296496eb9bf6cb58915c4444b3edd6ca4e27131ac7d8aed8849815df87a944 SHA512 5120496faa31fc427c8b4178461a262b3a34d70eddb7ad17a19d6db8b9969c9e113d3625b5e6dc677087fc80907377b00ba0421aba9a92cf73ca2849d932f473 +DIST miette-5.10.0.crate 88585 BLAKE2B a0cc03832fa59ec5c3eeb7e39bc1fbbf42988eaea8940e8e39cfb9190202b3d5826e09733e0c9b2d8c5217e14f4ac888ae93914ccb6adb206026a65e922c6729 SHA512 415d16a732925fef5945c08910dcd770fa3a6deedc4753dfe93e8697ad6f017c22fc13c5741f9e22a405b2f5c58ba2fa937ae37df11da8ede2d053c0f1f2a12d +DIST miette-derive-5.10.0.crate 16062 BLAKE2B 240d12f522b02f06761b6674a636c3497418b05122d89d08245faa4028543d056789570a5c39e04448acac3036964dd49ea7b132db8eab979d38c96f21012344 SHA512 e78d2fa3fdfbeaa22cbda08e39fa2e8daba0ff664c1ce7afff3d79e74839b1fdfa22c0bd611bcde53c31ac2e064d7d6d708f2ee61e795317c5714b931607cb21 DIST mime-0.3.17.crate 15712 BLAKE2B abb892b75b40657d356b6b53b9a45b2c822a05873453e919f2bbfeed9e5c06104f24db9cef2716f302198020870eaf96b2c62aff55cc11d8ca4f4f614d7c8e17 SHA512 e6d2ca92bb58fc747c1bb65a7f9023e5dbf4b94966003a72e4913bcaaeccdd6752725cdbd5081e0fd69d9e8f364d79664fcbe70061737d5c39e5b3e3a154a0d1 DIST minimal-lexical-0.2.1.crate 94841 BLAKE2B e6b8919b80d938d0b98d60d4f5f29ce43d77ebfcf8b18bde08909141915c6ef4f0d07a543538d4f3ba8527a9f55926d4a8e83473248469d087e80b274d701d61 SHA512 385fab51884bdcc7b0f2728a219ab164d0dc8efe42160b918f2c09f79ecf853fb12bda006d11e649f097bae1499dcd41ddf2a8784ee7d178cf2c28059e46078c -DIST miniz_oxide-0.7.1.crate 55194 BLAKE2B 56afbe0c0b3eca98105ae2d507493f365353cce29a6b04910ff26bc75899400fdbd067756cbda7b3d86f047fb8f3d737de00043a4a7348a813cc43e45824e33f SHA512 5eb6ffe34a866403273ff0267ff7838aeb50722ca57a03d5a1d842a5f19a3b4af570b133a3b9d64d78eafe49e4b9732b92dd63fd9c6b0ce59b3295daf10f6a3c +DIST miniz_oxide-0.7.2.crate 55731 BLAKE2B e3cbf5983025bee879b8a735fa2912db8975cb60f0499498a73ce4375e7d452c9ed62d4b0b6f6a4fa591aab55e5d7ff20033baa007fd6c839b9d74b31142c0b1 SHA512 2f8f09d7afdb9d78bfc80a228ded85a215fea05e577e907921f1808f84aae30ab118048d7b53295f11aeb5de70ab6cbdec892f3a2417bedf6f53a4576d095432 DIST mio-0.8.10.crate 102345 BLAKE2B 82bba95cfbb51a02efda75dc85d973825f038f7d23e7fd0a93a60293fbafd304ae064f395a1aeb63a1bc7bc664a0c0dfa3721ac8a553ea5161c0ab2862a6edcb SHA512 680371f7da07824fcdc1e8c10a6771a71b97308c47bb5b295e0338fbcb56e211dfd91e1b400a080984c57055f08db24ca675c167f298a3dd4842a185bde62fb2 DIST native-tls-0.2.11.crate 29008 BLAKE2B 594511c364e639e309f32f37ae20ecfc5ddeeb39c3f7180c5f3f2cf304d8c323b977af933ffe70cce696a5a63e17c5fa7ddb119d46fc3db819a28e31a388640b SHA512 7e77959932f2859757f1aeb37b78fdd459b7b6fd02424f4b7399525b94c21d1f499a718775503b8f3dfe3b4b740e1cfbee77052a2ebd0994468addb3fa665e6c DIST nom-7.1.3.crate 117570 BLAKE2B 5643b67990b7305e101b16b8cd27c447e162a7adc6d0dfac00920b0cb50fea98c9d4edca63c34f6845cba05f8d0acb407cf3045cf64a4cb28e53c8b6bc9090cf SHA512 1ffce08dde299bc0e0367ad59c7b6a83e23decfa11115ee076ab91ec53cdd9ef37e4c2103c96eff23a7b6b8b5c3f67c83ce1917928c7d4c6462083bdfa0c9cad DIST num-conv-0.1.0.crate 7444 BLAKE2B 4f5c4695006aa3ae77aaf5c55999a07d8ddfab294584fe10d73eb6abbb3f551846646156581599f966a28c74d80d3ac4373c49d2099991f7ed9edb56d36feec4 SHA512 7884c0c6599c66e40b9a79435e1bbcec60aa7e68b59686922dfab19ccbcac6a6e54f208cfb3d5a8a12e86e4dd67e09977d60b69ef6940e308a28256733f36100 -DIST num-traits-0.2.17.crate 50190 BLAKE2B a549ef00c749dc7f276c4817477d1f9dab70cba01b6a3afa5743f16f16353bc50d992d7446a54859cf750a410d66c8cd3440708a6b91fd89d3b8889f8fff1668 SHA512 4d47d3e2f5a31019e038e609897cb0cef1ba061b35cee7e2a02e65179dcdd4960bd5b9bc759b5c013d699b3fbd9b014940a15e36658f7d4fd12cb0c7841c5b4e +DIST num-traits-0.2.18.crate 51930 BLAKE2B 6c40e155d7a52267a7183d8030ef34245492d33f103cc24551b10da3eaa18e3db485062ff87057dc23e6b55e381e5c5d2a2633aaf6f4763c06677a0a0c524f02 SHA512 e395ad9f3b21b0dd1d3a94cefe0d68a42d1b1d429ddb2823696f9cd75042568a635d93d133ddb9497ed357e5b3be5caddb8e4a4af87b65882bbdc60b05c74ebc DIST num_cpus-1.16.0.crate 15713 BLAKE2B 11b432fc7c7496d48918f09ed0954e0f1d0845596301266321293b374392898853fb7c313a0b0fd9d22d9dbfe3ccc5cc1e38f38407c89b2e5906eb76caa6ad68 SHA512 a75863afc4a563e63c64d06471c7921615355d98011ea9497b1f1a7dac2bdfc876509136018e8062ac38575ccf476a196d1fd9231e09e90017333bbf2df4615d DIST num_threads-0.1.6.crate 7334 BLAKE2B 416efdf395b0299b6b01e1508823afdda08cf67ca54e1d644fc5accbb0490945a492a34bc5ba70c3e838e6405d17ddce164ef87468bd9da27097de8994ad9577 SHA512 b2d9897e29e59353379b6372a629fc7f9afc89f777b4410eaeac7b4729527948a8dbecb175f056899f9076693ef855cc0d40e725cc54f28af588fbac5f7ce3b6 DIST number_prefix-0.4.0.crate 6922 BLAKE2B 81bd3b588c788e6865104e5ce87119b5e0c5a526042963d52cd582ff23c2f8c9f32b4c445ef0397fc402b6d047e031d8e2c67ac97e191bde22e17662eec3a554 SHA512 a43b668d7314218b86ca7451daa9dfef71f6c9f6616bc34c12d94ae6030f182bcca9da83905cb46f3d49d0aa81385a787e92e4f3ae239658067adc249f8174df @@ -158,15 +162,15 @@ DIST paste-1.0.14.crate 18157 BLAKE2B 35e8548611c51ee75f4d04926149e5e54870d7073d DIST path-absolutize-3.1.1.crate 6605 BLAKE2B 7dd297c7f510e61de2a5f89b0d876948afcb554e68605c119d7294176297cdcc6872394dc6207e6fe6841f2069dc84d1d0e0cf42bc071b479b8ade106f8b4c1a SHA512 d5377c9b781beda9c025918e2fa5c73fbe6747d41ba8ae642a4ccf2a6308d53a803707b1f3e940937588683ff3a6afd8f1b3e28e316311e134e42428e65b4a04 DIST path-dedot-3.1.1.crate 6596 BLAKE2B a46a8932c16d67c99dca004919a93eddc50d2e939c6c16580ffed3d42d0d4e5718fa3b76cb5647a3f98cd901de58747240d708f13e6f1ac93618c990af360a91 SHA512 9d3519f614faab679c5644174b5b810d0bc9a22ed464aaebaa0be2d9fad75a4aa0fb952ec823e97ea12ab62de61e456f1f0bf011f771dc2a6d117d0a8090123b DIST percent-encoding-2.3.1.crate 10235 BLAKE2B cf8e2fd7b359a05b7bdaf731f9ae84c7fe6f468a53482eb2db7f93dfdaab64ac812b3664899db260055a93449462e6d219c695942fc5b030517b197b4df9b95f SHA512 5951ea8315e52cf3acfbaa023cb9e13a136b114c54a7da0bd44619ae24cd2159d4a96469d7572a2fdabd94e19513a033387117d7ca81d0eb409fb383e4acda44 -DIST pest-2.7.6.crate 117384 BLAKE2B 2c6b4c2cdd5319c58b47a12bde6ef14925978d2bb59de05b2185634a50f89e8950cdc0d1ce3125350e8b6e066b58505a1edf966a944a80fb9f52ed26c5e14a02 SHA512 ff7d559dec8c81557ea9157ccd57807032718c0c332bdc368a0a5c596780f613d2d15dd67370016ab210286783af9d8ff2b27586f141e44a09ac4bc7b45040ca -DIST pest_derive-2.7.6.crate 35851 BLAKE2B 3ea8c4f5862ceac109e15e4aedb78eee204f6d78946ce92b9a3495fef99371dd6d940cdbe2c113a86bc3003c5c7128d4a45d5933f2dbac7a718c0499930b4fd8 SHA512 2de05712331b8cd2fbf6157e6306409dcc6243f2ccee2b4667ac77fdc7a8f8b8a9d2d839e8a53d52f011e10bc337a78024f61c16a72f050a65c6a743b065f407 -DIST pest_generator-2.7.6.crate 17658 BLAKE2B 69ff99c7383782ac5a43618b44804f63e632333478d530dbc64be619a9b2817edbccd545d45f49418e767384578155ba145ad768ff902862396d29d2d23a45b8 SHA512 e685bb87e9f10b1fbe888405dd5ca8485095b8a1dfc69e8de62d78ba5963645e00cc9cc5593fe117437766aaad10c647269127bcdf0ea5f71a0feb50807658ce -DIST pest_meta-2.7.6.crate 40971 BLAKE2B 92ebeb69c25bd6616a5c26121b6c341edc59c44c6bee7b040351787d7c8ab4ef4107f759bea4943296cefc6c13efe71c7934046e99d57142c3cfc6e5da0302e9 SHA512 5f423c587723256b87a64e795622b41ed756d51b441ef9954d0a5f7ce454a903405a9617174291f37f6098e2cbc2c00587fea60380b6efad35ee79479aa0c7cf +DIST pest-2.7.7.crate 118478 BLAKE2B e1464444fc114fcfa261e671733f73849001f8481e9e204c3782197a907162b9a037f7e804abf6f4be544ff9736ca63d87b7ea109470a8953b53a5c91e6ce920 SHA512 3edceb5acc379082e1a3e3d3600039232e8440fcf7b323c70951c78bc195069a5758cc6c47a69734f3e2bf323b520587610727105da70a2bd28f963e286dcd76 +DIST pest_derive-2.7.7.crate 35839 BLAKE2B b51f407eb54f9f8f1adbcfc4d1c2af3ac76b0c6d4cfa1a0eaa265a00458e892bd421f3d440904dd404a1818e7b79465d8050ed027f1e6f3e54125a887f4576ab SHA512 5717026ac6882dfa99ecf68d6ffe7dffdf5c74def257039d5619d2878816c245faeae0e5925372f9c636fe1d5067c6227197b34e0657c7788b753ae729dc431f +DIST pest_generator-2.7.7.crate 18184 BLAKE2B a66c47676bbc7a911a4fc0e4687e445e10b6022277505aaab91632801ee7de59ce8b9ba665bbabe668437ac90e81e3718294d15a1c875cb7b6586f81e86795c8 SHA512 93b41b542bcddbdfd546963ea26d4871a9cfc38a2da55efad3b354ae705ee7f8ee6884279cb8a56da9e33e5f039f72964f2396c89d5346dcd668502a38ac73c3 +DIST pest_meta-2.7.7.crate 41562 BLAKE2B cfe95f7a8cbda7d22126e365ae81c4a7e73ea18112f4b64ba46226f2e05cdbe3d1ffa8721487a48d204cce0e649b8b26ecd8f29fe16064d4f5147decf90476de SHA512 9b515dc49f171362c70e2751bf14bf78792662ac2ef27bf8a32f7f5c49a9204b0b9ae47bf997953a8ed49dd0104095c34cd8ad3f3a6a4c00255b6a7212b58ea5 DIST petgraph-0.6.4.crate 185895 BLAKE2B 9ddfb2796c461d2820db8227753113b02024e5dcb694a0bb2826bc1f375f028d8b98a3bd67555485db7fab88eb86043f5b768585dbe0c60703cc655976030a2c SHA512 b5a21572526387af3151dd4f864bd95c94f65eaf0612d96f99926faf646214df205bcc652b98d3b281f2e270779a4c1fdd6a32614ed60b3612e5d594b2bf3f20 DIST pin-project-lite-0.2.13.crate 29141 BLAKE2B c434a336716c9cdd16ebc297fed393e9106ef167a693c4aa0b12c681e03141b8ba3cdf64c310916cb7d5cc43cbbfcaaeb39bb5fb1e8b3efb9e94a3f72af914eb SHA512 7f12595d751d315de6c0d380e2f501b74154661eb676987d2cab6fdc956091a68c9cac658df45dbff73615e982e6ae2ea138c09ebb708cd6c351f0d18dbbdbee DIST pin-utils-0.1.0.crate 7580 BLAKE2B 457e1287202f16d1873b24bf4f1de1828300128c4ba3131758e64f9784d36d47365f22d85493c3a85d854f0d8dbb4c6cef3a0f5b064014dc03943e58b7ba9178 SHA512 828422b8440cc82ac6b0743e0112fa7540d437aed457564999092b1462cd7672cd6b1f0201b67075431aeedd3d9c5127468a3dd028744109944f7f023c82fd70 DIST pkcs8-0.10.2.crate 26360 BLAKE2B a62b5b7386eedba6fcbc4cff2b103b899dbf6179101445283f9076080489129543561af1ad6f09061564f68c28954262e49d0bb3e182f2ce7495e19d6f34bd5e SHA512 87127d51f0e1fe085d46b30394f2a580e857cd64f5c6fe4a3ac3b8871230aa426598dbb007e8bdfd5d729b99a9c0b4d84116f0768886605342d2ed112c51dfa8 -DIST pkg-config-0.3.29.crate 20563 BLAKE2B ed0559b0073890911fb47742743b2586123bf9e9b594aa0d5b2c419c6768cd37e25b546c21077ea6cc02823a679b302aeaaca6c7fcaf9aeec615dd08f53a1f6f SHA512 bac7dafc0e10bef40e427c1fc0271d1a26acb2f5b1cf7cc7a128f4d4f1f3110529e45057b71cea7b0f6ddff26945fe08962285ddeb22b54639e44a2e43af698f +DIST pkg-config-0.3.30.crate 20613 BLAKE2B e14dd544612f74b038bc7d279d629034237946c261e3e97621d6ac910a12f4fa4e75932dbd5d3339e62325d0ccf33002b07f04b0523f93d2bd3b1a919841ba66 SHA512 e4bce232e1e1cbb17d1c08c3de4dd12613f5a5238f831c2a765b6ede9b494e647d2416a7d9a0c926104e24066dd1b38df8df98a6c55d62f25060f80eb33d064d DIST platforms-3.3.0.crate 28955 BLAKE2B 3bcccc9a8c0d46513164f4b451af56a001967a8a0e79643ef9e10e3399e77eaab2759f73a68cefce295a8256b0c88382b42756a1303fb5568922fecf7650882e SHA512 289eb7b4070d8b040445f10966cf6edf050ae740f59797476499b44f9391cce904a83f7dc43dfdac7ffd6174e5873605aa8e1e177700f28b9318703b27382156 DIST portable-atomic-1.6.0.crate 140689 BLAKE2B c91d06e04a87c9a207233d8a850859aa1f5cc43dda8aed34511c3fe9641c27412796539ed045a58e649d2a0c7d71100b6b2d78a0c662fc061fd961a652ae8722 SHA512 b27cf57655a2f1e2d6ea7b45d80b4f9920a836e462f132c50dc1e4d314e162444309de1baecf45dad2defc7a5b99759165e54da9fe759b24092f8cb8755c515c DIST powerfmt-0.2.0.crate 15165 BLAKE2B a3e1ce63f5866f75526eeb749bec6607e42cb495bbb953082cde7e98e6aa429ecaa41889d98ff7ed4cf5031258b4f7e0553ff8fc435b3b6f8b4ef2b6d53d9b61 SHA512 0623f92e4d6ab284b3f6dae58220d79d9185df4a738999d68040c50d72fe0380d70358cb622f079c629bab53bb03c6e085e165d5bddfbeea84245864fed90029 @@ -227,7 +231,7 @@ DIST slab-0.4.9.crate 17108 BLAKE2B 8e5288c4d00efa915e7be27b55f2204850968624f0d8 DIST socket2-0.5.5.crate 54863 BLAKE2B 4237b540dfaa96d3f8a8b9178519e5ea37b6b96480a2aed5287f462845231427a18f5add26756c7b03c18d4d4aa617a5a36c5462258ebd8be326e8fed1c48641 SHA512 afa8df546234d4e8f89289622448aa42d8c2ba74a0a3a4b13c0ff7bc30fa435a7d6d6e8c9e2a6933cfa23ebdfb4908c865e82c657611defbc16e1f1bf66f9f8c DIST spin-0.9.8.crate 38958 BLAKE2B 8648bf2e48fc618758e3de67f0a493bf3cd22a8d18666164b0d850ed7c0d73650f7b0af783019dd361116bd60c61d24895cdd2c579383cd2700de0e32a23cdae SHA512 b15ad66ba9b308937f34ea166b799676fa45c67224e10cb57530fe33d2a8317ff3e3db3223a3249fa2862cc141c964d2130d3f39910a86ac5ef8aaf8ff4bc6ee DIST spki-0.7.3.crate 16409 BLAKE2B 6b39144e4e718ce5eb454e21ee89fb936ffd31ec99554b0150fee47bca396bdfe4ef39603ec029d4af4d8c4c3ba2de7f6c549244f8c20114de9b43ff14921681 SHA512 d33a6a7844b33c37628024ccf25c1a631f7a6661595e063049b8c9a9b4edb28f0335397faefc592c6fc5e96378b870ab5dab9b0649c3387577b2370ec8210db9 -DIST strsim-0.10.0.crate 11355 BLAKE2B bcb25ad0a7284e24e4f17ebe0ccb621bdc4118e499b50b094d98aa7e8fcc0b96716c9953c3516ce7ea78309d41d424892ded595259696a5bbffdcb07802b5c2f SHA512 78b318532addfcf5c1ccc1e14539e258aab9d3cd893cc45d82342549bde838c177d90f13c560671f8f32929af47d0b467db35e6876bd7697d8b3f9e055aeeac1 +DIST strsim-0.11.0.crate 13710 BLAKE2B bdc748ffab302c8e1d3412663e300c399ba13bfc0e15b07101a680394204af2df8897ba784dbe57b95c4fa9e732439d0f5aabb090b1b1c81f066bfa125919419 SHA512 ef4165dabaf8cbdd6c58420043cff9c0d1f4bc3ed53de5973b654bd71ac7d462fecaa6e1b750fbcbb8e19b35f6e6b73641a17656b20f5562b6ba7d84e69de226 DIST strum-0.26.1.crate 5861 BLAKE2B dbcfb1e1ae7dd18e26cdcee4be8837a3e94bdc5d86b0cfdc98026e77f120f29d69425e50f24b219df9ae2cf35473fe03370aa5edfa2f953e7d20102206806b1f SHA512 e285c10fb927b5373f0dd64131ea425c5a86b5ba4e60f131fa26f0d8427a99e58192b8a44bb87b76153d67e9625575b699147b966d505e59c7649ebc8ca1d584 DIST strum_macros-0.26.1.crate 25326 BLAKE2B 2f52389676e1581abf42995a54d7725b0ece50ba8da2ecba700c359a4bc3dfa3c48440908a57d8f25334a1ab6a844093e131dc351182ecec1cab9bff1b04c407 SHA512 f41fc17aaf84385437605ffa751a9f03d19d230780855f86d60b53de4bd1891519a3550c41a31d44312f44b59c3c184286d9181e40c3fdda3aec0c2806385455 DIST subtle-2.5.0.crate 13909 BLAKE2B 660c3a472ca54c9843ce3feea74b802e27fd7f62dd37a30e2a4ba82e4b3a71df63562e8865d5fc675d31d0900998a8730503f91a61450884446a3bdd6af0041b SHA512 f150b1e2037554f8cd3213a54ddbc258f8f670cc4f39e7084cdea4b47538dbc58b834bc93b443d58a4b9087224efc003234042aaf366687dbd32b1e7174082a0 @@ -240,14 +244,14 @@ DIST system-configuration-sys-0.5.0.crate 6730 BLAKE2B e40c4b5e7897cfe30b2fb6daa DIST tabled-0.15.0.crate 208638 BLAKE2B 04d89ba7f71ac7dcb1a9d9fb46ccf2dede60b9f249685d12613428f82e368438cb35dd5a645655e1ea900b57fddf2c2979dcf48a6eb22f79f5e8a3ae1fd771b9 SHA512 37c38f4021b2ffb725769ec0acf66b4adffd13b88695214244eee26b8df6d461a14b7456117ac8575eda0b2a047da041551ff3da2d99623edb8b29765b6c197c DIST tabled_derive-0.7.0.crate 9352 BLAKE2B 018c9c741d67afd7ff3185f7c3977edf6691a79eba38f8385bc86e89de91cfa573855e2a6073639e7d5b1bdad23f56f96171521f0abb3022ed05b1031615fb6e SHA512 7b4ffc0c409215baaa66c35dd5f40cade33cbcd3e60aea832a58c990d4e56ebce972922a2a2804fbd560cae86567eccd25b88aa7238e9b59e0ee41aa3c8bec91 DIST tar-0.4.40.crate 51844 BLAKE2B b51c771611c2c1bc6a36d25493dd775bcb5891a2e4a8ae918781abe66c0335a3da30c5e44281fa5282dace34c09754fd2df840c0d74e5b0b4624a519fd455a8b SHA512 90bde0dfca91b6c304d5bcd4c93c653c066b76592927f5ed3025752d6d0244c0d5786c44af99df94dd6cc7a417663205d86f406a3b60f7307ca3c1757239bc12 -DIST tempfile-3.9.0.crate 32182 BLAKE2B 4e802990988aff3ab5173bd96dbd906651a8df46b2619e6a500a3b9e7f4a3cd01dc7ee977791343f7875afdc4793a845000bb363d8c1a6599aeb6b1efcce5d56 SHA512 04e06c966bfa7a1567e7185ebd5c2876b96e46e36af14931bf0eba63795cd20d1c3427b6709a4cab2a68b8d289fdabd5537a50e5407a76e3a9fa0dcc7d3ce6d7 +DIST tempfile-3.10.0.crate 33376 BLAKE2B 303e3bbc2492fd965c5e5ca02229868e94de1b1286175a07b3f9767a174c5a83bb6f6ab59d582f963f9cc4f92362be6a8e898e140397e4314bc18bd8d4e13249 SHA512 0f9bb6420105badfaf7e59f9679b53c6e3f875208ad8b08b9bf38cf67a1512742f1e3dc586136ec9cb760d127da6be69e9f9ed55f18722edf1af3a452e7d93fa DIST tera-1.19.1.crate 104237 BLAKE2B 244e300101e13f05a8547f50799f5809714696d4314f739a8daa5d5e5e4f45eec9bfba6e1e8fa036da73e2765b84735ddbf4cc0843eb0ea4e1e3c91852d3803c SHA512 e66944615221c45ffcf9ed3685300fae5076fc09019b6576f82e885347b3d06c1a1a26fa59297957516121539e24bbf888a35231daed66e6b67d16533493ed3f DIST termcolor-1.1.3.crate 17242 BLAKE2B 5aef69c0004081bd3cc4d531d13d63627cc02313868c0faab62358d13abfa7b4ba82f142c2801d25a6ae46ecbc8b7bdbeaa21c9105ea3b8950ab6a38cdb88513 SHA512 5838fcbfd70f300cb4b62aab50565db52074c56b152ccc8ac1173e4676c0d5a636271bf5a645a77da6e1d4edbf0091af2cd4dd6d73b85c3d198c760898c06f3a DIST terminal_size-0.3.0.crate 10096 BLAKE2B 097ef50a85945128dcfa36d8ea0fb15f11142c206462a32980dbbba4fe2872abd214823fe3c75e804f3159a97d6e929ec338860e9c89587da509fb9e6da5d339 SHA512 f3bc9144aa8a87556543584a2495df6267ce3bb017f3ed3d00fa43e89b5de783e1285ca62dbad9dd9c3b37e3a476a6f3ab0804eba2411cb594a569bbdb310681 -DIST thiserror-1.0.56.crate 20592 BLAKE2B e98c8bba8d21342c981646e88b72a7cbc146c695a200aae3e076b55948791cc51a29e8818d64451b17233ed4d095d0ef63ba4fb07502f4ffde5af738b8629c37 SHA512 6b7c856745256d6ef9e7ab2ea0027f9c1ed2c75ed5b075068af57cf706abfd835fd4552d9ec7578bece1f820086828c5dec85a9cbada409569838cdc9d63936c -DIST thiserror-impl-1.0.56.crate 15367 BLAKE2B 6fad787eb1e2c0f25fee7bef160be794fb8000a0aa292ec0d2d66d7a4d1fcb226c3e2e690ff6a61ba2d8704208014eea84044dba27523d4b2c26d2f7d4ba64d5 SHA512 da66f4674cf699083f7142f3a60c1c9334767b4de3690b4c7af460ffda787fab2089f5bca231e92b6e71724d46fe7dbdcaa19073f5d8100838536d10971efbde +DIST thiserror-1.0.57.crate 20993 BLAKE2B 4eb90b8ee027e39102d6c030176db94510180f2bd2966503501ff89ca6b49afd61e6d9e1ebf18c08d374ff9de4e958dfcb3da8740fdfe31cceace5be456bfe4b SHA512 0ff7e48c3696f4f4c6af29f3142f0a7bb88a07b7a9877ec243e3ea15d89c48f1898b731311da5d4a7c88060628cae3eeea6a4eccf25bd851cb3075920cb1a936 +DIST thiserror-impl-1.0.57.crate 15639 BLAKE2B 2838235c5536fcb16d19382fe286850d6fb882b1d77ca4ade6a62e1d4727ef89f69cf0383cf330996f9e2303226d5fd709557331a45c9a91393db1788fbf4422 SHA512 a850806f09b232546d1e0df5e35cd961a8aa32f1d8ac3b24df360981da53b75325a46dc788c994042c95a5887fdc77234b9f6ee5851242f734a613e579548e3c DIST thread_local-1.1.7.crate 13585 BLAKE2B f497dbcdfaf7dbc8b4b0dd97f77ba93df15b63303e7894c9032c9822a5b8111e0a21db2fa8cfdce5a503f70959ac9cdf48c840b925bdd850dc15e8436ba72379 SHA512 3772452c2a349fb564d29bb06e13c8ae64807db27c3ee217fa04fd0e9847e94adeea582b82ffc2d9116f31ff478eb088550caf1346c263de49b55fa17b431c31 -DIST time-0.3.32.crate 118451 BLAKE2B fcfa422eea9cf12f026859847edf2ad80de7680eb0e10600d89b3c3c59b1bae4a19afae05de1cb4d461f5fe7840ab0554502df2ce274790174e0c62c81b73edf SHA512 d4fb2587296921a37b18eabe4099a07fc1d6e3e5a76220975bddef2b4390f0a3a8bb2e24fc4eb0d69b36262e4eb04e61f8a0cb47037900a3c14a26d6590a6bfc +DIST time-0.3.34.crate 118430 BLAKE2B 6d04a20596c9b0961ca104748d9d360f07b16059719d7410fdf1a7a0d5f2aa02aaebf640999464835964bbded2d3257d79c4b0ca3080fbecf13dd2d0aa6962fc SHA512 3997e1b8d9be2f54184ebc9e1355d4b65f0b7bc9439b2b29e4a4acd86ad3a3aa019261112a24d998d76a7f66b266a86536fa50412279911b14d4d7aa7078c116 DIST time-core-0.1.2.crate 7191 BLAKE2B c477ad3410ff29f3bf4a38fc6ac4a043d49b6d2bdf5cf309ffcd2eec3bb6e4c4b62156ee7f069f0b37ea31c163bc75ccbf35abc1db2833cdd4912135e60ddfc9 SHA512 3861724c23cb806829a01186deb5217ae8252c20af622975264e6670cff528f42155039e4937756a9eb312a5580ffab07949437d5504d684a0e70755046cac52 DIST time-macros-0.2.17.crate 24443 BLAKE2B 5045af9352961db0c97cae2f6ca3e8d2c4f89a129c7ac2ec1d8d20804292aa9f2901a61f910a564954614b68f39311bd381deeb66fed8bdac423227d077f3d14 SHA512 c81747f0b74e68d3b3f36d378ac5911dece8c6b511e5ac793807f854cc31c812b927d0df941f55ff90d3d67512d0ac6a5f63f2de4322c81b05da42f46b4a661c DIST tinyvec-1.6.0.crate 45991 BLAKE2B e9699d4d80a78978f0ebfd049f5b33d7f23d401cf4f4439ccb168e8c0e322473ad0ea7e2ff0ff69e9aac3e5c4c9ae5a7102185533bfbf96dbe77b3526e700bc9 SHA512 e5acaf353c58c60ae5556130a934f1048abb79cf6668ae467d308bac44b689d8a9997227ea879f4b5fe50f29cde8761801b088d7149bcd063b973056c381921c @@ -256,9 +260,9 @@ DIST tokio-1.36.0.crate 757286 BLAKE2B be9fccb7c41fa6a48f500509ce7b7ce0e1c831a5e DIST tokio-native-tls-0.3.1.crate 20676 BLAKE2B 4c752179aab8b4beaa6aa212dc8d9e4a2b7c12be0dbf80406f20f92fd12844a3390e88a1536875596ab44774a67ce35115ca4622f9faa977c80c4261ab4c06ea SHA512 bda2e77671e030a021f628ad760b3fbdc26e7483a5f9ef6c6892ae0fc38b538d52d527805c020d578079896d50fff0bbc036a87cc91604904840d5b7dc181914 DIST tokio-rustls-0.24.1.crate 33049 BLAKE2B b061bc5895b9d7e5aef96512667673ac6fb813a4524b1f6620af9e2598425662b15b5e07d3896499b8a24d820462d15b71a2b9cc804886d546c8ac5957f28529 SHA512 93098f34d117107214e2e80e0e6c030423850ba160d1858b5149c165643700d308dacef7723e45b79fc911ba13bc1bf363c89ccac047cc6636e48a9a5a9502fa DIST tokio-util-0.7.10.crate 110508 BLAKE2B 073b25e1484d54911bc15fc2a4b3fb7658f24f7f77a2382f9f84c5122871cf8c5d6097d5c784cd75b17a79aa63eca80644ff54bb496b52e53bb89650ce35cab0 SHA512 d77db36cfa5a2ace3090874d8996b9e94058ac31648308da8dd92a7bdc9b9b61adb703dbd2131adfef0b428cd61b4de76fbdb674f718e89b297f762af11ec50c -DIST toml-0.8.9.crate 50659 BLAKE2B ef31bbff4446ac4c28c3b8f518e1eb9ec20e6ad683bb792cb7ca79a97a758e41b993e12d2f992998f4bacfb9183b716b52c1f04c3a381d76677bf3ee579ef47b SHA512 7c40465f72bc1b19589bbdb096c8c67f4a10ae363525aa292935414404d14b9d46f17896e12219d7c332fe760903fe898b706a0ee1c5c234af64b27344cf7e18 +DIST toml-0.8.10.crate 50667 BLAKE2B 815c850d4e2b8f107729c24ff82a6be81160649fff726f07a2c6e2af0283298fd5eadcc5811ba4ef20ce12914ecb43da79fa1840fea8d1572ca59f02f9e2c310 SHA512 24f3b44244d7e91ae50eaf20bde40c177352592aadd2dac697a831a5de9305ac1c93c8dc407579b9bbd8d9984fe34cfdc42c3243cd0057ad83db14bd899bb546 DIST toml_datetime-0.6.5.crate 10910 BLAKE2B 93a21ab2784e96ee2e6b56c7b4f733f6ac4c68c1e7d7dac3fbd8aceedb3580e25b4a9c7d9c3f9b5ed152560353b3e80906e37824956dc4ea90bc6f039768f6cb SHA512 502bdedbcbd2ac9fbaa5f4b51f2e409af185f3633f01f8845de5e3b007f2400215ddeb82ac588bc915ed5a5f9d7251ccf93fe2a57cd40fca2927f4c0966357e6 -DIST toml_edit-0.21.1.crate 101661 BLAKE2B e794b6121ba7e2b1b3f50966cd40eebacee6968b6b28986cfe4cb7312b51ffff19f74826910d8e4ce307f74940f11e71e6afdd768ac196427bddf44595bbc797 SHA512 10cd3b16f763f55294923ce8f166f96fbd67a0acc4a93a46fb3044d8a38148097c592ebb405ced87030d35154abfcc971eacf0172b624ab477a11e616efbaa07 +DIST toml_edit-0.22.5.crate 103292 BLAKE2B 317770698d6588a39e245e4297f465a61b6fbeca04a28bd3d82dc7a14a8e41c672f0dd23dfc967da125b802769b9477614db05f4e4506f442c923bf7454a4b6b SHA512 bb485b58c44ffd72da3bcda2a6279104e2115f3988b897393ccb5dc029d487b6adbaeb5791fa2603e7ab8dbbba7ae4ed54aae64578e0040a130d64918a37bb01 DIST tower-service-0.3.2.crate 6847 BLAKE2B d4571704eb4bf7f729f4535a04b7eb94f644d71ba8c5604297843351adf4bcce7ff64ec4e5435783ee6ada1b0a5c97726cfaade391525c6b2bca933cd5e8ec19 SHA512 f4578421603067fa708c4ad9eca5ca096b5262b6d51a404f37d9fbb6c64f027cec6114991e4b7f8324cb756c033971a384f1804add28e00d0cd6b2ee01d9e005 DIST tracing-0.1.40.crate 79459 BLAKE2B 33693ee71564fe5925a63dca351e838dfd8612b4b1e49a33a70095e56ca63287c13c772661ace0e540d08c92942d7cbdc51ff2cce4f4b372164d9aa20ec05dee SHA512 5622188a45dddc0d6d3a8244a9b12db6221f4180944ce1019d18f4e613e4bd113dae5d45fb57dd0754f6e8e153b047cdf00c8f200782bb2b868bc2d423d99275 DIST tracing-core-0.1.32.crate 61221 BLAKE2B a7815c46af9852ce62498083103c6d359351f4d33609b4291330073b6abf4b63f5e1bb1a7dfed3bbf4d6913ad5217e96999416261af8a70609408a29109e4db6 SHA512 164f79cacfcca533a53b7dbbdc2015aaf851a16e00c72fbc4e5f515b6a6dedfa464e964810009b54f08cbcdc5a314e50245ac7b1b01a71fce4c63db135bf5521 @@ -276,13 +280,14 @@ DIST unic-ucd-version-0.9.0.crate 2246 BLAKE2B c546ee182387db997e6cd699a25bc201f DIST unicode-bidi-0.3.15.crate 56811 BLAKE2B 1f1d372c86ec7444f13eb32baf13dfc8699b52156b265a2b53f40c0d771064876405451120fe54739a2679e6991caaf4f63e0644f03729cab814079fef4868c8 SHA512 7a21d5eb05ea8d691dfd54ce4cf7d3693d08067f7a88ef17b8c3044634f46411176b1bde1516c442577910b254007b247f5e40f9932eb601cd96cd574f9d9db8 DIST unicode-ident-1.0.12.crate 42168 BLAKE2B 4cede03c08758ccd6bf53a0d0057d7542dfdd0c93d342e89f3b90460be85518a9fd24958d8b1da2b5a09b5ddbee8a4263982194158e171c2bba3e394d88d6dac SHA512 bc1824e1e4452a40732fc69874d7e1a66f7803717a314790dcf48867eba34bc9441331ef031e386912e52c385645c25b6ed39d4f149973b5b97371b1b96b1920 DIST unicode-normalization-0.1.22.crate 122604 BLAKE2B 3f3430b279cc0ce1595392c869442ce676ab097154c688779ebcf726e10c497df59be2cd7bb2f84f99499a9df0654760a10ac92224c17d74775aeebe291241e1 SHA512 a5810d5e9cd93dbb80e013997aa9d38e60834619483a6623eb2859ec5d59a5aec3fc4db123dc7f4e2fe9f2b8799cf6af48bdff22d69a00a23707240e8bf3bb3c -DIST unicode-segmentation-1.10.1.crate 98416 BLAKE2B 4c391ad34c5f8a00096ce89793b15212555f2d8a367f3ae78f26a36c5897b69f3efcd280a1bd3eb3f61c87b8a26061804b1cd56e1c1500cbcd62e8bc74520014 SHA512 e96224bba73fe9a167bbf226bb13fe5bea085765a90f7232cb20b42f3c584242b7291aeba1eb8edbe2ae40e5bee2f4714f434324f79316b22e8437c77a50e86b +DIST unicode-segmentation-1.11.0.crate 102740 BLAKE2B 6ab5de53073ff56da4924e8c6ecbfa4bbd72a66b8d86f2c32b2f0ccfefee8064997a6b5311af5de2b71943089c9f52862e3cb13cf366cd645f57c96f2ac8673a SHA512 4914543cf022680f341c4a235f6d9204b3ac9a9098f34a80ee8c94e3d8ccbb82e78af016978eda910987533044593ac629a35286dc80707d349b33e405e86bef DIST unicode-width-0.1.11.crate 19187 BLAKE2B 6baf7f3b32eb838925e591792abfe11968206d177facefb89ef51daf44c18f3fef1e41c19a47b88b81be50667af626af2024ccc540b240fb6e1d83fdea57076f SHA512 ee06f4144525424327a17578642565f396802f0eea539b3bebc8d9627376a8bc6c5376d83a6ee577068e99fe75815bd765e6d49fb9ab9b253d00594bb15a5ffe DIST untrusted-0.9.0.crate 14447 BLAKE2B 8e9c3ae09435af0885bc4a6e3c8943805b48cfc00bdae228c7c43093254e1be15d7005d1026561ff369ec37865d8458203f421a9c89ae3db077f655449621aed SHA512 5929e4079c1c2ff933ae8d8f59a2ecc7a424e71a20d1b8821f75925af68bdf82604b024c008e5464b02e25ff093e561a352b685e755b3d0b27e4c30254689416 DIST url-2.5.0.crate 78605 BLAKE2B f3fec3477248cbbe67866577eebb03f517c284a5e5cb783132b11ef3ad156a03524f4730f188d822dec85169d7474e265099296d6bdd4adf5ffaa0a118821617 SHA512 4aedbc48b85bcc2853189f5fe8265a01c76516b5507f4e958d8d0b860fe2590c69c95f0f4b9fd6fac9b8d5911bcb0a5e9ab7f8e8b600f37a12db1438976ee5c3 DIST urlencoding-2.1.3.crate 6538 BLAKE2B 65777b0990aa6b3d27a47f36114da8622026ac8946b5ffb6e04172b666ec7244a55c250a7fb626472bb2b636eb32ee945599cee5ce7351c3cef2322366db15ff SHA512 035848d9243ed6a4528377b56edd7f8bcb5f824381b420dc8f5c4bfc3f1246655c54eaa7de0e4aaa7138e0b08fd796b9ace140ab919aed2d94f6952b577386ac +DIST usage-lib-0.1.9.crate 14322 BLAKE2B 42edab8b098a2ac59d0b36eef9fe27cdfd92d58ac1df377105be1261f3810ab5393112037ed26bc1160885ec8c5abdbddb4576cef9f454230babf8890febe49c SHA512 ed92986ae52c1c85a0b34aa849f483eee0ca68bd2ef6ee017daa10fb0f3384737014ef50c2f9cb129503763b5a2ea4998f46d73153140c9cda0e4d93d5ff09b5 DIST utf8parse-0.2.1.crate 13435 BLAKE2B a1c111d7ffc60690f2aaa86f034c66ba1abe4e126f1774a4377d41eba3269369862f57515af387ea785d69a8adf46338b5e53761b5ee6f4f4380473f4d9cab0a SHA512 51fba8f1e7eb74b7020fd831e30a67fc8353ac2ee07335c8c3374a5570ac8117f165f6905d4b7f0360095b7b5ed3e739001d02a8cc3c89195baf2cd679136050 -DIST v2024.2.4.tar.gz 2793007 BLAKE2B f5a08d7ee061c1dd4ba085339108ee09b4ed98e60b3a6d99c0e2788fa85a3a58df191edafb9b23496fc8b191a2304ed7a26cf8188756259d397cb43d45fe7587 SHA512 29a2ae6496227bfb566c8ca6fbe308db6e0d38fb39af0cc3201c7ac9b8284d56de63c1d2c25bb4f6c8b2949e6c53b7d01c1eb147655260b64a8e0fe38702639f +DIST v2024.2.16.tar.gz 2794168 BLAKE2B ed8080f48896366b1164ca34d272f9db77702811bea697dcac99c5de4d892b06ae1bb68498cd49d179466753d08e48b5888845316b201b20e0d0a0f43eee3d9f SHA512 0d73706d42572b8259b01f7d633f6d75b0a26de4cf3837ef7044b55ba15b238fa74eb22beea65e80397bfdbaafae663792052c929b1db52c7d8466d072ba6a81 DIST valuable-0.1.0.crate 27718 BLAKE2B ef5ded994c9a6dd302bed27f0d757447b0c86dfefa499c1ef0d25c3a6745ce61cfa2c926826534c9f605f9b89b4a19f91f06f94ae7c03f1ddc4c58fab3ae58bb SHA512 a97f65db1f1c5049a276dbb0e45e25c6fc6ce9d27ac1fcd77c945324cd8216ef60344065c79799ca04e338455e4f7422c44078eea32d5fc359dd0211ee7eb387 DIST vcpkg-0.2.15.crate 228735 BLAKE2B 6b6bacd9a7fa38919241f45a97f58cae957e58d3aac99df208a26aa718e4f1644f4ccefa31b09151e5c1952288e0e5837c363918b98c7f55079a948a952c1c50 SHA512 7322a21e8811b2fe4e79e09dc321458068ecdf1953f05d36233f3278ecc0b1dfc64194db7010dd46fcf692285f42475beb090c6c6cac0c8f9fe0eb5c770e3172 DIST version_check-0.9.4.crate 14895 BLAKE2B fa1fa4008af165bfc1fdbe560488afd9d232cfafee94104fbcc4cbc52f234849bff9ddfa88109a1ac682f6d9c1d86b0459893d223f64e65adc08966aaf93dc89 SHA512 b172dc9a3759a4a683ffc39b9a40b03b9974b626a088217de87090466cef695226557c226cf3e469b2b25ee7297b7eb0d7719878cab42457f80146a81943c0c8 @@ -292,13 +297,13 @@ DIST vte_generate_state_changes-0.1.1.crate 2422 BLAKE2B 6e8fb4ce0ca0fd6b9a4dccc DIST walkdir-2.4.0.crate 23550 BLAKE2B b4298c01cb38be0479b7ddfee627af01f889b6b6ff432e368bb67f65134c3958a4fe271a5a7dd61b19259ae88f5680e5ce8e12e50a872b05fcba68f59b7073ec SHA512 09e1bc852c01b452c95b26a369831a97bc5c9e0ada3111c73774570dd73bb5b9e4735317d5572304fb48dca44ce7b9f77bbd17c418b6b047b2ab17b8bb42d9d9 DIST want-0.3.1.crate 6398 BLAKE2B bcc1384bbb86db27b5e082b29a8dd4d89c37b40f6cdec4df8a86c8d205b418468b6cd42a78bd14ebaba057b28e151c00b474c098d7596f49a823ce33510c13b9 SHA512 f93f765113f035e134b967e8eb3f4511b8e03e793a47899b614d826afac02348fc02865c298a10410ecec4eb64f35f66c22bcbdbe36ed0c4c1665dca1db4d526 DIST wasi-0.11.0+wasi-snapshot-preview1.crate 28131 BLAKE2B fe501889f25d65e2d032f885cc50c4f8bf7dd70fd5cbc438de349838370d8699e9627b0a4fc76030ea9fe6d508f41d0c9928a875fdbc47e73bfb17241cf7b155 SHA512 043500ab28cd9cb779475255da5d109ebab7fccca72b64873dc28d77bc5a157ba8d96b9e8f05223b5b36c7089bb7b4ba87657fc69bac16b78972f897294a865f -DIST wasm-bindgen-0.2.90.crate 182529 BLAKE2B 309bf19f4f0551ced885ef7ef80c56bc54431cf06c77e430872fb87e3cfde0c0dc49b018d070b505ea8e488e94a4845ed143430e3c4b70ee48713147b980c6e9 SHA512 c6f73581590a8142b66bdc6373d925f1b1d37d4d09718b49c3454d3d2e16eab3dde97724cbd246420e0c29656bac8ede82eaa0b0e94f22238628dd974223db62 -DIST wasm-bindgen-backend-0.2.90.crate 28348 BLAKE2B 14193bacce7df590b372bbab1126255cca027fd94c76c17ab13b06e7c18346b5ffff5e2c9d0ff5bdc631846fca70eac9a43e4ffcaf58f0c062ee36fe025abf75 SHA512 7b19cfee23dad5b09b6089d2b56692bc183d477fed5db8a91a6b30c574b3de4b1d45004761248d8c5437ce20a5ff64f7e081fccbd84e8ed72fd154e5a06607da -DIST wasm-bindgen-futures-0.4.40.crate 15375 BLAKE2B a11cdba684c14f0deaeb22eb490012b1d72d03e0c5307a8b7e1fafbdd19207482770c66fe02b013bd459a073757bbbb1e93031e8f96ffde04dbb6717f282e514 SHA512 8a2cd103e6d2c8c2c4cf1f83897f9cd54319bf1a648078c18b0bbd5f47903d8ec21949b776eaca8c997ddac7b9ffb3cf48348be1e830d485671a73bccc876250 -DIST wasm-bindgen-macro-0.2.90.crate 13904 BLAKE2B bd5e3521c27f7ec3cee0f2ac4cf894ea5a9b9bde65ec55ae9b29d033b986338af92e2dc9932b87dbf739f4ba48230f17a16226cf1826afe13b102225af29c1c8 SHA512 97dc09c02ea4daa1694f3a118aed3ae958373e179bc7ae4d7bcd14b9958f79c03564d678ec04d7f80b6e6a5529f63f1a853b2905055be8a210d41a12ff279007 -DIST wasm-bindgen-macro-support-0.2.90.crate 20008 BLAKE2B 46172ab1e6d03faa2a29d8b2d1bb3b37dcb830d73aa96d0922b63627a6eced1d38729ff85bba7eba3e89dfbd04fbb92a4b87cd74a1a906286c61145e3ad38da9 SHA512 9a5782cebb192276a0a05b54f8cadd994cbb97388d72c85f9c60754ade309684883cb2f916badc1360522a6599172eab84aa2bc981889cf2ef2aed8a4e0a3577 -DIST wasm-bindgen-shared-0.2.90.crate 7264 BLAKE2B 2082267bcfae660b72f6d5996a563d10319a1cd7078b37070f41e96aa56da31ca0a22c168a1e5fe52294f5d7a50c76d06f03d489cfcc0826db29316f2e67ebbc SHA512 f6639c004b17661d0a571181e1447db7eeadbfe93005d6f0e1bab983967591b64cf2ed21e7b77934ad45058adedcae28af1ef141696bd598f9c2d683abf93018 -DIST web-sys-0.3.67.crate 725967 BLAKE2B 4d9080733645fe5056bef44d7649372ab588ad8642bc8581f15c7d24cbceafbd214569a5f07f968d30999b08588005c5ffa0c63da16d44bdd6d772e8bf712a1c SHA512 9653be945e3c19dd5ff344ee002f41762a5efc24af316424a30246427e15d1c945f6ae25b9d6dec1881867003ea0dc261adef328bc1a1a8f94d7d792faa95e1f +DIST wasm-bindgen-0.2.91.crate 182689 BLAKE2B 4ee85709546462be3da2a6f1caa02448fa903c7411eb264894aac402979afae4a0d7f3dbb486266b05d8caa911893ae9bfe9921cd36e03eb5147a8d75d6c17d2 SHA512 80e91e5b6094eddadbafd842a4a1b3284de7bb51bbd795e8716a0adac354dc14ceee0593d7c33090de06aadc8bc61b8eeab8851d066cc4ef4661e64adff1988a +DIST wasm-bindgen-backend-0.2.91.crate 28345 BLAKE2B 912a0471ac64d61f18d1c1749a3614ab70d08f330fd90b903ce5ef51f18288c7d4ef153f1d8100671c02de8fc499928cf925bdab4da4f0352789268dfae87457 SHA512 7d3c8db4503982fae9c86620c964e8f9a4ce542a79c56f21d9f82d26bb9418e78b7fa9922901663bf78516d58652dc3255ef48d1e1f042d8a3c69210f5804204 +DIST wasm-bindgen-futures-0.4.41.crate 15382 BLAKE2B 4556c439efb311b2624f57fbed58c32f7db1e0ee7fa03d92525e9a82f7397a23e3f2f751774e60fe402977875be2fb665c83b71ed9b121751dea8cf94e8d4fac SHA512 8aba780d8d1c18f78e3d83efeaf83db72382d89ea262112100424dc082110e4d71eb173cee8c6b53f5d872cd74c2e4091770a9af829a45d466a65575b7178636 +DIST wasm-bindgen-macro-0.2.91.crate 13898 BLAKE2B dda8dd5d77dc57324b633f056805bf7892c39c5e70257b6d048c2f8cf885f7306f91f3f17de1b63dc740db66d52fe2250ba981077e03dcc731dcf7c80c047c9d SHA512 6b05e0a2657e7e4f313089787b52cc7f59f5a94be6f716ba007fcbc3bf7c38561225ba3f39245d779e28dd30630b2d4c6be12baa6ea1e6cb47e562ccff48372f +DIST wasm-bindgen-macro-support-0.2.91.crate 20091 BLAKE2B 337b1b2a9e9e9c1350267df0d9f041291a847cf4faa3bcd6fcc8a96e66fda54685da72f6e64e57cde0d4609409ebdc7851e96781f599470f8b0545018bdc2166 SHA512 1277682520d88cb9529adbc054590a732a8890debe33d1d64ebce332c66c02f84065c0f643fa45c01de8b80534b2daf8333979601323b3ed50dc49553233c39c +DIST wasm-bindgen-shared-0.2.91.crate 7267 BLAKE2B a9dca2db84a33c650a7abbb6dc552bc4bab1446e66aace751d3709d2c63b878b127748a83cb174aae3ff8c5f5ec017b97623e5e9294e6ebf92d669efc618c357 SHA512 97072a8bdfadde104f6e9e760e1ac5ec665fdaff38a93a0bf601c95e652b35403e58a99fa8c0fefea6e47b38fb97f2e1ffcf52736f9ab890b0b9632efb26cb4b +DIST web-sys-0.3.68.crate 728353 BLAKE2B d0e8d47bb44e83f376b3d3556caf2d243eeeb5f2798fed767ce3cf0eb0c67fa13b74cdd9a9999f48de06fd2f2d720f68b602ba24c20b50fa6e78966e5cc19893 SHA512 f4b537310e9900410bf4a00b382c2bff29317efd2ccfe12b9680dd3ed49a896eb8e8e10d9964d463f1627cc9df1e27dfef1c86693e90b94ce3c488915762d88e DIST webpki-roots-0.25.4.crate 253559 BLAKE2B 737f608323fec02b77c47a40f8b2f9bf44f1b29d32b936fd7bd8c1066efd8916451b96ffab8949f5b5ba537bb1ed6300143bf51d1ef8663ce5a9a7a33947e81d SHA512 4891aa5c6a5bb8a4d6bd730fca5ab5bbddb5a39b9267c81951ca8d3ff0dbcd305b498328f99b2da79ac65cdc9dfa42c40631a4f8d6975ac6f4ed9c85a8d2178e DIST which-6.0.0.crate 16751 BLAKE2B f681600f2e2af626273e4b189d43dee9ca5c09f1808870c49aa0974d56ea1f944e83a0078656ef519d6c172c0b22a56f5d0adba21ef640afb2665bf9b58a0d54 SHA512 f0da2731701a33a07704672490e53e3b1476f3b06856e7b9e00aecf92dde5b6ae13199780ffe202a19205cc61ba1eeacd519f6a132307d8d2d07d0577cb73b50 DIST winapi-0.3.9.crate 1200382 BLAKE2B cb5799749ccd935ea2d7068d953cecf19f543d9db7dc16ad4584bb7005373ada34937a3ced7225544d8bc765da599911c7a3190efefb3a25b7c1bb7123b4f673 SHA512 ff8b7b78065f3d8999ec03c725a0460ebc059771bf071c7a3df3f0ecd733edf3b0a2450024d4e24e1aedddaecd9038ce1376c0d8bbf45132068cf45cf4a53a97 @@ -324,9 +329,10 @@ DIST windows_x86_64_gnullvm-0.48.5.crate 418486 BLAKE2B 12a2199d434617c1df1a839e DIST windows_x86_64_gnullvm-0.52.0.crate 430165 BLAKE2B af9345a1f6e0ed1392ca1534c68d23f3be0fbb6a42b3c5518cee14373e645038526da15e849d14abe45c53766a30c6c2042a626482ba4a05409f325eb6aa36b1 SHA512 e88af35fd1c694dc189783e5c81aafa61aeffbddce4d7130e1125d0ce3d932fafeb345990ffd98477c41b578b7f5090f4f9c0457b02146309b95549c9f8f44f0 DIST windows_x86_64_msvc-0.48.5.crate 798412 BLAKE2B 8abc0721e2fb337fe17c91d278947d36122d9045b839ba0cf3e690202d242265b676f23cc301da5f9d98c56ca4ecb76f7d6f072ee71bf986a1deca87020b90e5 SHA512 fa1c5cd14ca2ff0082e2504cf59d317dc4dc6f7138d35c12f95d4476a9c13d8b7f5537d0ee251eee7c99411ad31b22263171b7fbd391daa5d3ea3488ceaa61a0 DIST windows_x86_64_msvc-0.52.0.crate 821600 BLAKE2B cc448b65f98fc0fc4949ae622b7020d2dae927ae45310649f6ef71809740eda9d3db0fc035676c201fd9ab9639e9e7f21e2e992b4c789542f12b419d2c752179 SHA512 3aaee31533a1a48a6ab5cd15b3cadfbd906a93a153e53919d0aa74e440d11e29830554e4e014c215f5b88a475bb733fa8ba4ce9d773d3e23a40ea9ad37ddd0a7 -DIST winnow-0.5.37.crate 158728 BLAKE2B 441c1ea381f3e04d89e90e2225af29e9de2ca039575cf16fdfde7bf0414082ee481ae0a90424f98ac656ad09cd213f7d82130eab47c7317d09ac4458359b6330 SHA512 75862cb3502fc51256cbfa489095abfb463b29f10a63663c75ea867eaeec60c2b52d438a2d2e61114a661961a6e8feb99c2f492d875a25bd4b8cb691dd915c65 +DIST winnow-0.6.1.crate 157139 BLAKE2B 51ff0d738ca8ee04cbda131bfa675e1bc2ec54f286a1cfa4748e08c78cff87b4579fd74bf788fb7971ba77986afb90054bdbf6ed49db0e2b632d0f76127943ac SHA512 b1d54a03caa35a07e5a869278e5ff396da8fbaf7256bffa4d82da206f6b91a103fdfcc2e3210b5b1fc153636fe687be5cfd4fb4ffbeb84ba240ffae58ed4300f DIST winreg-0.50.0.crate 29703 BLAKE2B db9a968ef96cc07bc1088831affc4627e09c7ab8170a54fdf70a599c2d6180a8a9ac46b6304b61fdd2fac96e01bb004ebd8051940300c7b52c5b7b7975732d11 SHA512 2f52a9e3ab794665263499c88dfdf06009c6477d180a90ebbe86e786ae7f5003c9dc8b3c26224024e79450f3b94688000458f2ea8b1ae1c3691453c3d4df4787 DIST xattr-1.3.1.crate 12580 BLAKE2B 25c414d761a7fcd23bbe057add62c6da971cf33149066aa024320ab80e0ec8e8e8d5d3d0506e8de954b8f8c178d34c52a00a5fa9aa109510678098a3e3564b7f SHA512 4047abda42b949cf58f820e15ee99850de483857bbaaef737eeee48e1a2132972470f15bb2ddda56438f6a934918be96607a8de518a5a3dcec7c8ee6c00ad280 +DIST xx-0.2.5.crate 3616 BLAKE2B 0455028cd3da619878ba5cc63875a214f1b584ea15607b8339332f490c655c809443fda7fbc7cce3607bedff0334d6237050bc536dfd08c833b583396246a788 SHA512 a6d93c6e6b522036aa832e1e3032aa4e7afe6e2e2ff6aed1c91512d30427754f0bb89689847c12bd070b4b36c94e0e5ce0a27debcd59613ab392eb7c12afd543 DIST yaml-rust-0.4.5.crate 47783 BLAKE2B 3e888c5cc7afb43eaf3aaab2b6f47b86df164a66eb54d4e166b965cc84b1e06cd17bd992a0d6ee175d9a73a76e2b44a13167246383ed054afcf3cc1710b309cb SHA512 7621dc8dfd5e7d4a7a8805b2a7e8319b63b852367655f2359d4e3e8fec6c4fad52d75c46ce1161e4c674eac0780b757ce9d34e664e304d8d2beec7afa0363ea0 DIST yansi-0.5.1.crate 16525 BLAKE2B 3b5a93b98293daae72f53bf3f13bfc05feba8d5b27921f79595f7448fbcb9a0dfa6cd70f467c5735b914c46b7d3592e6cce080c540a458a904308525eb3aa839 SHA512 7b33005a066cc612408a65df6533e8718d1de43efc0fd57416a19dc2b811497570e6e18f100fb26073565e395e711518c27de7d644ae64777713f1a102eb16d2 DIST zeroize-1.7.0.crate 19039 BLAKE2B 2f94a5025f409bd2b96a456d2f78a34c6b05b5554abe7ef3fad2a55a8fcff8a6a1b971be660aa4c2954ab7d6e89bebc431036e349edef74711292f9f64b1dbae SHA512 9d31e3e76e8c861309a3579c21f6da5fd6b056c7d7a350427445a1a832e8827204804783f7f9b808acaa2148efef883d9078bf84943b1db55526bba5bf5a2756 diff --git a/dev-util/mise/mise-2024.2.4.ebuild b/dev-util/mise/mise-2024.2.16.ebuild similarity index 79% rename from dev-util/mise/mise-2024.2.4.ebuild rename to dev-util/mise/mise-2024.2.16.ebuild index 08f0cf1..179d0c8 100644 --- a/dev-util/mise/mise-2024.2.4.ebuild +++ b/dev-util/mise/mise-2024.2.16.ebuild @@ -1,7 +1,7 @@ # Copyright 2024 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 -# Auto-Generated by cargo-ebuild 0.5.4-r1 +# Autogenerated by pycargoebuild 0.13.2 EAPI=8 @@ -14,10 +14,10 @@ CRATES=" ansi-str@0.8.0 ansitok@0.2.0 anstream@0.6.11 - anstyle@1.0.5 anstyle-parse@0.2.3 anstyle-query@1.0.2 anstyle-wincon@3.0.2 + anstyle@1.0.6 arrayvec@0.5.2 async-compression@0.4.6 autocfg@1.1.0 @@ -33,36 +33,37 @@ CRATES=" bytecount@0.6.7 byteorder@1.5.0 bytes@1.5.0 + calm_io@0.1.1 + calmio_filters@0.1.0 cc@1.0.83 cfg-if@1.0.0 - chrono@0.4.33 - clap@4.4.18 - clap_builder@4.4.18 - clap_complete@4.4.10 - clap_derive@4.4.7 - clap_lex@0.6.0 - clap_mangen@0.2.19 + chrono@0.4.34 + clap@4.5.0 + clap_builder@4.5.0 + clap_derive@4.5.0 + clap_lex@0.7.0 + clap_mangen@0.2.20 color-eyre@0.6.2 - color-print@0.3.5 color-print-proc-macro@0.3.5 + color-print@0.3.5 color-spantrace@0.2.1 colorchoice@1.0.0 - confique@0.2.5 confique-macro@0.0.9 + confique@0.2.5 console@0.15.8 const-oid@0.9.6 contracts@0.6.3 - core-foundation@0.9.4 core-foundation-sys@0.8.6 + core-foundation@0.9.4 cpufeatures@0.2.12 - crc32fast@1.3.2 + crc32fast@1.4.0 crossbeam-deque@0.8.5 crossbeam-epoch@0.9.18 crossbeam-utils@0.8.19 crypto-common@0.1.6 ctor@0.2.6 - curve25519-dalek@4.1.1 curve25519-dalek-derive@0.1.1 + curve25519-dalek@4.1.2 demand@1.0.1 der@0.7.8 deranged@0.3.11 @@ -70,26 +71,26 @@ CRATES=" digest@0.10.7 dotenvy@0.15.7 duct@0.13.7 + ed25519-dalek@2.1.1 ed25519@2.2.3 - ed25519-dalek@2.1.0 - either@1.9.0 + either@1.10.0 encode_unicode@0.3.6 encoding_rs@0.8.33 equivalent@1.0.1 + errno-dragonfly@0.1.2 errno@0.2.8 errno@0.3.8 - errno-dragonfly@0.1.2 exec@0.3.1 eyre@0.6.12 fastrand@1.9.0 fastrand@2.0.1 - fiat-crypto@0.2.5 + fiat-crypto@0.2.6 filetime@0.2.23 fixedbitset@0.4.2 flate2@1.0.28 fnv@1.0.7 - foreign-types@0.3.2 foreign-types-shared@0.1.1 + foreign-types@0.3.2 form_urlencoded@1.2.1 fslock@0.2.1 futures-channel@0.3.30 @@ -101,7 +102,7 @@ CRATES=" generic-array@0.14.7 getrandom@0.2.12 gimli@0.28.1 - git2@0.18.1 + git2@0.18.2 globset@0.4.14 globwalk@0.8.1 globwalk@0.9.1 @@ -109,56 +110,59 @@ CRATES=" hashbrown@0.14.3 heck@0.3.3 heck@0.4.1 - hermit-abi@0.3.4 + hermit-abi@0.3.6 home@0.5.9 - http@0.2.11 http-body@0.4.6 + http@0.2.11 httparse@1.8.0 httpdate@1.0.3 humantime@2.1.0 - hyper@0.14.28 hyper-rustls@0.24.2 hyper-tls@0.5.0 - iana-time-zone@0.1.59 + hyper@0.14.28 iana-time-zone-haiku@0.1.2 + iana-time-zone@0.1.60 idna@0.5.0 ignore@0.4.22 indenter@0.3.3 - indexmap@2.2.2 - indicatif@0.17.7 + indexmap@2.2.3 + indicatif@0.17.8 indoc@2.0.4 insta@1.34.0 instant@0.1.12 ipnet@2.9.0 itertools@0.12.1 itoa@1.0.10 - jobserver@0.1.27 - js-sys@0.3.67 + jobserver@0.1.28 + js-sys@0.3.68 + kdl@4.6.0 lazy_static@1.4.0 libc@0.2.153 - libgit2-sys@0.16.1+1.7.1 + libgit2-sys@0.16.2+1.7.2 libz-sys@1.1.15 linked-hash-map@0.5.6 linux-raw-sys@0.4.13 log@0.4.20 memchr@2.7.1 + miette-derive@5.10.0 + miette@5.10.0 mime@0.3.17 minimal-lexical@0.2.1 - miniz_oxide@0.7.1 + miniz_oxide@0.7.2 mio@0.8.10 native-tls@0.2.11 nom@7.1.3 num-conv@0.1.0 - num-traits@0.2.17 + num-traits@0.2.18 num_cpus@1.16.0 num_threads@0.1.6 number_prefix@0.4.0 object@0.32.2 once_cell@1.19.0 - openssl@0.10.63 openssl-macros@0.1.1 openssl-probe@0.1.5 openssl-sys@0.9.99 + openssl@0.10.63 os_pipe@1.1.5 owo-colors@3.5.0 papergrid@0.11.0 @@ -166,53 +170,53 @@ CRATES=" path-absolutize@3.1.1 path-dedot@3.1.1 percent-encoding@2.3.1 - pest@2.7.6 - pest_derive@2.7.6 - pest_generator@2.7.6 - pest_meta@2.7.6 + pest@2.7.7 + pest_derive@2.7.7 + pest_generator@2.7.7 + pest_meta@2.7.7 petgraph@0.6.4 pin-project-lite@0.2.13 pin-utils@0.1.0 pkcs8@0.10.2 - pkg-config@0.3.29 + pkg-config@0.3.30 platforms@3.3.0 portable-atomic@1.6.0 powerfmt@0.2.0 ppv-lite86@0.2.17 pretty_assertions@1.4.0 - proc-macro-error@1.0.4 proc-macro-error-attr@1.0.4 + proc-macro-error@1.0.4 proc-macro2@1.0.78 quick-xml@0.23.1 quote@1.0.35 rand@0.8.5 rand_chacha@0.3.1 rand_core@0.6.4 - rayon@1.8.1 rayon-core@1.12.1 + rayon@1.8.1 redox_syscall@0.4.1 - regex@1.10.3 regex-automata@0.4.5 regex-syntax@0.8.2 + regex@1.10.3 reqwest@0.11.24 ring@0.17.7 - rmp@0.8.12 rmp-serde@1.1.2 + rmp@0.8.12 roff@0.2.1 rustc-demangle@0.1.23 rustc_version@0.4.0 rustix@0.38.31 - rustls@0.21.10 rustls-native-certs@0.6.3 rustls-pemfile@1.0.4 rustls-webpki@0.101.7 + rustls@0.21.10 rustversion@1.0.14 ryu@1.0.16 same-file@1.0.6 schannel@0.1.23 sct@0.7.1 - security-framework@2.9.2 security-framework-sys@2.9.1 + security-framework@2.9.2 self-replace@1.3.7 self_update@0.39.0 semver@1.0.21 @@ -226,8 +230,8 @@ CRATES=" shared_child@1.0.0 shell-escape@0.1.5 shell-words@1.1.0 - signal-hook@0.3.17 signal-hook-registry@1.4.1 + signal-hook@0.3.17 signature@2.2.0 similar@2.4.0 simplelog@0.12.1 @@ -235,7 +239,7 @@ CRATES=" socket2@0.5.5 spin@0.9.8 spki@0.7.3 - strsim@0.10.0 + strsim@0.11.0 strum@0.26.1 strum_macros@0.26.1 subtle@2.5.0 @@ -243,35 +247,35 @@ CRATES=" syn@2.0.48 sync_wrapper@0.1.2 sys-info@0.9.1 - system-configuration@0.5.1 system-configuration-sys@0.5.0 + system-configuration@0.5.1 tabled@0.15.0 tabled_derive@0.7.0 tar@0.4.40 - tempfile@3.9.0 + tempfile@3.10.0 tera@1.19.1 termcolor@1.1.3 terminal_size@0.3.0 - thiserror@1.0.56 - thiserror-impl@1.0.56 + thiserror-impl@1.0.57 + thiserror@1.0.57 thread_local@1.1.7 - time@0.3.32 time-core@0.1.2 time-macros@0.2.17 + time@0.3.34 tinyvec@1.6.0 tinyvec_macros@0.1.1 - tokio@1.36.0 tokio-native-tls@0.3.1 tokio-rustls@0.24.1 tokio-util@0.7.10 - toml@0.8.9 + tokio@1.36.0 + toml@0.8.10 toml_datetime@0.6.5 - toml_edit@0.21.1 + toml_edit@0.22.5 tower-service@0.3.2 - tracing@0.1.40 tracing-core@0.1.32 tracing-error@0.2.0 tracing-subscriber@0.3.18 + tracing@0.1.40 try-lock@0.2.5 typenum@1.17.0 ucd-trie@0.1.6 @@ -284,11 +288,12 @@ CRATES=" unicode-bidi@0.3.15 unicode-ident@1.0.12 unicode-normalization@0.1.22 - unicode-segmentation@1.10.1 + unicode-segmentation@1.11.0 unicode-width@0.1.11 untrusted@0.9.0 url@2.5.0 urlencoding@2.1.3 + usage-lib@0.1.9 utf8parse@0.2.1 valuable@0.1.0 vcpkg@0.2.15 @@ -299,19 +304,19 @@ CRATES=" walkdir@2.4.0 want@0.3.1 wasi@0.11.0+wasi-snapshot-preview1 - wasm-bindgen@0.2.90 - wasm-bindgen-backend@0.2.90 - wasm-bindgen-futures@0.4.40 - wasm-bindgen-macro@0.2.90 - wasm-bindgen-macro-support@0.2.90 - wasm-bindgen-shared@0.2.90 - web-sys@0.3.67 + wasm-bindgen-backend@0.2.91 + wasm-bindgen-futures@0.4.41 + wasm-bindgen-macro-support@0.2.91 + wasm-bindgen-macro@0.2.91 + wasm-bindgen-shared@0.2.91 + wasm-bindgen@0.2.91 + web-sys@0.3.68 webpki-roots@0.25.4 which@6.0.0 - winapi@0.3.9 winapi-i686-pc-windows-gnu@0.4.0 winapi-util@0.1.6 winapi-x86_64-pc-windows-gnu@0.4.0 + winapi@0.3.9 windows-core@0.52.0 windows-sys@0.48.0 windows-sys@0.52.0 @@ -331,9 +336,10 @@ CRATES=" windows_x86_64_gnullvm@0.52.0 windows_x86_64_msvc@0.48.5 windows_x86_64_msvc@0.52.0 - winnow@0.5.37 + winnow@0.6.1 winreg@0.50.0 xattr@1.3.1 + xx@0.2.5 yaml-rust@0.4.5 yansi@0.5.1 zeroize@1.7.0 @@ -344,22 +350,15 @@ CRATES=" inherit cargo DESCRIPTION="The front-end to your dev env" -# Double check the homepage as the cargo_metadata crate -# does not provide this value so instead repository is used -HOMEPAGE="https://github.com/jdx/mise" +HOMEPAGE="https://mise.jdx.dev" SRC_URI="https://github.com/jdx/mise/archive/refs/tags/v${PV}.tar.gz ${CARGO_CRATE_URIS}" -# License set may be more restrictive as OR is not respected -# use cargo-license for a more accurate license picture -LICENSE="0BSD Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD BSD-1 Boost-1.0 ISC MIT MPL-2.0 Unicode-DFS-2016 Unlicense ZLIB" +LICENSE="MIT" +# Dependent crate licenses +LICENSE+=" + Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD ISC MIT MPL-2.0 + Unicode-DFS-2016 +" SLOT="0" KEYWORDS="amd64 arm64 x86" - -DEPEND="" -RDEPEND="${DEPEND}" -BDEPEND="" - -# rust does not use *FLAGS from make.conf, silence portage warning -# update with proper path to binaries this crate installs, omit leading / -QA_FLAGS_IGNORED="usr/bin/${PN}" diff --git a/rebuild-manifest.sh b/rebuild-manifest.sh index 081aed0..2cea69c 100755 --- a/rebuild-manifest.sh +++ b/rebuild-manifest.sh @@ -13,11 +13,11 @@ if [[ ! -d "$ebuild_path" ]]; then exit 1 fi -imageName="gentoo-ebuild-manifest-rebuild" +imageName="ghcr.io/jaredallard/overlay:updater" # Build the image if it doesn't already exist in the cache. -if ! docker images -a | grep -qE "^$imageName"; then +if ! docker image inspect "$imageName" >/dev/null; then docker buildx build --load -t "$imageName" . fi -exec docker run --rm -it -v "$(pwd):/host_mnt" "$imageName" bash -ce 'cd "/host_mnt/$1" && ebuild *.ebuild manifest' -- "$ebuild_path" +exec docker run --rm -it -v "$(pwd):/host_mnt" --entrypoint bash "$imageName" -ce 'cd "/host_mnt/$1" && ebuild *.ebuild manifest' -- "$ebuild_path" diff --git a/updater.yml b/updater.yml new file mode 100644 index 0000000..1260a25 --- /dev/null +++ b/updater.yml @@ -0,0 +1,30 @@ +# Configure automatic updates for ebuilds. +app-admin/chezmoi-bin: + resolver: git + options: + url: https://github.com/twpayne/chezmoi +app-admin/1password: + resolver: apt + options: + repository: "deb https://downloads.1password.com/linux/debian/amd64 stable main" + package: 1password +app-arch/7-zip: + resolver: git + options: + url: https://github.com/ip7z/7zip +dev-util/mise: + resolver: git + options: + url: https://github.com/jdx/mise + + # We have to regenerate the ebuild to get new crates and licenses to + # be reflected, so we have to have custom steps. + steps: + - command: git clone https://github.com/jdx/mise . + - original_ebuild: mise.ebuild + - command: pycargoebuild -i mise.ebuild + - ebuild: mise.ebuild +net-im/armcord: + resolver: git + options: + url: https://github.com/ArmCord/ArmCord