Compare commits

..

14 Commits

Author SHA1 Message Date
lukaszraczylo 18f9e8c1f6 Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-23 03:15:50 +00:00
lukaszraczylo 26abda1319 Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-22 03:11:49 +00:00
lukaszraczylo d08b1fc31e Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-16 03:14:00 +00:00
lukaszraczylo 47f6d0bd51 Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-15 03:08:36 +00:00
lukaszraczylo a1bec4b664 Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-13 03:10:36 +00:00
lukaszraczylo a51496bfd9 Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-08 03:02:35 +00:00
lukaszraczylo a21dc76640 Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-07 03:11:01 +00:00
lukaszraczylo c125ebf429 Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-06 03:10:16 +00:00
lukaszraczylo 82e451888f Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-05 03:09:19 +00:00
lukaszraczylo 3a19de1a44 Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-02 03:10:43 +00:00
lukaszraczylo a27f9e76d3 Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-01 03:12:29 +00:00
lukaszraczylo 54e35d4c0b Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-02-28 03:09:20 +00:00
lukaszraczylo bed1dbd127 Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-02-27 03:08:39 +00:00
lukaszraczylo 275e9f42ac Update go.mod and go.sum
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-02-26 03:08:13 +00:00
19 changed files with 329 additions and 422 deletions
+129 -210
View File
@@ -1,137 +1,69 @@
# Semantic Version Generator ## Semantic version generator
[![Docker image build.](https://github.com/lukaszraczylo/semver-generator/actions/workflows/release.yaml/badge.svg)](https://github.com/lukaszraczylo/semver-generator/actions/workflows/release.yaml) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/lukaszraczylo/semver-generator) [![codecov](https://codecov.io/gh/lukaszraczylo/semver-generator/branch/main/graph/badge.svg?token=FY9BKETB59)](https://codecov.io/gh/lukaszraczylo/semver-generator) [![Docker image build.](https://github.com/lukaszraczylo/semver-generator/actions/workflows/release.yaml/badge.svg)](https://github.com/lukaszraczylo/semver-generator/actions/workflows/release.yaml) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/lukaszraczylo/semver-generator) [![codecov](https://codecov.io/gh/lukaszraczylo/semver-generator/branch/main/graph/badge.svg?token=FY9BKETB59)](https://codecov.io/gh/lukaszraczylo/semver-generator)
A lightweight, configurable tool that simplifies semantic versioning by automatically calculating version numbers based on git commit messages. No more manual version management or team debates about versioning - just agree on the keywords and let the tool handle the rest. Project created overnight, to prove that management of semantic versioning is NOT painful and do not require arguments and debates within the team. Simple, clean and only thing the project team should need to agree to are the keywords.
## Table of Contents - [Semantic version generator](#semantic-version-generator)
- [How does it work](#how-does-it-work)
- [Additional features](#additional-features)
- [Important changes](#important-changes)
- [Usage](#usage)
- [Authentication](#authentication)
- [As a binary](#as-a-binary)
- [As a github action](#as-a-github-action)
- [As a docker container](#as-a-docker-container)
- [Calculations example \[standard\]](#calculations-example-standard)
- [Calculations example \[strict matching\]](#calculations-example-strict-matching)
- [Release candidates](#release-candidates)
- [Example configuration](#example-configuration)
- [Good to know](#good-to-know)
- [How It Works](#how-it-works) ### How does it work
- [Key Features](#key-features)
- [Important Changes](#important-changes)
- [Installation](#installation)
- [Prerequisites](#prerequisites)
- [Binary](#binary)
- [Docker](#docker)
- [GitHub Action](#github-action)
- [Usage](#usage)
- [Authentication](#authentication)
- [Command Line Options](#command-line-options)
- [Configuration File](#configuration-file)
- [Versioning Behavior](#versioning-behavior)
- [Release Candidates](#release-candidates)
- [Examples](#examples)
- [Standard Mode](#standard-mode)
- [Strict Matching Mode](#strict-matching-mode)
- [Advanced Features](#advanced-features)
- [Force Settings](#force-settings)
- [Blacklist Terms](#blacklist-terms)
- [Tips & Best Practices](#tips--best-practices)
## How It Works * Binary clones the github repository
* Iterates through the list of commits looking for the keywords specified in config file for additional bumps of versions
* Returns the semantic version which can be included in the release
The semantic version generator follows a simple process: ### Additional features
1. Clones the specified GitHub repository (or uses a local repository) * With flag `-e` or config `force.existing: true` the existing tags in versioning will be respected, helping you to avoid the version conflicts.
2. Iterates through the commit history, analyzing each commit message * With config `force.commit: deadbeef` where `deadbeef` is the commit hash - calculations will start from the specified commit.
3. Looks for predefined keywords (configurable) that trigger version increments
4. Calculates the appropriate semantic version based on the matches
5. Returns the resulting version that can be used for releases
## Key Features ### Important changes
- **Effortless Version Calculation**: Automatically determine the appropriate version based on commit messages * From version `1.4.2+` as pointed out in [issue #12](https://github.com/lukaszraczylo/semver-generator/issues/12) commits from merge will not be included in the calculations and commits themselves will bump the version on first match ( starting checks from `patch` upwards ).
- **Configurable Keywords**: Define your own keywords for patch, minor, and major version increments * Added support for blacklisting terms to ignore specific commits, branch names, and merge messages from version calculations.
- **Support for Existing Tags**: Option to respect existing version tags to avoid conflicts
- **Release Candidate Support**: Generate release candidate versions with incrementing counter (e.g., `1.2.3-rc.1`)
- **Flexible Repository Source**: Work with either local or remote Git repositories
- **Blacklist Support**: Ignore specific commits or branch merges from version calculations
- **Force Options**: Start calculations from a specific commit or set a minimum version
## Important Changes ### Usage
- **Since v1.4.2+**: Commits from merge requests are no longer included in calculations #### Authentication
- **Commit Matching Behavior**: Commits will bump the version on the first match (checking from `patch` upwards)
- **Blacklist Support**: Added ability to ignore specific terms in commit messages, branch names, and merge requests
## Installation If you intend to use this project with remote repositories ( regardless of them being private or public ) you need to authenticate with your repository.
To do so you can utilise the following environment variables ( they are NOT github specific, for other providers you can use the password )
### Prerequisites
When using with remote repositories, authentication is required. Set the following environment variables:
```bash ```bash
export GITHUB_USERNAME=yourusername export GITHUB_USERNAME=lukaszraczylo
export GITHUB_TOKEN=yourpersonalapitoken export GITHUB_TOKEN=yourPersonalApiToken
``` ```
### Binary #### As a binary
Download the latest binary from the [release page](https://github.com/lukaszraczylo/semver-generator/releases/latest). You can download latest versions of the binaries from the [release page](https://github.com/lukaszraczylo/semver-generator/releases/latest).
**Supported platforms**: **Supported OS and architectures:**
- Darwin (macOS): ARM64/AMD64 Darwin ARM64/AMD64, Linux ARM64/AMD64, Windows AMD64
- Linux: ARM64/AMD64
- Windows: AMD64
### Docker
```bash ```bash
docker pull ghcr.io/lukaszraczylo/semver-generator:latest bash$ ./semver-gen generate -r https://github.com/nextapps-de/winbox
SEMVER 9.0.10
bash$ ./semver-gen generate -l
SEMVER 5.1.1
``` ```
**Supported architectures**: **Local repository flag `-l` will always take precedence over remote repository URL**
- Linux/arm64
- Linux/amd64
### GitHub Action
Add to your GitHub workflow:
```yaml ```yaml
jobs:
prepare:
name: Preparing build context
runs-on: ubuntu-latest
outputs:
RELEASE_VERSION: ${{ steps.semver.outputs.semantic_version }}
steps:
- name: Checkout repo
uses: actions/checkout@v2
with:
fetch-depth: '0'
- name: Semver run
id: semver
uses: lukaszraczylo/semver-generator@v1
with:
config_file: semver.yaml
# Either use local repository
repository_local: true
# Or specify remote repository
# repository_url: https://github.com/lukaszraczylo/simple-gql-client
# github_username: ${{ secrets.GH_USERNAME }}
# github_token: ${{ secrets.GH_TOKEN }}
strict: false
existing: true
- name: Use semantic version
run: |
echo "Semantic version detected: ${{ steps.semver.outputs.semantic_version }}"
```
## Usage
### Authentication
For remote repositories (public or private), authenticate using:
```bash
export GITHUB_USERNAME=yourusername
export GITHUB_TOKEN=yourpersonalapitoken
```
### Command Line Options
```
Usage: Usage:
semver-gen generate [flags] semver-gen generate [flags]
semver-gen [command] semver-gen [command]
@@ -153,11 +85,86 @@ Flags:
-v, --version Display version -v, --version Display version
``` ```
**Note**: The `-l/--local` flag takes precedence over the repository URL. #### As a github action
### Configuration File ```yaml
jobs:
prepare:
name: Preparing build context
runs-on: ubuntu-latest
outputs:
RELEASE_VERSION: ${{ steps.semver.outputs.semantic_version }}
steps:
- name: Checkout repo
uses: actions/checkout@v2
with:
fetch-depth: '0'
- name: Semver run
id: semver
uses: lukaszraczylo/semver-generator@PLACE_LATEST_TAG_HERE
# you can also use v1 tag which _should_ automatically upgrade to latest
# uses: lukaszraczylo/semver-generator@v1
with:
config_file: semver.yaml
# either...
repository_local: true
# or...
repository_url: https://github.com/lukaszraczylo/simple-gql-client
# when using remote repository, especially with private one:
github_username: lukaszraczylo
github_token: MySupeRSecr3tPa$$w0rd
strict: true
existing: false
- name: Semver check
run: |
echo "Semantic version detected: ${{ steps.semver.outputs.semantic_version }}"
```
Create a `semver.yaml` file (or specify a different path with `-c`): #### As a docker container
```bash
docker pull ghcr.io/lukaszraczylo/semver-generator:latest
```
**Docker supported architectures:**
Linux/arm64, Linux/amd64
#### Calculations example [standard]
```bash
- 0.0.1 - PATCH - starting commit
- 0.0.2 - PATCH - another commit
- 0.0.4 - PATCH - another commit with word 'Update' => DOUBLE increment PATCH
- 0.1.0 - MINOR - after commit with word 'Change' => increment MINOR, reset PATCH
- 0.1.1 - PATCH - additional commit
- 1.0.1 - MAJOR - commit with word 'BREAKING' = > INCREMENT MAJOR, reset MINOR
- 1.0.2 - PATCH - another commit
```
#### Calculations example [strict matching]
```bash
- 0.0.1 - PATCH - starting commit
- 0.0.1 - PATCH - another commit
- 0.0.1 - PATCH - another commit with word 'Update' => SINGLE increment PATCH
- 0.1.0 - MINOR - after commit with word 'Change' => increment MINOR, reset PATCH
- 0.1.0 - PATCH - additional commit
- 1.0.0 - MAJOR - commit with word 'BREAKING' = > INCREMENT MAJOR, reset MINOR
- 1.0.0 - PATCH - another commit
```
#### Release candidates
The `semver-gen` supports release candidates generation as well. Add following configuration ( and change the trigger keywords to anything what suits you )
to generate the appropriate release in format `1.3.37-rc.1` and counting up until next `minor` trigger will be detected.
```yaml
release:
- release-candidate
- add-rc
```
#### Example configuration
```yaml ```yaml
version: 1 version: 1
@@ -166,8 +173,6 @@ force:
minor: 0 minor: 0
patch: 1 patch: 1
commit: 69fbe2df696f40281b9104ff073d26186cde1024 commit: 69fbe2df696f40281b9104ff073d26186cde1024
existing: true
strict: false
blacklist: blacklist:
- "Merge branch" - "Merge branch"
- "Merge pull request" - "Merge pull request"
@@ -177,111 +182,25 @@ wording:
patch: patch:
- update - update
- initial - initial
- fix
minor: minor:
- change - change
- improve - improve
- add
major: major:
- breaking - breaking
- redesign - the # For testing purposes
release: release:
- release-candidate - release-candidate
- add-rc - add-rc
``` ```
Configuration options: * `version`: is not respected at the moment, introduced for potential backwards compatibility in future
- `version`: Reserved for future backward compatibility * `force`: sets the "starting" version, you don't need to specify this section as the default is always `0`
- `force`: Set starting version or other constraints * `force.commit`: allows you to set commit hash from which the calculations should start
- `blacklist`: Terms to ignore when processing commits * `blacklist`: terms to ignore when processing commits. Any commit containing these terms will be skipped in version calculations. Useful for ignoring merge commits, feature branch names, and other unwanted triggers.
- `wording`: Keywords that trigger version increments * `wording`: words the program should look for in the git commits to increment (patch|minor|major)
### Versioning Behavior ### Good to know
The version calculation follows semantic versioning rules: * Word matching uses fuzzy search AND is case INSENSITIVE
- **MAJOR**: Incremented for incompatible API changes * I do not recommend using common words ( like "the" from the example configuration )
- **MINOR**: Incremented for backward-compatible new features * You can specify env variable `LOG_LEVEL=debug` to see what exactly happens during the calculations
- **PATCH**: Incremented for backward-compatible bug fixes
When keywords are matched:
- **MAJOR** match: Increments major version, resets minor and patch versions
- **MINOR** match: Increments minor version, resets patch version
- **PATCH** match: Increments patch version
- By default (non-strict mode), every commit increments patch version
### Release Candidates
Add the following to your configuration to generate release candidates:
```yaml
wording:
release:
- release-candidate
- add-rc
```
When a release candidate keyword is found, the version will be formatted as `1.2.3-rc.1`, with the counter incrementing for each new release candidate.
## Examples
### Standard Mode
```
- 0.0.1 - PATCH - starting commit
- 0.0.2 - PATCH - another commit
- 0.0.4 - PATCH - another commit with word 'Update' => DOUBLE increment PATCH
- 0.1.0 - MINOR - after commit with word 'Change' => increment MINOR, reset PATCH
- 0.1.1 - PATCH - additional commit
- 1.0.1 - MAJOR - commit with word 'BREAKING' => INCREMENT MAJOR, reset MINOR
- 1.0.2 - PATCH - another commit
```
### Strict Matching Mode
In strict mode (using `-s` flag or `force.strict: true`), versions only increment when a keyword is matched:
```
- 0.0.1 - PATCH - starting commit
- 0.0.1 - PATCH - another commit (no change - no keyword match)
- 0.0.2 - PATCH - another commit with word 'Update' => increment PATCH
- 0.1.0 - MINOR - after commit with word 'Change' => increment MINOR, reset PATCH
- 0.1.0 - PATCH - additional commit (no change - no keyword match)
- 1.0.0 - MAJOR - commit with word 'BREAKING' => INCREMENT MAJOR, reset MINOR
- 1.0.0 - PATCH - another commit (no change - no keyword match)
```
## Advanced Features
### Force Settings
Control versioning with force settings in configuration:
```yaml
force:
major: 1 # Set minimum major version
minor: 0 # Set minimum minor version
patch: 1 # Set minimum patch version
commit: 69fbe2df696f40281b9104ff073d26186cde1024 # Start from specific commit
existing: true # Respect existing tags (same as -e flag)
strict: false # Use strict matching (same as -s flag)
```
### Blacklist Terms
Ignore specific commits from version calculations:
```yaml
blacklist:
- "Merge branch" # Ignore merge commits
- "Merge pull request" # Ignore PR merges
- "feature/" # Ignore feature branch names
- "chore:" # Ignore chore commits
```
## Tips & Best Practices
- Word matching uses fuzzy search and is case INSENSITIVE
- Avoid common words as version triggers (e.g., "the", "and")
- Use `LOG_LEVEL=debug` environment variable to see detailed calculation steps
- When using as a GitHub Action, ensure `fetch-depth: '0'` to get the complete commit history
- For complex projects, consider using a more specific configuration to distinguish between types of changes
+13 -12
View File
@@ -26,26 +26,27 @@ import (
) )
var ( var (
err error
repo *Setup repo *Setup
PKG_VERSION string PKG_VERSION string
) )
// Setup represents the application setup // Setup represents the application setup
type Setup struct { type Setup struct {
RepositoryName string RepositoryName string
RepositoryBranch string RepositoryBranch string
LocalConfigFile string LocalConfigFile string
Generate bool Generate bool
UseLocal bool UseLocal bool
GitRepo utils.GitRepository GitRepo utils.GitRepository
Config *utils.Config Config *utils.Config
Semver utils.SemVer Semver utils.SemVer
} }
// Initialize the fuzzy search function in the utils package // Initialize the fuzzy search function in the utils package
func init() { func init() {
utils.InitLogger(false) // Will be updated in main based on debug flag utils.InitLogger(false) // Will be updated in main based on debug flag
// Set the fuzzy search function // Set the fuzzy search function
utils.FuzzyFind = fuzzy.FindNormalizedFold utils.FuzzyFind = fuzzy.FindNormalizedFold
} }
@@ -71,12 +72,12 @@ func main() {
if PKG_VERSION != latestRelease && latestReleaseOk { if PKG_VERSION != latestRelease && latestReleaseOk {
outdatedMsg = fmt.Sprintf("(Latest available: %s)", latestRelease) outdatedMsg = fmt.Sprintf("(Latest available: %s)", latestRelease)
} }
utils.Info("semver-gen", map[string]interface{}{ utils.Info("semver-gen", map[string]interface{}{
"version": PKG_VERSION, "version": PKG_VERSION,
"outdated": outdatedMsg, "outdated": outdatedMsg,
}) })
if outdatedMsg != "" { if outdatedMsg != "" {
utils.Info("semver-gen", map[string]interface{}{ utils.Info("semver-gen", map[string]interface{}{
"message": "You can update automatically with: semver-gen -u", "message": "You can update automatically with: semver-gen -u",
+10 -10
View File
@@ -267,7 +267,7 @@ func (suite *Tests) Test_checkMatches() {
if tt.name == "No match" { if tt.name == "No match" {
return nil return nil
} }
// For other test cases, match if the needle is in the haystack // For other test cases, match if the needle is in the haystack
for _, h := range haystack { for _, h := range haystack {
if strings.Contains(h, needle) || strings.Contains(needle, h) { if strings.Contains(h, needle) || strings.Contains(needle, h) {
@@ -276,7 +276,7 @@ func (suite *Tests) Test_checkMatches() {
} }
return nil return nil
} }
got := utils.CheckMatches(tt.args.content, tt.args.targets, tt.blacklist) got := utils.CheckMatches(tt.args.content, tt.args.targets, tt.blacklist)
assertObj.Equal(tt.want, got, "Unexpected result in "+tt.name) assertObj.Equal(tt.want, got, "Unexpected result in "+tt.name)
}) })
@@ -382,10 +382,10 @@ func (suite *Tests) Test_parseExistingSemver() {
func (suite *Tests) TestSetup_ListCommits() { func (suite *Tests) TestSetup_ListCommits() {
type fields struct { type fields struct {
RepositoryName string RepositoryName string
RepositoryBranch string RepositoryBranch string
LocalConfigFile string LocalConfigFile string
GitRepo utils.GitRepository GitRepo utils.GitRepository
} }
tests := []struct { tests := []struct {
@@ -441,23 +441,23 @@ func (suite *Tests) TestSetup_ListCommits() {
if tt.name == "List commits from existing repository" { if tt.name == "List commits from existing repository" {
t.Skip("Skipping test that requires repository access") t.Skip("Skipping test that requires repository access")
} }
s := &Setup{ s := &Setup{
RepositoryName: tt.fields.RepositoryName, RepositoryName: tt.fields.RepositoryName,
RepositoryBranch: tt.fields.RepositoryBranch, RepositoryBranch: tt.fields.RepositoryBranch,
GitRepo: tt.fields.GitRepo, GitRepo: tt.fields.GitRepo,
} }
config, _ := utils.ReadConfig(tt.fields.LocalConfigFile) config, _ := utils.ReadConfig(tt.fields.LocalConfigFile)
s.Config = config s.Config = config
err := utils.PrepareRepository(&s.GitRepo) err := utils.PrepareRepository(&s.GitRepo)
if err != nil && !tt.wantErr { if err != nil && !tt.wantErr {
if tt.name != "List commits starting with certain hash" { if tt.name != "List commits starting with certain hash" {
t.Fatalf("Failed to prepare repository: %v", err) t.Fatalf("Failed to prepare repository: %v", err)
} }
} }
if err == nil { if err == nil {
listOfCommits, err := utils.ListCommits(&s.GitRepo) listOfCommits, err := utils.ListCommits(&s.GitRepo)
if !tt.wantErr { if !tt.wantErr {
+3 -3
View File
@@ -30,13 +30,13 @@ func TestExecute(t *testing.T) {
Short: "Test command", Short: "Test command",
Run: func(cmd *cobra.Command, args []string) {}, Run: func(cmd *cobra.Command, args []string) {},
} }
// Add all the required flags to the test command // Add all the required flags to the test command
testCmd.Flags().Bool("version", false, "Print version information") testCmd.Flags().Bool("version", false, "Print version information")
testCmd.Flags().String("repository", "test-repo", "Repository URL") testCmd.Flags().String("repository", "test-repo", "Repository URL")
testCmd.Flags().String("branch", "test-branch", "Repository branch") testCmd.Flags().String("branch", "test-branch", "Repository branch")
testCmd.Flags().String("config", "test-config", "Config file path") testCmd.Flags().String("config", "test-config", "Config file path")
rootCmd = testCmd rootCmd = testCmd
// Execute should not panic // Execute should not panic
@@ -82,4 +82,4 @@ func TestSetupCobra(t *testing.T) {
assertions.Equal(t, "test-branch", testRepo.RepositoryBranch, "Repository branch should be set") assertions.Equal(t, "test-branch", testRepo.RepositoryBranch, "Repository branch should be set")
assertions.Equal(t, "test-config", testRepo.LocalConfigFile, "Config file should be set") assertions.Equal(t, "test-config", testRepo.LocalConfigFile, "Config file should be set")
assertions.True(t, testRepo.UseLocal, "UseLocal should be set to true") assertions.True(t, testRepo.UseLocal, "UseLocal should be set to true")
} }
+6 -6
View File
@@ -34,18 +34,18 @@ type Config struct {
// ReadConfig reads the configuration from a file // ReadConfig reads the configuration from a file
func ReadConfig(file string) (*Config, error) { func ReadConfig(file string) (*Config, error) {
config := &Config{} config := &Config{}
viper.SetConfigFile(file) viper.SetConfigFile(file)
err := viper.ReadInConfig() err := viper.ReadInConfig()
if err != nil { if err != nil {
err = fmt.Errorf("fatal error config file: %s", err) err = fmt.Errorf("fatal error config file: %s", err)
return config, err return config, err
} }
viper.UnmarshalKey("wording", &config.Wording) viper.UnmarshalKey("wording", &config.Wording)
viper.UnmarshalKey("force", &config.Force) viper.UnmarshalKey("force", &config.Force)
viper.UnmarshalKey("blacklist", &config.Blacklist) viper.UnmarshalKey("blacklist", &config.Blacklist)
return config, nil return config, nil
} }
@@ -55,14 +55,14 @@ func ApplyForcedVersioning(force Force, semver *SemVer) {
Debug("Forced versioning (MAJOR)", map[string]interface{}{"major": force.Major}) Debug("Forced versioning (MAJOR)", map[string]interface{}{"major": force.Major})
semver.Major = force.Major semver.Major = force.Major
} }
if force.Minor > 0 { if force.Minor > 0 {
Debug("Forced versioning (MINOR)", map[string]interface{}{"minor": force.Minor}) Debug("Forced versioning (MINOR)", map[string]interface{}{"minor": force.Minor})
semver.Minor = force.Minor semver.Minor = force.Minor
} }
if force.Patch > 0 { if force.Patch > 0 {
Debug("Forced versioning (PATCH)", map[string]interface{}{"patch": force.Patch}) Debug("Forced versioning (PATCH)", map[string]interface{}{"patch": force.Patch})
semver.Patch = force.Patch semver.Patch = force.Patch
} }
} }
+1 -1
View File
@@ -198,4 +198,4 @@ wording:
// Test reading a non-existent config // Test reading a non-existent config
_, err = ReadConfig("non-existent-file.yaml") _, err = ReadConfig("non-existent-file.yaml")
assert.Error(t, err) assert.Error(t, err)
} }
+28 -28
View File
@@ -29,14 +29,14 @@ type TagDetails struct {
// GitRepository represents a git repository // GitRepository represents a git repository
type GitRepository struct { type GitRepository struct {
Handler *git.Repository Handler *git.Repository
Name string Name string
Branch string Branch string
LocalPath string LocalPath string
UseLocal bool UseLocal bool
Commits []CommitDetails Commits []CommitDetails
Tags []TagDetails Tags []TagDetails
StartCommit string StartCommit string
} }
// PrepareRepository prepares the git repository for use // PrepareRepository prepares the git repository for use
@@ -47,15 +47,15 @@ func PrepareRepository(repo *GitRepository) error {
u, err := url.Parse(repo.Name) u, err := url.Parse(repo.Name)
if err != nil { if err != nil {
Error("Unable to parse repository URL", map[string]interface{}{ Error("Unable to parse repository URL", map[string]interface{}{
"error": err.Error(), "error": err.Error(),
"url": repo.Name, "url": repo.Name,
}) })
return err return err
} }
repo.LocalPath = fmt.Sprintf("/tmp/semver/%s/%s", u.Path, repo.Branch) repo.LocalPath = fmt.Sprintf("/tmp/semver/%s/%s", u.Path, repo.Branch)
os.RemoveAll(repo.LocalPath) os.RemoveAll(repo.LocalPath)
repo.Handler, err = git.PlainClone(repo.LocalPath, false, &git.CloneOptions{ repo.Handler, err = git.PlainClone(repo.LocalPath, false, &git.CloneOptions{
URL: repo.Name, URL: repo.Name,
ReferenceName: plumbing.NewBranchReferenceName(repo.Branch), ReferenceName: plumbing.NewBranchReferenceName(repo.Branch),
@@ -66,11 +66,11 @@ func PrepareRepository(repo *GitRepository) error {
}, },
Tags: git.AllTags, Tags: git.AllTags,
}) })
if err != nil { if err != nil {
Error("Unable to clone repository", map[string]interface{}{ Error("Unable to clone repository", map[string]interface{}{
"error": err.Error(), "error": err.Error(),
"url": repo.Name, "url": repo.Name,
}) })
return err return err
} }
@@ -79,13 +79,13 @@ func PrepareRepository(repo *GitRepository) error {
repo.Handler, err = git.PlainOpen(repo.LocalPath) repo.Handler, err = git.PlainOpen(repo.LocalPath)
if err != nil { if err != nil {
Error("Unable to open local repository", map[string]interface{}{ Error("Unable to open local repository", map[string]interface{}{
"error": err.Error(), "error": err.Error(),
"path": repo.LocalPath, "path": repo.LocalPath,
}) })
return err return err
} }
} }
os.Chdir(repo.LocalPath) os.Chdir(repo.LocalPath)
return nil return nil
} }
@@ -105,7 +105,7 @@ func ListCommits(repo *GitRepository) ([]CommitDetails, error) {
if err != nil { if err != nil {
return []CommitDetails{}, err return []CommitDetails{}, err
} }
commitsList, err := repo.Handler.Log(&git.LogOptions{From: ref.Hash()}) commitsList, err := repo.Handler.Log(&git.LogOptions{From: ref.Hash()})
if err != nil { if err != nil {
return []CommitDetails{}, err return []CommitDetails{}, err
@@ -126,14 +126,14 @@ func ListCommits(repo *GitRepository) ([]CommitDetails, error) {
}) })
Debug("Listing commits", map[string]interface{}{"commits": tmpResults}) Debug("Listing commits", map[string]interface{}{"commits": tmpResults})
// Filter commits starting from the specified commit if provided // Filter commits starting from the specified commit if provided
if repo.StartCommit != "" { if repo.StartCommit != "" {
for commitId, cmt := range tmpResults { for commitId, cmt := range tmpResults {
if cmt.Hash == repo.StartCommit { if cmt.Hash == repo.StartCommit {
Debug("Found commit match", map[string]interface{}{ Debug("Found commit match", map[string]interface{}{
"commit": cmt.Hash, "commit": cmt.Hash,
"index": commitId, "index": commitId,
}) })
repo.Commits = tmpResults[commitId:] repo.Commits = tmpResults[commitId:]
break break
@@ -150,32 +150,32 @@ func ListCommits(repo *GitRepository) ([]CommitDetails, error) {
// ListExistingTags lists all tags in the repository // ListExistingTags lists all tags in the repository
func ListExistingTags(repo *GitRepository) { func ListExistingTags(repo *GitRepository) {
Debug("Listing existing tags", nil) Debug("Listing existing tags", nil)
// Check if Handler is nil to avoid panic // Check if Handler is nil to avoid panic
if repo.Handler == nil { if repo.Handler == nil {
Debug("Repository handler is nil, skipping tag listing", nil) Debug("Repository handler is nil, skipping tag listing", nil)
return return
} }
refs, err := repo.Handler.Tags() refs, err := repo.Handler.Tags()
if err != nil { if err != nil {
Error("Unable to list tags", map[string]interface{}{"error": err.Error()}) Error("Unable to list tags", map[string]interface{}{"error": err.Error()})
return return
} }
if err := refs.ForEach(func(ref *plumbing.Reference) error { if err := refs.ForEach(func(ref *plumbing.Reference) error {
repo.Tags = append(repo.Tags, TagDetails{ repo.Tags = append(repo.Tags, TagDetails{
Name: ref.Name().Short(), Name: ref.Name().Short(),
Hash: ref.Hash().String(), Hash: ref.Hash().String(),
}) })
Debug("Found tag", map[string]interface{}{ Debug("Found tag", map[string]interface{}{
"tag": ref.Name().Short(), "tag": ref.Name().Short(),
"hash": ref.Hash().String(), "hash": ref.Hash().String(),
}) })
return nil return nil
}); err != nil { }); err != nil {
Error("Error iterating tags", map[string]interface{}{"error": err.Error()}) Error("Error iterating tags", map[string]interface{}{"error": err.Error()})
} }
} }
+13 -13
View File
@@ -64,7 +64,7 @@ func TestListCommits(t *testing.T) {
t.Run("Test commit filtering logic", func(t *testing.T) { t.Run("Test commit filtering logic", func(t *testing.T) {
// Create a test repository with predefined commits // Create a test repository with predefined commits
repo := &GitRepository{} repo := &GitRepository{}
// Manually populate the commits for testing // Manually populate the commits for testing
repo.Commits = []CommitDetails{ repo.Commits = []CommitDetails{
{ {
@@ -83,7 +83,7 @@ func TestListCommits(t *testing.T) {
// Test with StartCommit specified // Test with StartCommit specified
repo.StartCommit = "def456" repo.StartCommit = "def456"
// Instead of calling ListCommits which would try to use the nil Handler, // Instead of calling ListCommits which would try to use the nil Handler,
// we'll just test the filtering logic directly // we'll just test the filtering logic directly
if repo.StartCommit != "" { if repo.StartCommit != "" {
@@ -94,19 +94,19 @@ func TestListCommits(t *testing.T) {
} }
} }
} }
// Verify the filtering worked correctly // Verify the filtering worked correctly
assert.Len(t, repo.Commits, 1, "Should filter commits starting from specified hash") assert.Len(t, repo.Commits, 1, "Should filter commits starting from specified hash")
assert.Equal(t, "def456", repo.Commits[0].Hash, "Commit hash should match") assert.Equal(t, "def456", repo.Commits[0].Hash, "Commit hash should match")
}) })
t.Run("Test with nil Handler", func(t *testing.T) { t.Run("Test with nil Handler", func(t *testing.T) {
// Create a test repository with nil Handler // Create a test repository with nil Handler
repo := &GitRepository{} repo := &GitRepository{}
// Now we can safely call ListCommits since we've added a nil check // Now we can safely call ListCommits since we've added a nil check
commits, err := ListCommits(repo) commits, err := ListCommits(repo)
// Verify the function returns without error // Verify the function returns without error
assert.NoError(t, err, "Should not error with nil Handler") assert.NoError(t, err, "Should not error with nil Handler")
assert.Empty(t, commits, "Should return empty commits with nil Handler") assert.Empty(t, commits, "Should return empty commits with nil Handler")
@@ -120,10 +120,10 @@ func TestListExistingTags(t *testing.T) {
t.Run("Test tag processing", func(t *testing.T) { t.Run("Test tag processing", func(t *testing.T) {
// Create a test repository // Create a test repository
repo := &GitRepository{} repo := &GitRepository{}
// Since we can't test the actual git operations, we'll test the function's behavior // Since we can't test the actual git operations, we'll test the function's behavior
// by manually setting up the repository state // by manually setting up the repository state
// Manually add tags to verify they're processed correctly // Manually add tags to verify they're processed correctly
repo.Tags = []TagDetails{ repo.Tags = []TagDetails{
{ {
@@ -131,20 +131,20 @@ func TestListExistingTags(t *testing.T) {
Hash: "abc123", Hash: "abc123",
}, },
} }
assert.Len(t, repo.Tags, 1, "Should have 1 tag") assert.Len(t, repo.Tags, 1, "Should have 1 tag")
assert.Equal(t, "v1.0.0", repo.Tags[0].Name, "Tag name should match") assert.Equal(t, "v1.0.0", repo.Tags[0].Name, "Tag name should match")
assert.Equal(t, "abc123", repo.Tags[0].Hash, "Tag hash should match") assert.Equal(t, "abc123", repo.Tags[0].Hash, "Tag hash should match")
}) })
t.Run("Test with nil Handler", func(t *testing.T) { t.Run("Test with nil Handler", func(t *testing.T) {
// Create a test repository with nil Handler // Create a test repository with nil Handler
repo := &GitRepository{} repo := &GitRepository{}
// Now we can safely call ListExistingTags since we've added a nil check // Now we can safely call ListExistingTags since we've added a nil check
ListExistingTags(repo) ListExistingTags(repo)
// Verify no tags were added // Verify no tags were added
assert.Empty(t, repo.Tags, "Should have no tags after calling with nil Handler") assert.Empty(t, repo.Tags, "Should have no tags after calling with nil Handler")
}) })
} }
+19 -19
View File
@@ -21,7 +21,7 @@ func UpdatePackage() bool {
binaryName := fmt.Sprintf("semver-gen-%s-%s", runtime.GOOS, runtime.GOARCH) binaryName := fmt.Sprintf("semver-gen-%s-%s", runtime.GOOS, runtime.GOARCH)
Info("Checking for updates", map[string]interface{}{"binaryName": binaryName}) Info("Checking for updates", map[string]interface{}{"binaryName": binaryName})
gql := graphql.NewConnection() gql := graphql.NewConnection()
gql.SetEndpoint("https://api.github.com/graphql") gql.SetEndpoint("https://api.github.com/graphql")
gql.SetOutput("mapstring") gql.SetOutput("mapstring")
@@ -29,11 +29,11 @@ func UpdatePackage() bool {
headers := map[string]interface{}{ headers := map[string]interface{}{
"Authorization": fmt.Sprintf("Bearer %s", ghToken), "Authorization": fmt.Sprintf("Bearer %s", ghToken),
} }
variables := map[string]interface{}{ variables := map[string]interface{}{
"binaryName": binaryName, "binaryName": binaryName,
} }
var query = `query ($binaryName: String) { var query = `query ($binaryName: String) {
repository(name: "semver-generator", owner: "lukaszraczylo") { repository(name: "semver-generator", owner: "lukaszraczylo") {
latestRelease { latestRelease {
@@ -48,7 +48,7 @@ func UpdatePackage() bool {
} }
} }
}` }`
result, err := gql.Query(query, variables, headers) result, err := gql.Query(query, variables, headers)
if err != nil { if err != nil {
Error("Unable to query GitHub API", map[string]interface{}{"error": err.Error()}) Error("Unable to query GitHub API", map[string]interface{}{"error": err.Error()})
@@ -58,12 +58,12 @@ func UpdatePackage() bool {
output, ok := ask.For(result, "repository.latestRelease.releaseAssets.edges[0].node.downloadUrl").String("") output, ok := ask.For(result, "repository.latestRelease.releaseAssets.edges[0].node.downloadUrl").String("")
if !ok { if !ok {
Error("Unable to obtain download url for the binary", map[string]interface{}{ Error("Unable to obtain download url for the binary", map[string]interface{}{
"binary": binaryName, "binary": binaryName,
"output": output, "output": output,
}) })
return false return false
} }
// Skip actual download in test mode // Skip actual download in test mode
if flag.Lookup("test.v") == nil && os.Getenv("CI") == "" { if flag.Lookup("test.v") == nil && os.Getenv("CI") == "" {
downloadedBinaryPath := fmt.Sprintf("/tmp/%s", binaryName) downloadedBinaryPath := fmt.Sprintf("/tmp/%s", binaryName)
@@ -71,12 +71,12 @@ func UpdatePackage() bool {
err = g.Download(output, downloadedBinaryPath) err = g.Download(output, downloadedBinaryPath)
if err != nil { if err != nil {
Error("Unable to download binary", map[string]interface{}{ Error("Unable to download binary", map[string]interface{}{
"error": err.Error(), "error": err.Error(),
"binaryPath": downloadedBinaryPath, "binaryPath": downloadedBinaryPath,
}) })
return false return false
} }
currentBinary, err := os.Executable() currentBinary, err := os.Executable()
if err != nil { if err != nil {
Error("Unable to obtain current binary path", map[string]interface{}{ Error("Unable to obtain current binary path", map[string]interface{}{
@@ -84,7 +84,7 @@ func UpdatePackage() bool {
}) })
return false return false
} }
err = os.Rename(downloadedBinaryPath, currentBinary) err = os.Rename(downloadedBinaryPath, currentBinary)
if err != nil { if err != nil {
Error("Unable to overwrite current binary", map[string]interface{}{ Error("Unable to overwrite current binary", map[string]interface{}{
@@ -92,7 +92,7 @@ func UpdatePackage() bool {
}) })
return false return false
} }
err = os.Chmod(currentBinary, 0777) err = os.Chmod(currentBinary, 0777)
if err != nil { if err != nil {
Error("Unable to make binary executable", map[string]interface{}{ Error("Unable to make binary executable", map[string]interface{}{
@@ -101,7 +101,7 @@ func UpdatePackage() bool {
return false return false
} }
} }
return true return true
} }
@@ -111,16 +111,16 @@ func CheckLatestRelease() (string, bool) {
if !ghTokenSet { if !ghTokenSet {
return "[no GITHUB_TOKEN set]", false return "[no GITHUB_TOKEN set]", false
} }
gql := graphql.NewConnection() gql := graphql.NewConnection()
gql.SetEndpoint("https://api.github.com/graphql") gql.SetEndpoint("https://api.github.com/graphql")
headers := map[string]interface{}{ headers := map[string]interface{}{
"Authorization": fmt.Sprintf("bearer %s", ghToken), "Authorization": fmt.Sprintf("bearer %s", ghToken),
} }
variables := map[string]interface{}{} variables := map[string]interface{}{}
var query = `query { var query = `query {
repository(name: "semver-generator", owner: "lukaszraczylo", followRenames: true) { repository(name: "semver-generator", owner: "lukaszraczylo", followRenames: true) {
releases(last: 2) { releases(last: 2) {
@@ -132,17 +132,17 @@ func CheckLatestRelease() (string, bool) {
} }
} }
}` }`
result, err := gql.Query(query, variables, headers) result, err := gql.Query(query, variables, headers)
if err != nil { if err != nil {
Error("Unable to query GitHub API", map[string]interface{}{"error": err.Error()}) Error("Unable to query GitHub API", map[string]interface{}{"error": err.Error()})
return "", false return "", false
} }
output, _ := ask.For(result, "repository.releases.nodes[0].tag.name").String("") output, _ := ask.For(result, "repository.releases.nodes[0].tag.name").String("")
if output == "v1" { if output == "v1" {
output, _ = ask.For(result, "repository.releases.nodes[1].tag.name").String("") output, _ = ask.For(result, "repository.releases.nodes[1].tag.name").String("")
} }
return output, true return output, true
} }
+1 -1
View File
@@ -63,4 +63,4 @@ func TestUpdatePackage(t *testing.T) {
} }
// Note: We're not using mock transports for these tests to avoid // Note: We're not using mock transports for these tests to avoid
// adding complexity. The tests focus on the token presence logic and error handling. // adding complexity. The tests focus on the token presence logic and error handling.
+1 -1
View File
@@ -56,4 +56,4 @@ func Critical(message string, pairs map[string]interface{}) {
Pairs: pairs, Pairs: pairs,
}) })
} }
} }
+8 -9
View File
@@ -5,7 +5,6 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestInitLogger(t *testing.T) { func TestInitLogger(t *testing.T) {
// Test with debug mode enabled // Test with debug mode enabled
logger := InitLogger(true) logger := InitLogger(true)
@@ -26,10 +25,10 @@ func TestLoggingFunctions(t *testing.T) {
Debug("Debug message", map[string]interface{}{"key": "value"}) Debug("Debug message", map[string]interface{}{"key": "value"})
Info("Info message", map[string]interface{}{"key": "value"}) Info("Info message", map[string]interface{}{"key": "value"})
Error("Error message", map[string]interface{}{"key": "value"}) Error("Error message", map[string]interface{}{"key": "value"})
// Skip testing Critical as it might call os.Exit // Skip testing Critical as it might call os.Exit
// Critical("Critical message", map[string]interface{}{"key": "value"}) // Critical("Critical message", map[string]interface{}{"key": "value"})
// Test passes if we get here without panicking // Test passes if we get here without panicking
assert.True(t, true) assert.True(t, true)
} }
@@ -44,10 +43,10 @@ func TestLoggingWithNilLogger(t *testing.T) {
Debug("Debug message", map[string]interface{}{"key": "value"}) Debug("Debug message", map[string]interface{}{"key": "value"})
Info("Info message", map[string]interface{}{"key": "value"}) Info("Info message", map[string]interface{}{"key": "value"})
Error("Error message", map[string]interface{}{"key": "value"}) Error("Error message", map[string]interface{}{"key": "value"})
// Skip testing Critical as it might call os.Exit // Skip testing Critical as it might call os.Exit
// Critical("Critical message", map[string]interface{}{"key": "value"}) // Critical("Critical message", map[string]interface{}{"key": "value"})
// Test passes if we get here without panicking // Test passes if we get here without panicking
assert.True(t, true) assert.True(t, true)
} }
@@ -57,15 +56,15 @@ func TestCriticalNilLogger(t *testing.T) {
// Save original logger and restore after test // Save original logger and restore after test
originalLogger := Logger originalLogger := Logger
defer func() { Logger = originalLogger }() defer func() { Logger = originalLogger }()
// Set logger to nil // Set logger to nil
Logger = nil Logger = nil
// This should not panic // This should not panic
Critical("Critical message", map[string]interface{}{"key": "value"}) Critical("Critical message", map[string]interface{}{"key": "value"})
// Test passes if we get here without panicking // Test passes if we get here without panicking
assert.True(t, true) assert.True(t, true)
} }
// Note: We don't test Critical with an actual logger because it calls os.Exit // Note: We don't test Critical with an actual logger because it calls os.Exit
+11 -11
View File
@@ -22,7 +22,7 @@ func CalculateSemver(
for _, tagHash := range tags { for _, tagHash := range tags {
if commit.Hash == tagHash.Hash { if commit.Hash == tagHash.Hash {
Debug("Found existing tag", map[string]interface{}{ Debug("Found existing tag", map[string]interface{}{
"tag": tagHash.Name, "tag": tagHash.Name,
"commit": strings.TrimSuffix(commit.Message, "\n"), "commit": strings.TrimSuffix(commit.Message, "\n"),
}) })
semver = ParseExistingSemver(tagHash.Name, semver) semver = ParseExistingSemver(tagHash.Name, semver)
@@ -35,7 +35,7 @@ func CalculateSemver(
if !strictMode { if !strictMode {
semver.Patch++ semver.Patch++
Debug("Incrementing patch (DEFAULT)", map[string]interface{}{ Debug("Incrementing patch (DEFAULT)", map[string]interface{}{
"commit": strings.TrimSuffix(commit.Message, "\n"), "commit": strings.TrimSuffix(commit.Message, "\n"),
"semver": FormatSemver(semver), "semver": FormatSemver(semver),
}) })
} }
@@ -55,44 +55,44 @@ func CalculateSemver(
semver.EnableReleaseCandidate = false semver.EnableReleaseCandidate = false
semver.Release = 0 semver.Release = 0
Debug("Incrementing major (WORDING)", map[string]interface{}{ Debug("Incrementing major (WORDING)", map[string]interface{}{
"commit": strings.TrimSuffix(commit.Message, "\n"), "commit": strings.TrimSuffix(commit.Message, "\n"),
"semver": FormatSemver(semver), "semver": FormatSemver(semver),
}) })
continue continue
} }
if matchMinor { if matchMinor {
semver.Minor++ semver.Minor++
semver.Patch = 1 semver.Patch = 1
semver.EnableReleaseCandidate = false semver.EnableReleaseCandidate = false
semver.Release = 0 semver.Release = 0
Debug("Incrementing minor (WORDING)", map[string]interface{}{ Debug("Incrementing minor (WORDING)", map[string]interface{}{
"commit": strings.TrimSuffix(commit.Message, "\n"), "commit": strings.TrimSuffix(commit.Message, "\n"),
"semver": FormatSemver(semver), "semver": FormatSemver(semver),
}) })
continue continue
} }
if matchReleaseCandidate { if matchReleaseCandidate {
semver.Release++ semver.Release++
semver.Patch = 1 semver.Patch = 1
semver.EnableReleaseCandidate = true semver.EnableReleaseCandidate = true
Debug("Incrementing release candidate (WORDING)", map[string]interface{}{ Debug("Incrementing release candidate (WORDING)", map[string]interface{}{
"commit": strings.TrimSuffix(commit.Message, "\n"), "commit": strings.TrimSuffix(commit.Message, "\n"),
"semver": FormatSemver(semver), "semver": FormatSemver(semver),
}) })
continue continue
} }
if matchPatch { if matchPatch {
semver.Patch++ semver.Patch++
Debug("Incrementing patch (WORDING)", map[string]interface{}{ Debug("Incrementing patch (WORDING)", map[string]interface{}{
"commit": strings.TrimSuffix(commit.Message, "\n"), "commit": strings.TrimSuffix(commit.Message, "\n"),
"semver": FormatSemver(semver), "semver": FormatSemver(semver),
}) })
continue continue
} }
} }
return semver return semver
} }
+11 -11
View File
@@ -19,7 +19,7 @@ func TestCalculateSemver(t *testing.T) {
// More sophisticated mock implementation for testing // More sophisticated mock implementation for testing
for _, h := range haystack { for _, h := range haystack {
// Check for substring match to better simulate fuzzy search // Check for substring match to better simulate fuzzy search
if h == needle || (len(h) >= 3 && len(needle) >= 3 && if h == needle || (len(h) >= 3 && len(needle) >= 3 &&
(h[:3] == needle[:3] || h[len(h)-3:] == needle[len(needle)-3:])) { (h[:3] == needle[:3] || h[len(h)-3:] == needle[len(needle)-3:])) {
return []string{h} return []string{h}
} }
@@ -29,7 +29,7 @@ func TestCalculateSemver(t *testing.T) {
// Test data // Test data
now := time.Now() now := time.Now()
// Common wording and blacklist for all tests // Common wording and blacklist for all tests
wording := Wording{ wording := Wording{
Patch: []string{"update", "fix", "initial"}, Patch: []string{"update", "fix", "initial"},
@@ -77,10 +77,10 @@ func TestCalculateSemver(t *testing.T) {
respectExisting: true, respectExisting: true,
strictMode: false, strictMode: false,
want: SemVer{ want: SemVer{
Major: 2, Major: 2,
Minor: 0, Minor: 0,
Patch: 1, // Initial tag 2.0.0 + one patch increment Patch: 1, // Initial tag 2.0.0 + one patch increment
Release: 1, Release: 1,
EnableReleaseCandidate: true, EnableReleaseCandidate: true,
}, },
}, },
@@ -110,10 +110,10 @@ func TestCalculateSemver(t *testing.T) {
respectExisting: true, respectExisting: true,
strictMode: true, strictMode: true,
want: SemVer{ want: SemVer{
Major: 2, Major: 2,
Minor: 0, Minor: 0,
Patch: 1, // Initial tag 2.0.0 + patch from "update" keyword Patch: 1, // Initial tag 2.0.0 + patch from "update" keyword
Release: 1, Release: 1,
EnableReleaseCandidate: true, EnableReleaseCandidate: true,
}, },
}, },
@@ -254,4 +254,4 @@ func TestCalculateSemver(t *testing.T) {
assert.Equal(t, tt.want.EnableReleaseCandidate, got.EnableReleaseCandidate, "EnableReleaseCandidate mismatch") assert.Equal(t, tt.want.EnableReleaseCandidate, got.EnableReleaseCandidate, "EnableReleaseCandidate mismatch")
}) })
} }
} }
+13 -13
View File
@@ -54,33 +54,33 @@ var extractNumber = regexp.MustCompile("[0-9]+")
// ParseExistingSemver parses a semantic version from a tag name // ParseExistingSemver parses a semantic version from a tag name
func ParseExistingSemver(tagName string, currentSemver SemVer) SemVer { func ParseExistingSemver(tagName string, currentSemver SemVer) SemVer {
Debug("Parsing existing semver", map[string]interface{}{"tag": tagName}) Debug("Parsing existing semver", map[string]interface{}{"tag": tagName})
tagNameParts := strings.Split(tagName, ".") tagNameParts := strings.Split(tagName, ".")
if len(tagNameParts) < 3 { if len(tagNameParts) < 3 {
Debug("Unable to parse incompatible semver (non x.y.z)", map[string]interface{}{"tag": tagName}) Debug("Unable to parse incompatible semver (non x.y.z)", map[string]interface{}{"tag": tagName})
return currentSemver return currentSemver
} }
semanticVersion := SemVer{} semanticVersion := SemVer{}
// Extract major version // Extract major version
majorMatches := extractNumber.FindAllString(tagNameParts[0], -1) majorMatches := extractNumber.FindAllString(tagNameParts[0], -1)
if len(majorMatches) > 0 { if len(majorMatches) > 0 {
semanticVersion.Major, _ = strconv.Atoi(majorMatches[0]) semanticVersion.Major, _ = strconv.Atoi(majorMatches[0])
} }
// Extract minor version // Extract minor version
minorMatches := extractNumber.FindAllString(tagNameParts[1], -1) minorMatches := extractNumber.FindAllString(tagNameParts[1], -1)
if len(minorMatches) > 0 { if len(minorMatches) > 0 {
semanticVersion.Minor, _ = strconv.Atoi(minorMatches[0]) semanticVersion.Minor, _ = strconv.Atoi(minorMatches[0])
} }
// Extract patch version // Extract patch version
patchMatches := extractNumber.FindAllString(tagNameParts[2], -1) patchMatches := extractNumber.FindAllString(tagNameParts[2], -1)
if len(patchMatches) > 0 { if len(patchMatches) > 0 {
semanticVersion.Patch, _ = strconv.Atoi(patchMatches[0]) semanticVersion.Patch, _ = strconv.Atoi(patchMatches[0])
} }
// Extract release candidate version if present // Extract release candidate version if present
if len(tagNameParts) > 3 { if len(tagNameParts) > 3 {
releaseMatches := extractNumber.FindAllString(tagNameParts[3], -1) releaseMatches := extractNumber.FindAllString(tagNameParts[3], -1)
@@ -89,14 +89,14 @@ func ParseExistingSemver(tagName string, currentSemver SemVer) SemVer {
semanticVersion.EnableReleaseCandidate = true semanticVersion.EnableReleaseCandidate = true
} }
} }
return semanticVersion return semanticVersion
} }
// CheckMatches checks if any of the targets match the content // CheckMatches checks if any of the targets match the content
func CheckMatches(content []string, targets []string, blacklist []string) bool { func CheckMatches(content []string, targets []string, blacklist []string) bool {
contentStr := strings.Join(content, " ") contentStr := strings.Join(content, " ")
// First check if any target matches // First check if any target matches
hasMatch := false hasMatch := false
for _, tgt := range targets { for _, tgt := range targets {
@@ -104,8 +104,8 @@ func CheckMatches(content []string, targets []string, blacklist []string) bool {
if len(matches) > 0 { if len(matches) > 0 {
hasMatch = true hasMatch = true
Debug("Found match", map[string]interface{}{ Debug("Found match", map[string]interface{}{
"target": tgt, "target": tgt,
"match": strings.Join(matches, ","), "match": strings.Join(matches, ","),
"content": contentStr, "content": contentStr,
}) })
break break
@@ -117,14 +117,14 @@ func CheckMatches(content []string, targets []string, blacklist []string) bool {
for _, blacklistTerm := range blacklist { for _, blacklistTerm := range blacklist {
if strings.Contains(strings.ToLower(contentStr), strings.ToLower(blacklistTerm)) { if strings.Contains(strings.ToLower(contentStr), strings.ToLower(blacklistTerm)) {
Debug("Blacklisted term detected, ignoring commit", map[string]interface{}{ Debug("Blacklisted term detected, ignoring commit", map[string]interface{}{
"content": contentStr, "content": contentStr,
"blacklist_term": blacklistTerm, "blacklist_term": blacklistTerm,
}) })
return false return false
} }
} }
} }
return hasMatch return hasMatch
} }
@@ -132,4 +132,4 @@ func CheckMatches(content []string, targets []string, blacklist []string) bool {
var FuzzyFind = func(needle string, haystack []string) []string { var FuzzyFind = func(needle string, haystack []string) []string {
// This will be replaced with the actual implementation in main.go // This will be replaced with the actual implementation in main.go
return nil return nil
} }
+10 -10
View File
@@ -58,14 +58,14 @@ func TestParseExistingSemver(t *testing.T) {
InitLogger(false) InitLogger(false)
tests := []struct { tests := []struct {
name string name string
tagName string tagName string
currentSemver SemVer currentSemver SemVer
want SemVer want SemVer
}{ }{
{ {
name: "Standard semver", name: "Standard semver",
tagName: "1.2.3", tagName: "1.2.3",
currentSemver: SemVer{}, currentSemver: SemVer{},
want: SemVer{ want: SemVer{
Major: 1, Major: 1,
@@ -74,8 +74,8 @@ func TestParseExistingSemver(t *testing.T) {
}, },
}, },
{ {
name: "With v prefix", name: "With v prefix",
tagName: "v2.3.4", tagName: "v2.3.4",
currentSemver: SemVer{}, currentSemver: SemVer{},
want: SemVer{ want: SemVer{
Major: 2, Major: 2,
@@ -84,8 +84,8 @@ func TestParseExistingSemver(t *testing.T) {
}, },
}, },
{ {
name: "With release candidate", name: "With release candidate",
tagName: "3.4.5-rc.2", tagName: "3.4.5-rc.2",
currentSemver: SemVer{}, currentSemver: SemVer{},
want: SemVer{ want: SemVer{
Major: 3, Major: 3,
@@ -196,4 +196,4 @@ func TestCheckMatches(t *testing.T) {
assert.Equal(t, tt.want, got) assert.Equal(t, tt.want, got)
}) })
} }
} }
+15 -19
View File
@@ -5,22 +5,22 @@ go 1.23.0
toolchain go1.23.6 toolchain go1.23.6
require ( require (
github.com/go-git/go-git/v5 v5.13.2 github.com/go-git/go-git/v5 v5.14.0
github.com/lithammer/fuzzysearch v1.1.8 github.com/lithammer/fuzzysearch v1.1.8
github.com/lukaszraczylo/ask v0.0.0-20240916204100-6e9ef53a62d9 github.com/lukaszraczylo/ask v0.0.0-20240916204100-6e9ef53a62d9
github.com/lukaszraczylo/go-simple-graphql v1.2.42 github.com/lukaszraczylo/go-simple-graphql v1.2.51
github.com/lukaszraczylo/graphql-monitoring-proxy v0.25.154 github.com/lukaszraczylo/graphql-monitoring-proxy v0.28.57
github.com/lukaszraczylo/pandati v0.0.29 github.com/lukaszraczylo/pandati v0.0.29
github.com/melbahja/got v0.7.0 github.com/melbahja/got v0.7.0
github.com/spf13/cobra v1.9.1 github.com/spf13/cobra v1.9.1
github.com/spf13/viper v1.19.0 github.com/spf13/viper v1.20.0
github.com/stretchr/testify v1.10.0 github.com/stretchr/testify v1.10.0
) )
require ( require (
dario.cat/mergo v1.0.1 // indirect dario.cat/mergo v1.0.1 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/ProtonMail/go-crypto v1.1.5 // indirect github.com/ProtonMail/go-crypto v1.1.6 // indirect
github.com/avast/retry-go/v4 v4.6.1 // indirect github.com/avast/retry-go/v4 v4.6.1 // indirect
github.com/cloudflare/circl v1.6.0 // indirect github.com/cloudflare/circl v1.6.0 // indirect
github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/cyphar/filepath-securejoin v0.4.1 // indirect
@@ -29,28 +29,25 @@ require (
github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
github.com/goccy/go-json v0.10.5 // indirect github.com/goccy/go-json v0.10.5 // indirect
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
github.com/gookit/color v1.5.4 // indirect github.com/gookit/color v1.5.4 // indirect
github.com/gookit/goutil v0.6.18 // indirect github.com/gookit/goutil v0.6.18 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/magiconair/properties v1.8.9 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/pjbgf/sha1cd v0.3.2 // indirect github.com/pjbgf/sha1cd v0.3.2 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/rs/zerolog v1.33.0 // indirect github.com/rs/zerolog v1.33.0 // indirect
github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sagikazarmark/locafero v0.8.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
github.com/skeema/knownhosts v1.3.1 // indirect github.com/skeema/knownhosts v1.3.1 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.12.0 // indirect github.com/spf13/afero v1.14.0 // indirect
github.com/spf13/cast v1.7.1 // indirect github.com/spf13/cast v1.7.1 // indirect
github.com/spf13/pflag v1.0.6 // indirect github.com/spf13/pflag v1.0.6 // indirect
github.com/subosito/gotenv v1.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect
@@ -62,14 +59,13 @@ require (
github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
golang.org/x/crypto v0.35.0 // indirect golang.org/x/crypto v0.36.0 // indirect
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect
golang.org/x/net v0.35.0 // indirect golang.org/x/net v0.37.0 // indirect
golang.org/x/sync v0.11.0 // indirect golang.org/x/sync v0.12.0 // indirect
golang.org/x/sys v0.30.0 // indirect golang.org/x/sys v0.31.0 // indirect
golang.org/x/term v0.29.0 // indirect golang.org/x/term v0.30.0 // indirect
golang.org/x/text v0.22.0 // indirect golang.org/x/text v0.23.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
) )
+36 -44
View File
@@ -3,8 +3,8 @@ dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/ProtonMail/go-crypto v1.1.5 h1:eoAQfK2dwL+tFSFpr7TbOaPNUbPiJj4fLYwwGE1FQO4= github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw=
github.com/ProtonMail/go-crypto v1.1.5/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
@@ -23,8 +23,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/elazarl/goproxy v1.4.0 h1:4GyuSbFa+s26+3rmYNSuUVsx+HgPrV1bk1jXI0l9wjM= github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
github.com/elazarl/goproxy v1.4.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ= github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
@@ -39,8 +39,10 @@ github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UN
github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
github.com/go-git/go-git/v5 v5.13.2 h1:7O7xvsK7K+rZPKW6AQR1YyNhfywkv7B8/FsP3ki6Zv0= github.com/go-git/go-git/v5 v5.14.0 h1:/MD3lCrGjCen5WfEAzKg00MJJffKhC8gzS80ycmCi60=
github.com/go-git/go-git/v5 v5.13.2/go.mod h1:hWdW5P4YZRjmpGHwRH2v3zkWcNl6HeXaXQEMGb3NJ9A= github.com/go-git/go-git/v5 v5.14.0/go.mod h1:Z5Xhoia5PcWA3NF8vRLURn9E5FRhSl7dGj9ItW3Wk5k=
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/goccy/go-reflect v1.2.0 h1:O0T8rZCuNmGXewnATuKYnkL0xm6o8UNOJZd/gOkb9ms= github.com/goccy/go-reflect v1.2.0 h1:O0T8rZCuNmGXewnATuKYnkL0xm6o8UNOJZd/gOkb9ms=
@@ -48,14 +50,12 @@ github.com/goccy/go-reflect v1.2.0/go.mod h1:n0oYZn8VcV2CkWTxi8B9QjkCoq6GTtCEdfm
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
github.com/gookit/goutil v0.6.18 h1:MUVj0G16flubWT8zYVicIuisUiHdgirPAkmnfD2kKgw= github.com/gookit/goutil v0.6.18 h1:MUVj0G16flubWT8zYVicIuisUiHdgirPAkmnfD2kKgw=
github.com/gookit/goutil v0.6.18/go.mod h1:AY/5sAwKe7Xck+mEbuxj0n/bc3qwrGNe3Oeulln7zBA= github.com/gookit/goutil v0.6.18/go.mod h1:AY/5sAwKe7Xck+mEbuxj0n/bc3qwrGNe3Oeulln7zBA=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
@@ -73,14 +73,12 @@ github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8
github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4=
github.com/lukaszraczylo/ask v0.0.0-20240916204100-6e9ef53a62d9 h1:pL8B9mjv6RPUfKYYGm/uJ7QL6Ndf+z+OEl0qJE6KmEc= github.com/lukaszraczylo/ask v0.0.0-20240916204100-6e9ef53a62d9 h1:pL8B9mjv6RPUfKYYGm/uJ7QL6Ndf+z+OEl0qJE6KmEc=
github.com/lukaszraczylo/ask v0.0.0-20240916204100-6e9ef53a62d9/go.mod h1:M+UVdyqZs++xtEPrascaVmZdOMhCnxjZ2SgH+xHpR0c= github.com/lukaszraczylo/ask v0.0.0-20240916204100-6e9ef53a62d9/go.mod h1:M+UVdyqZs++xtEPrascaVmZdOMhCnxjZ2SgH+xHpR0c=
github.com/lukaszraczylo/go-simple-graphql v1.2.42 h1:u27/Z6gC+vHLeNwsQ2UIy75LgW80p2wJtAAQrNNfft4= github.com/lukaszraczylo/go-simple-graphql v1.2.51 h1:yovlJ+QcBpcsAyyqU2LyKpPnUL/5TVHcSG1+R/SnYGg=
github.com/lukaszraczylo/go-simple-graphql v1.2.42/go.mod h1:TATbOjdO26pt1S681Sm88nvKEZds3dqInIVtjvi5y40= github.com/lukaszraczylo/go-simple-graphql v1.2.51/go.mod h1:HD/4/Gk69OJ5AM6wS5PxUvLm8+Z/YJ8CjqGwQ7TGhd0=
github.com/lukaszraczylo/graphql-monitoring-proxy v0.25.154 h1:+InKbNRfeViwcEj3J+Coz7fnt6LJjhunsphwrkxwO3Y= github.com/lukaszraczylo/graphql-monitoring-proxy v0.28.57 h1:iVTuG6BLeu+Mzez2nfWoAqpyMo0aedk6Pe/+VTnw8WA=
github.com/lukaszraczylo/graphql-monitoring-proxy v0.25.154/go.mod h1:dFlfc6jT0L2tIhjBq5irRqP4jsYrq3W8nzpf7KTFx+E= github.com/lukaszraczylo/graphql-monitoring-proxy v0.28.57/go.mod h1:biaspbjuH4LHU2HICFJyQjHqIu1ADED5ux+lWqAmMQg=
github.com/lukaszraczylo/pandati v0.0.29 h1:WUEWm1+hWjE5KJbIL8OctG00x2dk4XKGJSlrjhxZ55k= github.com/lukaszraczylo/pandati v0.0.29 h1:WUEWm1+hWjE5KJbIL8OctG00x2dk4XKGJSlrjhxZ55k=
github.com/lukaszraczylo/pandati v0.0.29/go.mod h1:+DyTWKFaXd+jIfe7GW5w2S5PyTko/RXxMyOa+Vl713A= github.com/lukaszraczylo/pandati v0.0.29/go.mod h1:+DyTWKFaXd+jIfe7GW5w2S5PyTko/RXxMyOa+Vl713A=
github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=
github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
@@ -90,8 +88,6 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/melbahja/got v0.7.0 h1:YHbiuNZVS8fIkyV0iXyThQQliwlKZb5h4k80zBVovxg= github.com/melbahja/got v0.7.0 h1:YHbiuNZVS8fIkyV0iXyThQQliwlKZb5h4k80zBVovxg=
github.com/melbahja/got v0.7.0/go.mod h1:27cUstWCEfj6HBESMTGzCFY24Qj+QNMWot3+KuxguQU= github.com/melbahja/got v0.7.0/go.mod h1:27cUstWCEfj6HBESMTGzCFY24Qj+QNMWot3+KuxguQU=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
@@ -103,16 +99,14 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= 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/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= github.com/sagikazarmark/locafero v0.8.0 h1:mXaMVw7IqxNBxfv3LdWt9MDmcWDQ1fagDH918lOdVaQ=
github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= github.com/sagikazarmark/locafero v0.8.0/go.mod h1:UBUyz37V+EdMS3hDF3QWIiVr/2dPrx49OMO0Bn0hJqk=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
@@ -120,16 +114,16 @@ github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnB
github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA=
github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo=
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.20.0 h1:zrxIyR3RQIOsarIrgL8+sAvALXul9jeEPa06Y0Ph6vY=
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/spf13/viper v1.20.0/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -159,10 +153,10 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -170,13 +164,13 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -190,21 +184,21 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/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.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
@@ -214,8 +208,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+1 -1
View File
@@ -30,4 +30,4 @@ func TestMain(t *testing.T) {
// Verify that the version was set correctly // Verify that the version was set correctly
assert.Equal(t, "test-version", cmd.PKG_VERSION, "PKG_VERSION should be set correctly") assert.Equal(t, "test-version", cmd.PKG_VERSION, "PKG_VERSION should be set correctly")
} }