From 9e1c74b6881a96f4ca8a229aa390ac5515b7e79e Mon Sep 17 00:00:00 2001 From: Walter Scott Date: Sat, 25 May 2024 11:03:38 -0500 Subject: [PATCH] document and simplify (#7) --- .editorconfig | 4 + .github/workflows/simver.yaml | 63 +-- .github/workflows/wait-on-simver.yaml | 13 + .vscode/simver.code-workspace | 3 + README.md | 140 ++--- calculate.go | 20 +- calculate_test.go | 30 +- cli/zerolog.go | 169 +++++++ cmd/gha-simver/action.yaml | 54 ++ .../main.go | 20 +- cmd/gha-wait-on-simver/action.yaml | 53 ++ cmd/gha-wait-on-simver/main.go | 127 +++++ execution.go | 29 +- execution_test.go | 66 --- gitexec/actions.go | 26 +- gitexec/gh.go | 16 +- gitexec/git.go | 8 +- gitexec/local.go | 12 +- gitexec/tag.go | 10 +- go.mod | 25 +- go.sum | 477 +----------------- local_state.go | 10 +- pr_state.go | 21 +- 23 files changed, 614 insertions(+), 782 deletions(-) create mode 100644 .github/workflows/wait-on-simver.yaml create mode 100644 cli/zerolog.go create mode 100644 cmd/gha-simver/action.yaml rename cmd/{simver_github_actions => gha-simver}/main.go (67%) create mode 100644 cmd/gha-wait-on-simver/action.yaml create mode 100644 cmd/gha-wait-on-simver/main.go diff --git a/.editorconfig b/.editorconfig index 8e09ab2..b1481a6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,3 +9,7 @@ end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true trim_multiple_empty_lines = true + + +[*.yaml] +indent_style = space diff --git a/.github/workflows/simver.yaml b/.github/workflows/simver.yaml index 27a2f21..44b7e05 100644 --- a/.github/workflows/simver.yaml +++ b/.github/workflows/simver.yaml @@ -1,48 +1,15 @@ -{ - name: simver, - concurrency: { group: simver, cancel-in-progress: false }, - permissions: { id-token: write, contents: write, pull-requests: read }, - on: - { - workflow_dispatch: null, - workflow_call: {}, - push: { branches: [main] }, - pull_request: { types: [opened, synchronize, reopened, closed] }, - }, - defaults: { run: { shell: bash } }, - jobs: - { - simver: - { - runs-on: ubuntu-latest, - - steps: - [ - { - name: checkout code, - uses: "actions/checkout@v4", - with: { fetch-depth: 0 }, - }, - { - name: setup golang, - uses: "actions/setup-go@v4", - with: { go-version: 1.21.4 }, - }, - { - name: install simver, - run: "go install github.com/walteh/simver/cmd/simver_github_actions@v0.22.0", - }, - { - name: run simver, - id: simver, - env: - { - SIMVER_READ_ONLY: false, - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}", - }, - run: simver_github_actions, - }, - ], - }, - }, -} +name: simver +permissions: { id-token: write, contents: write, pull-requests: read } +on: + workflow_dispatch: + push: + branches: [main] + pull_request: + types: [opened, synchronize, reopened, closed] +jobs: + simver: + runs-on: ubuntu-latest + steps: + - uses: walteh/simver/cmd/gha-simver@a9f89e2fb17b03b3150c2aed050a68bc85280f02 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/wait-on-simver.yaml b/.github/workflows/wait-on-simver.yaml new file mode 100644 index 0000000..d65209b --- /dev/null +++ b/.github/workflows/wait-on-simver.yaml @@ -0,0 +1,13 @@ +name: wait-on-simver +permissions: { id-token: write, contents: write, pull-requests: read } +on: + workflow_dispatch: + push: + branches: ["*"] +jobs: + wait-on-simver: + runs-on: ubuntu-latest + steps: + - uses: walteh/simver/cmd/gha-wait-on-simver@a9f89e2fb17b03b3150c2aed050a68bc85280f02 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.vscode/simver.code-workspace b/.vscode/simver.code-workspace index 1b83529..9bc94c8 100644 --- a/.vscode/simver.code-workspace +++ b/.vscode/simver.code-workspace @@ -43,5 +43,8 @@ "[dockerfile]": { "editor.defaultFormatter": "foxundermoon.shell-format" }, + "yaml.schemas": { + "https://json.schemastore.org/github-action.json": "file:///Users/dub6ix/Developer/walteh/github/simver/actions/simver.yaml" + }, } } \ No newline at end of file diff --git a/README.md b/README.md index 56368fc..229c75c 100644 --- a/README.md +++ b/README.md @@ -1,109 +1,79 @@ -# simver -simple, pr based, semver git tagging logic +# SimVer - Semantic Versioning Simplified 🔄 +## 🌟 Overview -# definitions +Forget about the headache of manual versioning. SimVer is here to automate and simplify semantic versioning in your Git workflow. By managing version tags directly linked to your commit activities, SimVer ensures a linear, predictable version history with zero manual overhead. Perfect for teams and developers looking for a set-it-and-forget-it solution, SimVer streamlines your development process, allowing you to focus on what truly matters - building great software. - # how can we make sure that a version is reserved - and if it is not reserved we need to bump it +## 🎯 Target Audience +SimVer is the go-to solution for developers and teams who: -## when is mmrt valid? -1. it exists -2. it is higher than the mrlt +- Are exhausted by manual versioning complexities. +- Desire a consistent, traceable version history. +- Need seamless integration with CI/CD tools like GitHub Actions. +## ✨ Features -## the most recent reserved tag (mrrt) +- **Automated Version Tags:** Automatically generates semantic version tags for all commits and pull requests. +- **Clear Versioning Rules:** Simplifies decision-making with straightforward rules for main and side branches. +- **Linear History Dependence:** Ensures all version increments are predictable and orderly. -inside this commits tree, the highest 'vX.Y.Z-reserved' tag is the mrrt. +## 📘 How It Works +### Versioning Logic Simplified -## the most recent live tag (mrlt) +- **Direct Pushes to Main:** Trigger minor version updates automatically. +- **Pull Requests:** + - To Main: Trigger minor updates. + - To Side Branches: Apply patch updates. + - Multiple Concurrent PRs: Ensure unique, sequential versioning without conflicts. +- **Merging:** Versions merge seamlessly, with the target branch adopting the version from the merged branch or PR. -inside this commits tree, the highest 'vX.Y.Z' tag is the mrlt. +### Tagging Made Easy -## the my most recent tag (mmrt) +- **Main Branch:** Receives clean, full release versions. +- **Side Branches and PRs:** Get detailed pre-release tags to avoid confusion and maintain clarity. -inside this commits tree, the highest 'vX.Y.Z-pr.N+base' tag is the mmrt. +### Real-world Examples -## next valid tag (nvt) +- Direct push to `main` changes `v1.0.0` to `v1.1.0`. +- A PR to `main` updates from `v1.0.0` to `v1.1.0`. +- A PR to a side branch updates from `v1.1.0` to `v1.1.1`. +- Handling multiple PRs ensures sequential updates without overlap. -find the latest mrrt or mrlt and increment the patch number (or minor if the base branch is main) +## 🚀 Getting Started -## the my most recent build number (mmrbn) +### Usage -inside this commits tree, the highest '*-pr.N+(this)' is the mmrbn. +Easily integrate SimVer into your GitHub Actions with this setup: -note each of the nvt, mrrt, mrlt, and mmrt are saved as valid semvers, so "X.Y.Z" -the mmrbn is an integer, so "N" +```yaml +name: simver +permissions: { id-token: write, contents: write, pull-requests: read } +on: + workflow_dispatch: + push: + branches: [main] + pull_request: + types: [opened, synchronize, reopened, closed] +jobs: + simver: + runs-on: ubuntu-latest + steps: + - uses: walteh/simver/cmd/gha-simver@v1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +``` ------------- +## ⚠️ Current Limitations & 🛠 Future Fixes -two bugs: -- need to make sure merges do not have build numbers -- need to make sure that build nums are picked up +- **Junk Tags Cleanup:** Upcoming feature to clear temporary tags automatically. +- **Force Push Handling:** We're improving how version recalculations handle force pushes to maintain accurate histories. -# probs to test -1. make sure that a new pr to main does a minor bump -2. make sure that a new pr not to main does a patch bump -3. make sure that a new commit to a pr who has been tagged with a version and was last used for it does a patch bump -1. make sure if reserved is set, but others are not that it does not loop infinitely +## 🤝 Contributing +Contributions are welcome! Fork, modify, and submit a pull request. -# process - -## when to run the workflow -1. for every commit on main -2. for every pr event - -### 1. for each pr event: -1. figure out if head commit is a pr merge, commit, or nothing - - check if the current head has a semver tag - - if it does, then it is a nothing - - check if the commit message contains "(#N)" where N is a number and the pr exists and the head commit is the current commit - - if it is, then it is a pr merge - - if it is not, then it is a normal commit - -#### 1. if nothing: -1. do nothing - -#### 2. if pr merge: -1. find the mrrt, mrlt, and mmrt -2. check if the mmrt is valid -3. if it is, move forward with the mmrt -4. if it is not, use the nvt - - create two new tags on the base commit - - vX.Y.Z-reserved - - vX.Y.Z-pr.N+base -5. create a new tag on the head commit - -#### 3. if a normal commit: -1. find the mrrt and mrlt, calculate the nvt -2. create a new tag (based on nvt) on the head commit - -### 2. for each commit on main: -1. figure out if head is a pr merge or not - - check if the commit message contains "(#N)" where N is a number and the pr exists and the head commit is the current commit - - if it is, then it is a pr merge - - if it is not, then it is a normal commit - -#### 1. if pr merge: -1. find the mrrt, mrlt, and mmrt -2. check if the mmrt is valid -3. if it is, move forward with the mmrt -4. if it is not, use the nvt - - create two new tags on the base commit (for brevity) - get the base commit from the pr - - vX.Y.Z-reserved - - vX.Y.Z-pr.N+base -5. create a new tag on the head commit with no build number or prerelease - -#### 2. if a normal commit: -1. find the mrrt and mrlt, calculate the nvt -2. create a new tag (based on nvt) on the head commit with no build number or prerelease - -when you merge a pr: -- find the mmrt or the pr branch, and we need to start using that for this branch -- the base branch should inherit the mmrt from the pr branch -- so we need to create: - 1. a new "base" tag for the base branch with the mmrt of the pr branch - 2. create a new build tag using the mmrt +## 📜 License +Distributed under the MIT License. See `LICENSE` for more information. diff --git a/calculate.go b/calculate.go index 6795aff..612710d 100644 --- a/calculate.go +++ b/calculate.go @@ -12,13 +12,11 @@ type Calculation struct { MyMostRecentTag MMRT MostRecentLiveTag MRLT MyMostRecentBuild MMRBN - LastSymbolicTag LST PR int NextValidTag NVT - IsMerge bool + IsMerged bool ForcePatch bool Skip bool - IsDirty bool } type CalculationOutput struct { @@ -65,9 +63,7 @@ func (me *Calculation) CalculateNewTagsRaw(ctx context.Context) *CalculationOutp } if me.Skip { - zerolog.Ctx(ctx).Debug(). - Any("calculation", me). - Msg("Skipping calculation") + zerolog.Ctx(ctx).Debug().Any("calculation", me).Msg("Skipping calculation") return out } @@ -95,9 +91,7 @@ func (me *Calculation) CalculateNewTagsRaw(ctx context.Context) *CalculationOutp if mmrt != "" && semver.Compare(mmrt, mrlt) == 0 && me.MyMostRecentBuild != 0 { validMmrt = false nvt = BumpPatch(mmrt) - } - - if !me.IsMerge { + } else if !me.IsMerged { if me.MyMostRecentBuild == 0 { validMmrt = false } else if me.ForcePatch { @@ -109,14 +103,14 @@ func (me *Calculation) CalculateNewTagsRaw(ctx context.Context) *CalculationOutp // if mmrt is invalid, then we need to reserve a new mmrt (which is the same as nvt) if !validMmrt { mmrt = nvt - // pr will be 0 if this is not a and is a push to the root branch - if me.PR != 0 && !me.IsMerge { + // pr will be 0 if this is not merged and is a push to the root branch + if me.PR != 0 && !me.IsMerged { out.RootTags = append(out.RootTags, mmrt+"-reserved") out.BaseTags = append(out.BaseTags, mmrt+fmt.Sprintf("-pr%d+base", me.PR)) } } - if me.IsMerge { + if me.IsMerged { // if !matching { out.MergeTags = append(out.MergeTags, mmrt) // } @@ -135,7 +129,7 @@ func (me *Calculation) CalculateNewTagsRaw(ctx context.Context) *CalculationOutp Str("mrlt", mrlt). Str("nvt", nvt). Str("pr", fmt.Sprintf("%d", me.PR)). - Bool("isMerge", me.IsMerge). + Bool("isMerge", me.IsMerged). Bool("forcePatch", me.ForcePatch). Msg("CalculateNewTagsRaw") diff --git a/calculate_test.go b/calculate_test.go index 776482d..b619157 100644 --- a/calculate_test.go +++ b/calculate_test.go @@ -22,7 +22,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { MyMostRecentBuild: 33, PR: 85, NextValidTag: "v99.99.99", - IsMerge: false, + IsMerged: false, ForcePatch: false, }, output: &simver.CalculationOutput{ @@ -46,7 +46,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { MyMostRecentBuild: 1, PR: 1, NextValidTag: "v3.3.3", - IsMerge: false, + IsMerged: false, ForcePatch: false, }, @@ -71,7 +71,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { MyMostRecentBuild: 33, PR: 1, NextValidTag: "v1.2.6", - IsMerge: false, + IsMerged: false, ForcePatch: false, }, @@ -91,7 +91,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { MyMostRecentBuild: 33, PR: 1, NextValidTag: "v1.2.6", - IsMerge: false, + IsMerged: false, ForcePatch: false, }, @@ -110,7 +110,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { MyMostRecentBuild: 33, PR: 1, NextValidTag: "v1.2.6", - IsMerge: true, + IsMerged: true, ForcePatch: false, }, output: &simver.CalculationOutput{ @@ -128,7 +128,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { MyMostRecentBuild: 33, PR: 1, NextValidTag: "v1.2.6", - IsMerge: false, + IsMerged: false, ForcePatch: true, }, output: &simver.CalculationOutput{ @@ -146,7 +146,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { MyMostRecentBuild: 33, PR: 1, NextValidTag: "v1.2.6", - IsMerge: true, + IsMerged: true, ForcePatch: true, }, output: &simver.CalculationOutput{ @@ -164,7 +164,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { MyMostRecentBuild: 33, PR: 85, NextValidTag: "v99.99.99", - IsMerge: false, + IsMerged: false, ForcePatch: true, }, output: &simver.CalculationOutput{ @@ -179,7 +179,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { name: "expired mmrt", calculation: &simver.Calculation{ ForcePatch: false, - IsMerge: false, + IsMerged: false, MostRecentLiveTag: "v0.17.2", MyMostRecentBuild: 1.000000, MyMostRecentTag: "v0.17.3", @@ -197,7 +197,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { name: "when merging a branch that already is tagged correctly, bump by patch", calculation: &simver.Calculation{ ForcePatch: false, - IsMerge: true, + IsMerged: true, MostRecentLiveTag: "v0.3.0", MyMostRecentBuild: 1.000000, MyMostRecentTag: "v0.3.0", @@ -215,7 +215,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { name: "when merging a branch that already is tagged correctly, bump by patch (ignoring force patch)", calculation: &simver.Calculation{ ForcePatch: true, - IsMerge: true, + IsMerged: true, MostRecentLiveTag: "v0.2.0", MyMostRecentBuild: 1.000000, MyMostRecentTag: "v0.2.0", @@ -233,7 +233,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { name: "when merging a branch that already is tagged correctly on first build, bump to next", calculation: &simver.Calculation{ ForcePatch: true, - IsMerge: true, + IsMerged: true, MostRecentLiveTag: "v0.2.0", MyMostRecentBuild: 0, MyMostRecentTag: "v0.2.0", @@ -253,7 +253,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { calculation: &simver.Calculation{ ForcePatch: true, - IsMerge: false, + IsMerged: false, MostRecentLiveTag: "v0.4.1", MyMostRecentBuild: 0.000000, MyMostRecentTag: "v0.4.1", @@ -272,7 +272,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { name: "skip if flagged", calculation: &simver.Calculation{ ForcePatch: false, - IsMerge: true, + IsMerged: true, MostRecentLiveTag: "v0.4.2", MyMostRecentBuild: 3.000000, MyMostRecentTag: "v0.4.2", @@ -291,7 +291,7 @@ func TestNewCalculationAndCalculateNewTags(t *testing.T) { name: "if is merge, build is 0, skip is false - tag mmrt", calculation: &simver.Calculation{ ForcePatch: false, - IsMerge: true, + IsMerged: true, MostRecentLiveTag: "v0.18.0", MyMostRecentBuild: 0.000000, MyMostRecentTag: "v0.18.1", diff --git a/cli/zerolog.go b/cli/zerolog.go new file mode 100644 index 0000000..8668464 --- /dev/null +++ b/cli/zerolog.go @@ -0,0 +1,169 @@ +package cli + +import ( + "context" + "encoding/json" + "fmt" + "os" + "runtime" + "runtime/debug" + "strings" + "time" + + "github.com/rs/zerolog" + + "github.com/fatih/color" + "github.com/k0kubun/pp/v3" +) + +var currentGoPackage string + +func init() { + zerolog.TimeFieldFormat = time.RFC3339Nano + zerolog.CallerMarshalFunc = ZeroLogCallerMarshalFunc + + inf, ok := debug.ReadBuildInfo() + if ok { + currentGoPackage = inf.Main.Path + } +} + +type DefaultLoggerOpts struct { + Level zerolog.Level + CommandName string +} + +func ApplyDefaultLoggerContext(ctx context.Context, opts *DefaultLoggerOpts) context.Context { + ctx = DefaultLogger(opts).WithContext(ctx) + + return ctx +} + +func DefaultLogger(opts *DefaultLoggerOpts) *zerolog.Logger { + + consoleOutput := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.StampMicro, NoColor: false} + + consoleOutput.FormatMessage = func(i interface{}) string { + if i == nil { + return "nil" + } + + return color.New(color.FgHiWhite).Sprintf("%s", i.(string)) + } + + pretty := pp.New() + + pretty.SetColorScheme(pp.ColorScheme{}) + prettyerr := pp.New() + prettyerr.SetExportedOnly(false) + + consoleOutput.FormatFieldName = func(i interface{}) string { + return color.New(color.Faint).Sprintf("%s", i) + color.New(color.FgHiGreen).Sprint("=") + } + + consoleOutput.FormatFieldValue = func(i interface{}) string { + + switch i := i.(type) { + case error: + return prettyerr.Sprint(i) + case []byte: + var g interface{} + err := json.Unmarshal(i, &g) + if err != nil { + return pretty.Sprint(string(i)) + } else { + return fmt.Sprintf("[unmarshaled json of byte array] %s", pretty.Sprint(g)) + } + case string: + return color.New(color.Bold).Sprint(i) + } + + return pretty.Sprint(i) + } + + consoleOutput.FormatLevel = func(i interface{}) string { + switch i := i.(string); i { + case zerolog.LevelDebugValue: + return color.New(color.Bold, color.FgHiBlue).Sprint("debug") + case zerolog.LevelInfoValue: + return color.New(color.Bold, color.FgHiGreen).Sprint("info ") + case zerolog.LevelWarnValue: + return color.New(color.Bold, color.FgHiYellow).Sprint("warn ") + case zerolog.LevelTraceValue: + return color.New(color.Bold, color.FgHiCyan).Sprint("trace") + case zerolog.LevelErrorValue: + return color.New(color.Bold, color.FgHiRed).Sprint("error") + case zerolog.LevelFatalValue: + return color.New(color.Bold, color.FgHiRed).Sprint("fatal") + default: + return color.New(color.Bold, color.FgHiRed).Sprint(i) + } + } + + consoleOutput.FormatCaller = func(i interface{}) string { + return fmt.Sprintf("%s", i) + color.New(color.FgHiGreen).Sprint(" >") + } + + consoleOutput.FormatTimestamp = func(i interface{}) string { + return color.New(color.Faint).Sprintf("%s", time.Now().UTC().Format("15:04:05.000000")) + } + + consoleOutput.PartsOrder = []string{"level", "time", "caller", "message"} + + l := zerolog.New(consoleOutput).With().Caller().Timestamp() + + if opts.CommandName != "" { + l = l.Str("cmd", opts.CommandName) + } + + out := l.Logger().Level(opts.Level) + + return &out +} + +func ZeroLogCallerMarshalFunc(pc uintptr, file string, line int) string { + pkg, _ := GetPackageAndFuncFromFuncName(runtime.FuncForPC(pc).Name()) + + return FormatCaller(pkg, file, line) +} + +func GetPackageAndFuncFromFuncName(pc string) (pkg, function string) { + funcName := pc + lastSlash := strings.LastIndexByte(funcName, '/') + if lastSlash < 0 { + lastSlash = 0 + } + + firstDot := strings.IndexByte(funcName[lastSlash:], '.') + lastSlash + + pkg = funcName[:firstDot] + fname := funcName[firstDot+1:] + + if strings.Contains(pkg, ".(") { + splt := strings.Split(pkg, ".(") + pkg = splt[0] + fname = "(" + splt[1] + "." + fname + } + + pkg = strings.TrimPrefix(pkg, currentGoPackage+"/") + + return pkg, fname +} + +func FormatCaller(pkg, path string, number int) string { + // pkg = filepath.Base(pkg) + path = color.New(color.Bold).Sprint(FileNameOfPath(path)) + num := color.New(color.FgHiRed, color.Bold).Sprintf("%d", number) + sep := color.New(color.Faint).Sprint(":") + + return fmt.Sprintf("%s%s%s%s%s", pkg, sep, path, sep, num) +} + +func FileNameOfPath(path string) string { + tot := strings.Split(path, "/") + if len(tot) > 1 { + return tot[len(tot)-1] + } + + return path +} diff --git a/cmd/gha-simver/action.yaml b/cmd/gha-simver/action.yaml new file mode 100644 index 0000000..60f9ff3 --- /dev/null +++ b/cmd/gha-simver/action.yaml @@ -0,0 +1,54 @@ +name: simver +description: "calculates new tag and pushes it to the repository" +inputs: { GITHUB_TOKEN: { description: "GitHub token", required: true } } +runs: + using: "composite" + steps: + + - name: checkout source code + uses: actions/checkout@v4 + with: + path: __source__ + fetch-depth: 0 + + - name: get current action ref + id: get-action-ref + shell: bash + # we need to trim *walteh/simver prefix the /cmd/gha-simver suffix + run: "echo '${{ github.action_path }}' | sed -n 's/.*walteh\\/simver\\///p' | sed -n 's/\\/cmd\\/gha-simver//p' | xargs -I {} echo 'SIMVER_GITHUB_ACTION_REF={}' >> $GITHUB_ENV" + + - name: checkout simver code + uses: actions/checkout@v4 + with: + fetch-depth: 1 + repository: walteh/simver + ref: ${{ env.SIMVER_GITHUB_ACTION_REF }} + path: __simver__ + + - name: get current go version from go.mod + id: go-version + shell: bash + working-directory: __simver__ + run: 'cat go.mod | grep ''go '' | awk ''{print $2}'' | xargs -I {} echo "GO_VERSION={}" >> $GITHUB_ENV' + + - name: setup golang + uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + + - name: download dependencies + shell: bash + working-directory: __simver__ + run: "go mod download" + + - name: install simver + shell: bash + working-directory: __simver__ + run: "go install ./cmd/gha-simver" + + - name: run simver + shell: bash + working-directory: __source__ + env: + GITHUB_TOKEN: ${{ inputs.GITHUB_TOKEN }} + run: "gha-simver --read-only=false --path=." diff --git a/cmd/simver_github_actions/main.go b/cmd/gha-simver/main.go similarity index 67% rename from cmd/simver_github_actions/main.go rename to cmd/gha-simver/main.go index ece0886..d461ded 100644 --- a/cmd/simver_github_actions/main.go +++ b/cmd/gha-simver/main.go @@ -2,25 +2,31 @@ package main import ( "context" - "fmt" + "flag" "os" "github.com/rs/zerolog" "github.com/walteh/simver" + "github.com/walteh/simver/cli" "github.com/walteh/simver/gitexec" - szl "github.com/walteh/snake/zerolog" - "github.com/walteh/terrors" ) +var path = flag.String("path", ".", "path to the repository") +var readOnly = flag.Bool("read-only", true, "read-only mode") + +func init() { + flag.Parse() +} + func main() { ctx := context.Background() - ctx = szl.NewVerboseConsoleLogger().WithContext(ctx) + ctx = cli.ApplyDefaultLoggerContext(ctx, &cli.DefaultLoggerOpts{}) zerolog.SetGlobalLevel(zerolog.DebugLevel) - _, tagreader, tagwriter, _, prr, err := gitexec.BuildGitHubActionsProviders() + _, tagreader, tagwriter, _, prr, err := gitexec.BuildGitHubActionsProviders(*path, *readOnly) if err != nil { zerolog.Ctx(ctx).Error().Err(err).Msg("error creating provider") os.Exit(1) @@ -29,7 +35,7 @@ func main() { ee, _, err := simver.LoadExecutionFromPR(ctx, tagreader, prr) if err != nil { zerolog.Ctx(ctx).Error().Err(err).Msgf("error loading execution") - fmt.Println(terrors.FormatErrorCaller(err)) + // fmt.Println(terrors.FormatErrorCaller(err)) os.Exit(1) } @@ -40,7 +46,7 @@ func main() { err = tagwriter.CreateTags(ctx, tags...) if err != nil { zerolog.Ctx(ctx).Error().Err(err).Msgf("error creating tag: %v", err) - fmt.Println(terrors.FormatErrorCaller(err)) + // fmt.Println(terrors.FormatErrorCaller(err)) os.Exit(1) } diff --git a/cmd/gha-wait-on-simver/action.yaml b/cmd/gha-wait-on-simver/action.yaml new file mode 100644 index 0000000..4850d22 --- /dev/null +++ b/cmd/gha-wait-on-simver/action.yaml @@ -0,0 +1,53 @@ +name: wait-on-simver +description: "waits for simver, running in a seperate workflow or action, to calculate new tag" +inputs: { GITHUB_TOKEN: { description: "GitHub token", required: true } } +runs: + using: "composite" + steps: + + - name: checkout source code + uses: actions/checkout@v4 + with: + path: __source__ + fetch-depth: 0 + + - name: get current action ref + id: get-action-ref + shell: bash + run: "echo '${{ github.action_path }}' | sed -n 's/.*walteh\\/simver\\///p' | sed -n 's/\\/cmd\\/gha-wait-on-simver//p' | xargs -I {} echo 'SIMVER_GITHUB_ACTION_REF={}' >> $GITHUB_ENV" + + - name: checkout simver code + uses: actions/checkout@v4 + with: + fetch-depth: 1 + repository: walteh/simver + ref: ${{ env.SIMVER_GITHUB_ACTION_REF }} + path: __simver__ + + - name: get current go version from go.mod + id: go-version + shell: bash + working-directory: __simver__ + run: 'cat go.mod | grep ''go '' | awk ''{print $2}'' | xargs -I {} echo "GO_VERSION={}" >> $GITHUB_ENV' + + - name: setup golang + uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + + - name: download dependencies + shell: bash + working-directory: __simver__ + run: "go mod download" + + - name: install simver + shell: bash + working-directory: __simver__ + run: "go install ./cmd/gha-wait-on-simver" + + - name: run simver + shell: bash + working-directory: __source__ + env: + GITHUB_TOKEN: ${{ inputs.GITHUB_TOKEN }} + run: "gha-wait-on-simver --read-only=false --path=." diff --git a/cmd/gha-wait-on-simver/main.go b/cmd/gha-wait-on-simver/main.go new file mode 100644 index 0000000..da6e74a --- /dev/null +++ b/cmd/gha-wait-on-simver/main.go @@ -0,0 +1,127 @@ +package main + +import ( + "context" + "flag" + "os" + "time" + + "github.com/rs/zerolog" + "github.com/walteh/simver" + "github.com/walteh/simver/cli" + "github.com/walteh/simver/gitexec" +) + +var path = flag.String("path", ".", "path to the repository") +var readOnly = flag.Bool("read-only", true, "read-only mode") + +var wait = flag.String("wait", "2m", "time to wait for tag") +var interval = flag.String("interval", "5s", "interval to check for tag") + +func init() { + flag.Parse() +} + +func check(ctx context.Context, gp simver.GitProvider, tr simver.TagReader, tw simver.TagWriter, head string) (*simver.Tag, bool, error) { + if head == "" { + return nil, false, nil + } + + _, err := tw.FetchTags(ctx) + if err != nil { + return nil, false, err + } + + tags, err := tr.TagsFromCommit(ctx, head) + if err != nil { + return nil, false, err + } + + if len(tags) == 0 { + return nil, false, nil + + } + + return &tags[0], true, nil +} + +func main() { + + // get commit to wait on + ctx := context.Background() + + ctx = cli.ApplyDefaultLoggerContext(ctx, &cli.DefaultLoggerOpts{ + CommandName: "gha-wait-on-simver", + }) + + eventName := os.Getenv("GITHUB_EVENT_NAME") + if eventName != "push" { + zerolog.Ctx(ctx).Error().Str("event_name", eventName).Msg("not a push event - this action is only useful for push events") + os.Exit(1) + } + + wait, err := time.ParseDuration(*wait) + if err != nil { + panic(err) + } + + start := time.Now() + + end := start.Add(wait) + + interval, err := time.ParseDuration(*interval) + if err != nil { + panic(err) + } + + zerolog.SetGlobalLevel(zerolog.DebugLevel) + + ctx, can := context.WithTimeout(ctx, wait) + + defer can() + + git, tr, tw, _, _, err := gitexec.BuildGitHubActionsProviders(*path, *readOnly) + if err != nil { + zerolog.Ctx(ctx).Error().Err(err).Msg("error creating provider") + os.Exit(1) + } + + head, err := git.GetHeadRef(ctx) + if err != nil { + zerolog.Ctx(ctx).Error().Err(err).Msg("error getting head ref") + os.Exit(1) + } + + ctx = zerolog.Ctx(ctx).With().Str("head", head).Logger().WithContext(ctx) + + zerolog.Ctx(ctx).Info().Msg("waiting for tag on head commit") + + for { + + select { + case <-ctx.Done(): + { + zerolog.Ctx(ctx).Error().Err(err).Msg("timeout waiting for tag") + os.Exit(1) + } + default: + { + zerolog.Ctx(ctx).Info().Msg("checking for commit for commit") + tg, ok, err := check(ctx, git, tr, tw, head) + if err != nil { + zerolog.Ctx(ctx).Error().Err(err).Msg("error checking for tag") + panic(err) + } + + if ok { + zerolog.Ctx(ctx).Info().Str("name", tg.Name).Msg("tag found") + os.Exit(0) + } + + zerolog.Ctx(ctx).Info().Dur("remaining", time.Until(end)).Dur("interval", interval).Msg("tag not found, waiting") + + time.Sleep(interval) + } + } + } +} diff --git a/execution.go b/execution.go index 6ceab64..11b4dc0 100644 --- a/execution.go +++ b/execution.go @@ -22,8 +22,6 @@ type Execution interface { BaseBranchTags() Tags RootBranchTags() Tags ProvideRefs() RefProvider - IsDirty() bool - IsLocal() bool } const baseTag = "v0.1.0" @@ -40,8 +38,7 @@ func Calculate(ctx context.Context, ex Execution) *Calculation { mmrbn := MyMostRecentBuildNumber(ex) return &Calculation{ - IsDirty: ex.IsDirty(), - IsMerge: ex.IsMerge(), + IsMerged: ex.IsMerge(), MostRecentLiveTag: mrlt, ForcePatch: ForcePatch(ctx, ex, mmrt), Skip: Skip(ctx, ex, mmrt), @@ -49,7 +46,6 @@ func Calculate(ctx context.Context, ex Execution) *Calculation { MyMostRecentBuild: mmrbn, PR: ex.PR(), NextValidTag: GetNextValidTag(ctx, ex.IsTargetingRoot(), maxlr), - LastSymbolicTag: LST(LastSymbolicTag(ctx, ex, mmrt, mmrbn)), } } @@ -264,26 +260,3 @@ func GetNextValidTag(ctx context.Context, minor bool, maxt MAXLR) NVT { return NVT(fmt.Sprintf("%s.%d.%d", semver.Major(max), minornum, patchnum)) } - -func LastSymbolicTag(ctx context.Context, ex Execution, mmrt MMRT, bn MMRBN) string { - - lt := string(mmrt) - - lt = semver.Canonical(lt) - - if ex.IsLocal() { - lt += "-local" - } else { - lt += fmt.Sprintf("-pr%d", ex.PR()) - } - - lt += fmt.Sprintf("+%d", bn) - - if ex.IsDirty() { - lt += ".dirty" - } else { - lt += ".ahead" - } - - return lt -} diff --git a/execution_test.go b/execution_test.go index 6b6236e..2468e65 100644 --- a/execution_test.go +++ b/execution_test.go @@ -607,69 +607,3 @@ func TestTagString_BumpPatch(t *testing.T) { }) } } - -func TestAssumedLastFullDecoratedTag(t *testing.T) { - testCases := []struct { - name string - ctx context.Context - pr int - dirty bool - local bool - mmrt simver.MMRT - bn simver.MMRBN - expected string - }{ - { - name: "Local Execution", - ctx: context.Background(), - pr: 0, - dirty: false, - local: true, - mmrt: "v1.2.3", - bn: 100, - expected: "v1.2.3-local+100.ahead", - }, - { - name: "PR Execution", - ctx: context.Background(), - pr: 42, - dirty: false, - local: false, - mmrt: "v1.2.3", - bn: 100, - expected: "v1.2.3-pr42+100.ahead", - }, - { - name: "Dirty Execution", - ctx: context.Background(), - pr: 0, - dirty: true, - local: false, - mmrt: "v1.2.3", - bn: 100, - expected: "v1.2.3-pr0+100.dirty", - }, - { - name: "Clean Execution", - ctx: context.Background(), - pr: 0, - dirty: false, - local: false, - mmrt: "v1.2.3", - bn: 100, - expected: "v1.2.3-pr0+100.ahead", - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - mockExec := new(mockery.MockExecution_simver) - mockExec.EXPECT().IsDirty().Return(tc.dirty) - mockExec.EXPECT().IsLocal().Return(tc.local) - mockExec.EXPECT().PR().Return(tc.pr) - - result := simver.LastSymbolicTag(tc.ctx, mockExec, tc.mmrt, tc.bn) - assert.Equal(t, tc.expected, result) - }) - } -} diff --git a/gitexec/actions.go b/gitexec/actions.go index 50dbd14..2b9856c 100644 --- a/gitexec/actions.go +++ b/gitexec/actions.go @@ -6,15 +6,13 @@ import ( "strconv" "strings" - "github.com/go-faster/errors" "github.com/walteh/simver" + "gitlab.com/tozd/go/errors" ) -func BuildGitHubActionsProviders() (simver.GitProvider, simver.TagReader, simver.TagWriter, simver.PRProvider, simver.PRResolver, error) { +func BuildGitHubActionsProviders(path string, readOnly bool) (simver.GitProvider, simver.TagReader, simver.TagWriter, simver.PRProvider, simver.PRResolver, error) { token := os.Getenv("GITHUB_TOKEN") - repoPath := os.Getenv("GITHUB_WORKSPACE") - readOnly := os.Getenv("SIMVER_READ_ONLY") org := os.Getenv("GITHUB_REPOSITORY_OWNER") repo := os.Getenv("GITHUB_REPOSITORY") @@ -22,20 +20,20 @@ func BuildGitHubActionsProviders() (simver.GitProvider, simver.TagReader, simver repo = strings.TrimPrefix(repo, org+"/") c := &GitProviderOpts{ - RepoPath: repoPath, + RepoPath: path, Token: token, User: "github-actions[bot]", Email: "41898282+github-actions[bot]@users.noreply.github.com", TokenEnvName: "GITHUB_TOKEN", GitExecutable: "git", - ReadOnly: readOnly == "true" || readOnly == "1", + ReadOnly: readOnly, Org: org, Repo: repo, } pr := &GHProvierOpts{ GitHubToken: token, - RepoPath: repoPath, + RepoPath: path, GHExecutable: "gh", Org: org, Repo: repo, @@ -43,17 +41,17 @@ func BuildGitHubActionsProviders() (simver.GitProvider, simver.TagReader, simver git, err := NewGitProvider(c) if err != nil { - return nil, nil, nil, nil, nil, errors.Wrap(err, "error creating git provider") + return nil, nil, nil, nil, nil, errors.Errorf("creating git provider: %w", err) } gh, err := NewGHProvider(pr) if err != nil { - return nil, nil, nil, nil, nil, errors.Wrap(err, "error creating gh provider") + return nil, nil, nil, nil, nil, errors.Errorf("creating gh provider: %w", err) } gha, err := WrapGitProviderInGithubActions(git) if err != nil { - return nil, nil, nil, nil, nil, errors.Wrap(err, "error creating gh provider") + return nil, nil, nil, nil, nil, errors.Errorf("creating gh provider: %w", err) } return gha, git, git, gh, &GitHubActionsPullRequestResolver{gh, git}, nil @@ -76,12 +74,12 @@ func (p *GitHubActionsPullRequestResolver) CurrentPR(ctx context.Context) (*simv n, err := strconv.Atoi(num) if err != nil { - return nil, errors.Wrap(err, "error converting PR number to int") + return nil, errors.Errorf("converting PR number to int: %w", err) } pr, exists, err := p.gh.PRDetailsByPRNumber(ctx, n) if err != nil { - return nil, errors.Wrap(err, "error getting PR details by PR number") + return nil, errors.Errorf("getting PR details by PR number: %w", err) } if !exists { @@ -101,7 +99,7 @@ func (p *GitHubActionsPullRequestResolver) CurrentPR(ctx context.Context) (*simv pr, exists, err := p.gh.PRDetailsByCommit(ctx, sha) if err != nil { - return nil, errors.Wrap(err, "error getting PR details by commit") + return nil, errors.Errorf("getting PR details by commit: %w", err) } if exists { @@ -117,7 +115,7 @@ func (p *GitHubActionsPullRequestResolver) CurrentPR(ctx context.Context) (*simv // get the parent commit parent, err := p.git.CommitFromRef(ctx, "HEAD^") if err != nil { - return nil, errors.Wrap(err, "error getting parent commit") + return nil, errors.Errorf("getting parent commit: %w", err) } return simver.NewPushSimulatedPRDetails(parent, sha, branch), nil diff --git a/gitexec/gh.go b/gitexec/gh.go index eefba90..24b4f81 100644 --- a/gitexec/gh.go +++ b/gitexec/gh.go @@ -7,9 +7,9 @@ import ( "os" "os/exec" - "github.com/go-faster/errors" "github.com/rs/zerolog" "github.com/walteh/simver" + "gitlab.com/tozd/go/errors" ) var _ simver.PRProvider = (*ghProvider)(nil) @@ -166,7 +166,7 @@ func (p *ghProvider) PRDetailsByPRNumber(ctx context.Context, prnum int) (*simve cmd := p.gh(ctx, "pr", "view", fmt.Sprintf("%d", prnum), "--json", githubPRDetailsCliQuery) out, err := cmd.Output() if err != nil { - return nil, false, errors.Wrap(err, "gh pr view") + return nil, false, errors.Errorf("gh pr view: %w", err) } byt := append([]byte("["), out...) @@ -184,7 +184,7 @@ func (p *ghProvider) PRDetailsByBranch(ctx context.Context, branch string) (*sim cmd := p.gh(ctx, "pr", "list", "--state", "all", "--head", branch, "--json", githubPRDetailsCliQuery) out, err := cmd.Output() if err != nil { - return nil, false, errors.Wrap(err, "gh pr list") + return nil, false, errors.Errorf("gh pr list: %w", err) } return p.getRelevantPR(ctx, out) @@ -206,7 +206,7 @@ func (p *ghProvider) getBaseCommit(ctx context.Context, dets *simver.PRDetails) cmd := p.gh(ctx, "api", "-H", "Accept: application/vnd.github+json", fmt.Sprintf("/repos/%s/%s/git/commits/%s", p.Org, p.Repo, cmt)) out, err := cmd.Output() if err != nil { - return "", errors.Wrap(err, "gh api") + return "", errors.Errorf("gh api: %w", err) } var dat struct { @@ -217,7 +217,7 @@ func (p *ghProvider) getBaseCommit(ctx context.Context, dets *simver.PRDetails) err = json.Unmarshal(out, &dat) if err != nil { - return "", errors.Wrap(err, "json unmarshal") + return "", errors.Errorf("json unmarshal: %w", err) } if len(dat.Parents) < 1 { @@ -233,7 +233,7 @@ func (p *ghProvider) getRootCommit(ctx context.Context) (string, error) { cmd := p.gh(ctx, "api", "-H", "Accept: application/vnd.github+json", fmt.Sprintf("/repos/%s/%s/git/ref/heads/main", p.Org, p.Repo)) out, err := cmd.Output() if err != nil { - return "", errors.Wrap(err, "gh api") + return "", errors.Errorf("gh api: %w", err) } var dat struct { @@ -244,7 +244,7 @@ func (p *ghProvider) getRootCommit(ctx context.Context) (string, error) { err = json.Unmarshal(out, &dat) if err != nil { - return "", errors.Wrap(err, "json unmarshal") + return "", errors.Errorf("json unmarshal: %w", err) } if dat.Object.Sha == "" { @@ -265,7 +265,7 @@ func (p *ghProvider) PRDetailsByCommit(ctx context.Context, commitHash string) ( cmd := p.gh(ctx, "pr", "list", "--search", commitHash, "--state", "all", "--json", githubPRDetailsCliQuery) out, err := cmd.Output() if err != nil { - return nil, false, errors.Wrap(err, "gh pr list") + return nil, false, errors.Errorf("gh pr list: %w", err) } return p.getRelevantPR(ctx, out) diff --git a/gitexec/git.go b/gitexec/git.go index 1178143..4c0a5d9 100644 --- a/gitexec/git.go +++ b/gitexec/git.go @@ -6,9 +6,9 @@ import ( "os/exec" "strings" - "github.com/go-faster/errors" "github.com/rs/zerolog" "github.com/walteh/simver" + "gitlab.com/tozd/go/errors" ) var ( @@ -145,7 +145,7 @@ func (p *gitProvider) Branch(ctx context.Context) (string, error) { cmd := p.git(ctx, "branch", "--contains", "HEAD") out, err := cmd.Output() if err != nil { - return "", errors.Wrap(err, "git branch --contains HEAD") + return "", errors.Errorf("git branch --contains HEAD: %w", err) } lines := strings.Split(string(out), "\n") res := "" @@ -173,7 +173,7 @@ func (p *gitProvider) GetHeadRef(ctx context.Context) (string, error) { cmd := p.git(ctx, "rev-parse", "HEAD") out, err := cmd.Output() if err != nil { - return "", errors.Wrap(err, "git rev-parse HEAD") + return "", errors.Errorf("git rev-parse HEAD: %w", err) } res := strings.TrimSpace(string(out)) @@ -190,7 +190,7 @@ func (p *gitProvider) Dirty(ctx context.Context) (bool, error) { cmd := p.git(ctx, "diff", "HEAD") out, err := cmd.Output() if err != nil { - return false, errors.Wrap(err, "git status --porcelain") + return false, errors.Errorf("git status --porcelain: %w", err) } res := strings.TrimSpace(string(out)) diff --git a/gitexec/local.go b/gitexec/local.go index e92704e..5b4236a 100644 --- a/gitexec/local.go +++ b/gitexec/local.go @@ -4,21 +4,21 @@ import ( "context" "strings" - "github.com/go-faster/errors" "github.com/spf13/afero" "github.com/walteh/simver" + "gitlab.com/tozd/go/errors" ) func BuildLocalProviders(fls afero.Fs) (simver.GitProvider, simver.TagReader, simver.TagWriter, simver.PRResolver, error) { repoData, err := fls.Open(".git/config") if err != nil { - return nil, nil, nil, nil, errors.Wrap(err, "error opening /.git/config") + return nil, nil, nil, nil, errors.Errorf("opening /.git/config: %w", err) } repoConfig, err := afero.ReadAll(repoData) if err != nil { - return nil, nil, nil, nil, errors.Wrap(err, "error reading /.git/config") + return nil, nil, nil, nil, errors.Errorf("reading /.git/config: %w", err) } // split the config file into lines @@ -65,7 +65,7 @@ func BuildLocalProviders(fls afero.Fs) (simver.GitProvider, simver.TagReader, si if bp, ok := fls.(*afero.BasePathFs); ok { path, err = bp.RealPath("/") if err != nil { - return nil, nil, nil, nil, errors.Wrap(err, "error getting real path") + return nil, nil, nil, nil, errors.Errorf("getting real path: %w", err) } } else { path = "." @@ -85,7 +85,7 @@ func BuildLocalProviders(fls afero.Fs) (simver.GitProvider, simver.TagReader, si git, err := NewGitProvider(c) if err != nil { - return nil, nil, nil, nil, errors.Wrap(err, "error creating git provider") + return nil, nil, nil, nil, errors.Errorf("creating git provider: %w", err) } return git, git, git, &LocalPullRequestResolver{}, nil @@ -99,7 +99,7 @@ func (p *LocalPullRequestResolver) CurrentPR(ctx context.Context) (*simver.PRDet cmt, err := p.git.GetHeadRef(ctx) if err != nil { - return nil, errors.Wrap(err, "error getting head ref") + return nil, errors.Errorf("getting head ref: %w", err) } return &simver.PRDetails{ diff --git a/gitexec/tag.go b/gitexec/tag.go index 219ec5b..33010e4 100644 --- a/gitexec/tag.go +++ b/gitexec/tag.go @@ -7,9 +7,9 @@ import ( "strings" "time" - "github.com/go-faster/errors" "github.com/rs/zerolog" "github.com/walteh/simver" + "gitlab.com/tozd/go/errors" ) var ( @@ -87,7 +87,7 @@ func (p *gitProvider) TagsFromBranch(ctx context.Context, branch string) (simver err = json.Unmarshal([]byte(line), &dat) if err != nil { - return nil, errors.Wrap(err, "json unmarshal") + return nil, errors.Errorf("json unmarshal: %w", err) } if dat.Type != "commit" { @@ -128,7 +128,7 @@ func (p *gitProvider) FetchTags(ctx context.Context) (simver.Tags, error) { cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { - return nil, errors.Wrap(err, "git fetch --tags") + return nil, errors.Errorf("git fetch --tags: %w", err) } zerolog.Ctx(ctx).Debug().Msg("printing tags") @@ -137,7 +137,7 @@ func (p *gitProvider) FetchTags(ctx context.Context) (simver.Tags, error) { cmd = p.git(ctx, "show-ref", "--tags") out, err := cmd.Output() if err != nil { - return nil, errors.Wrap(err, "git show-ref --tags") + return nil, errors.Errorf("git show-ref --tags: %w", err) } lines := strings.Split(string(out), "\n") @@ -185,7 +185,7 @@ func (p *gitProvider) CreateTags(ctx context.Context, tag ...simver.Tag) error { cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { - return errors.Wrap(err, "git push origin --tags") + return errors.Errorf("git push origin --tags: %w", err) } zerolog.Ctx(ctx).Debug().Msg("tag created") diff --git a/go.mod b/go.mod index a73a38d..fbca1f3 100644 --- a/go.mod +++ b/go.mod @@ -1,26 +1,25 @@ module github.com/walteh/simver -go 1.21.4 +go 1.22.3 require ( - github.com/go-faster/errors v0.7.0 - github.com/rs/zerolog v1.31.0 - github.com/spf13/afero v1.10.0 - github.com/stretchr/testify v1.8.4 - github.com/walteh/snake v0.25.0 - github.com/walteh/terrors v0.2.6 - golang.org/x/mod v0.14.0 + github.com/fatih/color v1.17.0 + github.com/k0kubun/pp/v3 v3.2.0 + github.com/rs/zerolog v1.33.0 + github.com/spf13/afero v1.11.0 + github.com/stretchr/testify v1.9.0 + gitlab.com/tozd/go/errors v0.8.1 + golang.org/x/mod v0.17.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fatih/color v1.16.0 // indirect - github.com/k0kubun/pp/v3 v3.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/text v0.13.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 1b586a6..4b774e1 100644 --- a/go.sum +++ b/go.sum @@ -1,481 +1,48 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/go-faster/errors v0.7.0 h1:UnD/xusnfUgtEYkgRZohqL2AfmPTwv13NAJwwFFaNYc= -github.com/go-faster/errors v0.7.0/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/k0kubun/pp/v3 v3.2.0 h1:h33hNTZ9nVFNP3u2Fsgz8JXiF5JINoZfFq4SvKJwNcs= github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 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.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= 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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= -github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -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/walteh/snake v0.25.0 h1:NdrmTpgclunv5uOUSsU3oyxXZ+LVgKRIz69syhWLwag= -github.com/walteh/snake v0.25.0/go.mod h1:2CyOw00AbrujT3hhI0CPQWQnYP/9NF9s9y3HmTQtDDs= -github.com/walteh/terrors v0.2.6 h1:bluJszqQIEVldxU4Ur9GaOLEaVKLdWwuFW8dwKRzHhw= -github.com/walteh/terrors v0.2.6/go.mod h1:txmqqCK7EbLSUFRXzsRDR8b9oDMX6aywzRSGKiQOdEQ= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -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/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +gitlab.com/tozd/go/errors v0.8.1 h1:RfylffRAsl3PbDdHNUBEkTleTCiL/RIT+Ef8p0HRNCI= +gitlab.com/tozd/go/errors v0.8.1/go.mod h1:PvIdUMLpPwxr+KEBxghQaCMydHXGYdJQn/PhdMqYREY= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/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.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -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/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +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/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/local_state.go b/local_state.go index 63699f8..c254351 100644 --- a/local_state.go +++ b/local_state.go @@ -3,7 +3,7 @@ package simver import ( "context" - "github.com/go-faster/errors" + "gitlab.com/tozd/go/errors" ) var _ Execution = &LocalProjectState{} @@ -19,22 +19,22 @@ func NewLocalProjectState(ctx context.Context, gp GitProvider, tr TagReader) (Ex commit, err := gp.GetHeadRef(ctx) if err != nil { - return nil, errors.Wrap(err, "error getting parent commit") + return nil, errors.Errorf("getting parent commit: %w", err) } branch, err := gp.Branch(ctx) if err != nil { - return nil, errors.Wrap(err, "error getting branch") + return nil, errors.Errorf("getting branch: %w", err) } tags, err := tr.TagsFromBranch(ctx, branch) if err != nil { - return nil, errors.Wrap(err, "error getting tags from branch") + return nil, errors.Errorf("getting tags from branch: %w", err) } dirty, err := gp.Dirty(ctx) if err != nil { - return nil, errors.Wrap(err, "error getting dirty") + return nil, errors.Errorf("getting dirty: %w", err) } return &LocalProjectState{ diff --git a/pr_state.go b/pr_state.go index fe0a2e7..526ff4a 100644 --- a/pr_state.go +++ b/pr_state.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "errors" + "slices" "github.com/rs/zerolog" ) @@ -56,14 +57,6 @@ func (e *ActivePRProjectState) HeadCommitTags() Tags { return e.CurrentHeadCommitTags } -func (e *ActivePRProjectState) IsDirty() bool { - return false -} - -func (e *ActivePRProjectState) IsLocal() bool { - return false -} - func LoadExecutionFromPR(ctx context.Context, tprov TagReader, prr PRResolver) (Execution, *PRDetails, error) { pr, err := prr.CurrentPR(ctx) @@ -111,12 +104,20 @@ func LoadExecutionFromPR(ctx context.Context, tprov TagReader, prr PRResolver) ( return nil, nil, err } + baseNoRoot := slices.DeleteFunc(baseCommitTags, func(t Tag) bool { + return slices.Contains(rootCommitTags, t) + }) + + headNoBase := slices.DeleteFunc(headBranchTags, func(t Tag) bool { + return slices.Contains(baseBranchTags, t) + }) + ex := &ActivePRProjectState{ CurrentPR: pr, CurrentHeadCommitTags: headTags, + CurrentBaseBranchTags: baseNoRoot, + CurrentHeadBranchTags: headNoBase, CurrentBaseCommitTags: baseCommitTags, - CurrentBaseBranchTags: baseBranchTags, - CurrentHeadBranchTags: headBranchTags, CurrentRootBranchTags: rootBranchTags, CurrentRootCommitTags: rootCommitTags, }