mirror of
https://github.com/lukaszraczylo/semver-generator.git
synced 2026-06-18 01:41:19 +00:00
Compare commits
129 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 30ca55b204 | |||
| afda61e35d | |||
| 03a1d26b9d | |||
| d46b8ca048 | |||
| 41cdd6dcc4 | |||
| 46132856b6 | |||
| c43fcf3216 | |||
| 672b36b8e3 | |||
| ac417365d5 | |||
| bb78eda4ed | |||
| 67751f0d10 | |||
| 35101facae | |||
| 6f34b80600 | |||
| 16f886aa17 | |||
| b45ebf8512 | |||
| 3abb4bb94b | |||
| 1c6617ff45 | |||
| 66ce887688 | |||
| 6fbe13aab1 | |||
| 7d823d0b58 | |||
| 96ef065a43 | |||
| 72915b5129 | |||
| 1a9c3fcb40 | |||
| 358e4cadcf | |||
| 7d0ef8c887 | |||
| 2472ed9871 | |||
| a8151c4d25 | |||
| 72cc786ada | |||
| c83ccec5df | |||
| 26877f4c37 | |||
| 2080b1104b | |||
| e232431fca | |||
| b63b9de52f | |||
| 8b5b72e1a3 | |||
| be568f5bfd | |||
| 9ca830cb87 | |||
| 32a1b725bd | |||
| 7012e93e5f | |||
| 3bcddace61 | |||
| 4415eb90f2 | |||
| a2d7d06b17 | |||
| a4a75b619e | |||
| a9b551073f | |||
| a25375b587 | |||
| 37eb51eca6 | |||
| 0ac160bc2b | |||
| 6cd269fc5d | |||
| 9fa23581e4 | |||
| 8e1d58e7f6 | |||
| 44ceb9c5d7 | |||
| d88ebeb3b2 | |||
| a70e9f218d | |||
| 5de3e8009e | |||
| a4e23b1c46 | |||
| 7e28618738 | |||
| 854aaa2a4d | |||
| 49eca196be | |||
| 450339345f | |||
| 7538c5eb03 | |||
| 859bddaf51 | |||
| e95976d3e5 | |||
| 13c1e7bfc4 | |||
| 10fd0af70d | |||
| 9659b1b689 | |||
| 1c65e8c8ed | |||
| af6c02b2bd | |||
| 6d10c33fc7 | |||
| 7b5e7ed346 | |||
| ba1f0a89a4 | |||
| e17f05a1e0 | |||
| 2ae23430b0 | |||
| 7766cc264e | |||
| 966b9f9db0 | |||
| fe6dfdf3c2 | |||
| 59c2a4edc7 | |||
| ec427ec421 | |||
| 66e0ed606d | |||
| 3b736d7d18 | |||
| 722c6c6653 | |||
| 83fc7a9bb6 | |||
| edb3cea94d | |||
| f0057674d6 | |||
| c107ab6e48 | |||
| 787f1bcde0 | |||
| 73589f0690 | |||
| 0289d8f747 | |||
| 923f979df8 | |||
| f3f8068a2a | |||
| 5c9988fe36 | |||
| 16f297c8a6 | |||
| 90da76eb20 | |||
| d1eef2475c | |||
| 7095f894f6 | |||
| 8c97939434 | |||
| f9895c07df | |||
| f111598564 | |||
| 79385efedc | |||
| 03b220de4d | |||
| 23beba8648 | |||
| 5cb22d25e9 | |||
| 7a4379cd48 | |||
| 3704fdfb2c | |||
| 37b88d49b1 | |||
| 8d796df3aa | |||
| 4ef9e39c1f | |||
| 323c3a8fb5 | |||
| 00579ba4bd | |||
| ec8174477d | |||
| 6ebb050c77 | |||
| d7815d35af | |||
| a96ea957e4 | |||
| 1c2347e08d | |||
| e0c9cee74c | |||
| dad90bca9f | |||
| acfb462f9a | |||
| 18f9e8c1f6 | |||
| 26abda1319 | |||
| d08b1fc31e | |||
| 47f6d0bd51 | |||
| a1bec4b664 | |||
| a51496bfd9 | |||
| a21dc76640 | |||
| c125ebf429 | |||
| 82e451888f | |||
| 3a19de1a44 | |||
| a27f9e76d3 | |||
| 54e35d4c0b | |||
| bed1dbd127 | |||
| 275e9f42ac |
@@ -57,7 +57,7 @@ jobs:
|
||||
test:
|
||||
needs: [ prepare ]
|
||||
name: Code checks pipeline
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-latest
|
||||
container: github/super-linter:v3.15.5
|
||||
env:
|
||||
CI: true
|
||||
@@ -96,7 +96,7 @@ jobs:
|
||||
code_scans:
|
||||
needs: [ prepare ]
|
||||
name: Code scans pipeline
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
|
||||
@@ -1,137 +1,69 @@
|
||||
# Semantic Version Generator
|
||||
## Semantic version generator
|
||||
|
||||
[](https://github.com/lukaszraczylo/semver-generator/actions/workflows/release.yaml)  [](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)
|
||||
- [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 does it work
|
||||
|
||||
## 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)
|
||||
2. Iterates through the commit history, analyzing each commit message
|
||||
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
|
||||
* With flag `-e` or config `force.existing: true` the existing tags in versioning will be respected, helping you to avoid the version conflicts.
|
||||
* With config `force.commit: deadbeef` where `deadbeef` is the commit hash - calculations will start from the specified commit.
|
||||
|
||||
## Key Features
|
||||
### Important changes
|
||||
|
||||
- **Effortless Version Calculation**: Automatically determine the appropriate version based on commit messages
|
||||
- **Configurable Keywords**: Define your own keywords for patch, minor, and major version increments
|
||||
- **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
|
||||
* 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 ).
|
||||
* Added support for blacklisting terms to ignore specific commits, branch names, and merge messages from version calculations.
|
||||
|
||||
## Important Changes
|
||||
### Usage
|
||||
|
||||
- **Since v1.4.2+**: Commits from merge requests are no longer included in calculations
|
||||
- **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
|
||||
#### Authentication
|
||||
|
||||
## Installation
|
||||
|
||||
### Prerequisites
|
||||
|
||||
When using with remote repositories, authentication is required. Set the following environment variables:
|
||||
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 )
|
||||
|
||||
```bash
|
||||
export GITHUB_USERNAME=yourusername
|
||||
export GITHUB_TOKEN=yourpersonalapitoken
|
||||
export GITHUB_USERNAME=lukaszraczylo
|
||||
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**:
|
||||
- Darwin (macOS): ARM64/AMD64
|
||||
- Linux: ARM64/AMD64
|
||||
- Windows: AMD64
|
||||
|
||||
### Docker
|
||||
**Supported OS and architectures:**
|
||||
Darwin ARM64/AMD64, Linux ARM64/AMD64, Windows AMD64
|
||||
|
||||
```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**:
|
||||
- Linux/arm64
|
||||
- Linux/amd64
|
||||
|
||||
### GitHub Action
|
||||
|
||||
Add to your GitHub workflow:
|
||||
**Local repository flag `-l` will always take precedence over remote repository URL**
|
||||
|
||||
```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:
|
||||
semver-gen generate [flags]
|
||||
semver-gen [command]
|
||||
@@ -153,11 +85,86 @@ Flags:
|
||||
-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
|
||||
version: 1
|
||||
@@ -166,8 +173,6 @@ force:
|
||||
minor: 0
|
||||
patch: 1
|
||||
commit: 69fbe2df696f40281b9104ff073d26186cde1024
|
||||
existing: true
|
||||
strict: false
|
||||
blacklist:
|
||||
- "Merge branch"
|
||||
- "Merge pull request"
|
||||
@@ -177,111 +182,25 @@ wording:
|
||||
patch:
|
||||
- update
|
||||
- initial
|
||||
- fix
|
||||
minor:
|
||||
- change
|
||||
- improve
|
||||
- add
|
||||
major:
|
||||
- breaking
|
||||
- redesign
|
||||
- the # For testing purposes
|
||||
release:
|
||||
- release-candidate
|
||||
- add-rc
|
||||
```
|
||||
|
||||
Configuration options:
|
||||
- `version`: Reserved for future backward compatibility
|
||||
- `force`: Set starting version or other constraints
|
||||
- `blacklist`: Terms to ignore when processing commits
|
||||
- `wording`: Keywords that trigger version increments
|
||||
* `version`: is not respected at the moment, introduced for potential backwards compatibility in future
|
||||
* `force`: sets the "starting" version, you don't need to specify this section as the default is always `0`
|
||||
* `force.commit`: allows you to set commit hash from which the calculations should start
|
||||
* `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`: 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:
|
||||
- **MAJOR**: Incremented for incompatible API changes
|
||||
- **MINOR**: Incremented for backward-compatible new features
|
||||
- **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
|
||||
* Word matching uses fuzzy search AND is case INSENSITIVE
|
||||
* I do not recommend using common words ( like "the" from the example configuration )
|
||||
* You can specify env variable `LOG_LEVEL=debug` to see what exactly happens during the calculations
|
||||
|
||||
+13
-12
@@ -26,26 +26,27 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
err error
|
||||
repo *Setup
|
||||
PKG_VERSION string
|
||||
)
|
||||
|
||||
// Setup represents the application setup
|
||||
type Setup struct {
|
||||
RepositoryName string
|
||||
RepositoryBranch string
|
||||
LocalConfigFile string
|
||||
Generate bool
|
||||
UseLocal bool
|
||||
GitRepo utils.GitRepository
|
||||
Config *utils.Config
|
||||
Semver utils.SemVer
|
||||
RepositoryName string
|
||||
RepositoryBranch string
|
||||
LocalConfigFile string
|
||||
Generate bool
|
||||
UseLocal bool
|
||||
GitRepo utils.GitRepository
|
||||
Config *utils.Config
|
||||
Semver utils.SemVer
|
||||
}
|
||||
|
||||
// Initialize the fuzzy search function in the utils package
|
||||
func init() {
|
||||
utils.InitLogger(false) // Will be updated in main based on debug flag
|
||||
|
||||
|
||||
// Set the fuzzy search function
|
||||
utils.FuzzyFind = fuzzy.FindNormalizedFold
|
||||
}
|
||||
@@ -71,12 +72,12 @@ func main() {
|
||||
if PKG_VERSION != latestRelease && latestReleaseOk {
|
||||
outdatedMsg = fmt.Sprintf("(Latest available: %s)", latestRelease)
|
||||
}
|
||||
|
||||
|
||||
utils.Info("semver-gen", map[string]interface{}{
|
||||
"version": PKG_VERSION,
|
||||
"version": PKG_VERSION,
|
||||
"outdated": outdatedMsg,
|
||||
})
|
||||
|
||||
|
||||
if outdatedMsg != "" {
|
||||
utils.Info("semver-gen", map[string]interface{}{
|
||||
"message": "You can update automatically with: semver-gen -u",
|
||||
|
||||
+10
-10
@@ -267,7 +267,7 @@ func (suite *Tests) Test_checkMatches() {
|
||||
if tt.name == "No match" {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
// For other test cases, match if the needle is in the haystack
|
||||
for _, h := range haystack {
|
||||
if strings.Contains(h, needle) || strings.Contains(needle, h) {
|
||||
@@ -276,7 +276,7 @@ func (suite *Tests) Test_checkMatches() {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
got := utils.CheckMatches(tt.args.content, tt.args.targets, tt.blacklist)
|
||||
assertObj.Equal(tt.want, got, "Unexpected result in "+tt.name)
|
||||
})
|
||||
@@ -382,10 +382,10 @@ func (suite *Tests) Test_parseExistingSemver() {
|
||||
|
||||
func (suite *Tests) TestSetup_ListCommits() {
|
||||
type fields struct {
|
||||
RepositoryName string
|
||||
RepositoryBranch string
|
||||
LocalConfigFile string
|
||||
GitRepo utils.GitRepository
|
||||
RepositoryName string
|
||||
RepositoryBranch string
|
||||
LocalConfigFile string
|
||||
GitRepo utils.GitRepository
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
@@ -441,23 +441,23 @@ func (suite *Tests) TestSetup_ListCommits() {
|
||||
if tt.name == "List commits from existing repository" {
|
||||
t.Skip("Skipping test that requires repository access")
|
||||
}
|
||||
|
||||
|
||||
s := &Setup{
|
||||
RepositoryName: tt.fields.RepositoryName,
|
||||
RepositoryBranch: tt.fields.RepositoryBranch,
|
||||
GitRepo: tt.fields.GitRepo,
|
||||
}
|
||||
|
||||
|
||||
config, _ := utils.ReadConfig(tt.fields.LocalConfigFile)
|
||||
s.Config = config
|
||||
|
||||
|
||||
err := utils.PrepareRepository(&s.GitRepo)
|
||||
if err != nil && !tt.wantErr {
|
||||
if tt.name != "List commits starting with certain hash" {
|
||||
t.Fatalf("Failed to prepare repository: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if err == nil {
|
||||
listOfCommits, err := utils.ListCommits(&s.GitRepo)
|
||||
if !tt.wantErr {
|
||||
|
||||
+3
-3
@@ -30,13 +30,13 @@ func TestExecute(t *testing.T) {
|
||||
Short: "Test command",
|
||||
Run: func(cmd *cobra.Command, args []string) {},
|
||||
}
|
||||
|
||||
|
||||
// Add all the required flags to the test command
|
||||
testCmd.Flags().Bool("version", false, "Print version information")
|
||||
testCmd.Flags().String("repository", "test-repo", "Repository URL")
|
||||
testCmd.Flags().String("branch", "test-branch", "Repository branch")
|
||||
testCmd.Flags().String("config", "test-config", "Config file path")
|
||||
|
||||
|
||||
rootCmd = testCmd
|
||||
|
||||
// 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-config", testRepo.LocalConfigFile, "Config file should be set")
|
||||
assertions.True(t, testRepo.UseLocal, "UseLocal should be set to true")
|
||||
}
|
||||
}
|
||||
+6
-6
@@ -34,18 +34,18 @@ type Config struct {
|
||||
// ReadConfig reads the configuration from a file
|
||||
func ReadConfig(file string) (*Config, error) {
|
||||
config := &Config{}
|
||||
|
||||
|
||||
viper.SetConfigFile(file)
|
||||
err := viper.ReadInConfig()
|
||||
if err != nil {
|
||||
err = fmt.Errorf("fatal error config file: %s", err)
|
||||
return config, err
|
||||
}
|
||||
|
||||
|
||||
viper.UnmarshalKey("wording", &config.Wording)
|
||||
viper.UnmarshalKey("force", &config.Force)
|
||||
viper.UnmarshalKey("blacklist", &config.Blacklist)
|
||||
|
||||
|
||||
return config, nil
|
||||
}
|
||||
|
||||
@@ -55,14 +55,14 @@ func ApplyForcedVersioning(force Force, semver *SemVer) {
|
||||
Debug("Forced versioning (MAJOR)", map[string]interface{}{"major": force.Major})
|
||||
semver.Major = force.Major
|
||||
}
|
||||
|
||||
|
||||
if force.Minor > 0 {
|
||||
Debug("Forced versioning (MINOR)", map[string]interface{}{"minor": force.Minor})
|
||||
semver.Minor = force.Minor
|
||||
}
|
||||
|
||||
|
||||
if force.Patch > 0 {
|
||||
Debug("Forced versioning (PATCH)", map[string]interface{}{"patch": force.Patch})
|
||||
semver.Patch = force.Patch
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -198,4 +198,4 @@ wording:
|
||||
// Test reading a non-existent config
|
||||
_, err = ReadConfig("non-existent-file.yaml")
|
||||
assert.Error(t, err)
|
||||
}
|
||||
}
|
||||
+28
-28
@@ -29,14 +29,14 @@ type TagDetails struct {
|
||||
|
||||
// GitRepository represents a git repository
|
||||
type GitRepository struct {
|
||||
Handler *git.Repository
|
||||
Name string
|
||||
Branch string
|
||||
LocalPath string
|
||||
UseLocal bool
|
||||
Commits []CommitDetails
|
||||
Tags []TagDetails
|
||||
StartCommit string
|
||||
Handler *git.Repository
|
||||
Name string
|
||||
Branch string
|
||||
LocalPath string
|
||||
UseLocal bool
|
||||
Commits []CommitDetails
|
||||
Tags []TagDetails
|
||||
StartCommit string
|
||||
}
|
||||
|
||||
// PrepareRepository prepares the git repository for use
|
||||
@@ -47,15 +47,15 @@ func PrepareRepository(repo *GitRepository) error {
|
||||
u, err := url.Parse(repo.Name)
|
||||
if err != nil {
|
||||
Error("Unable to parse repository URL", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
"url": repo.Name,
|
||||
"error": err.Error(),
|
||||
"url": repo.Name,
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
repo.LocalPath = fmt.Sprintf("/tmp/semver/%s/%s", u.Path, repo.Branch)
|
||||
os.RemoveAll(repo.LocalPath)
|
||||
|
||||
|
||||
repo.Handler, err = git.PlainClone(repo.LocalPath, false, &git.CloneOptions{
|
||||
URL: repo.Name,
|
||||
ReferenceName: plumbing.NewBranchReferenceName(repo.Branch),
|
||||
@@ -66,11 +66,11 @@ func PrepareRepository(repo *GitRepository) error {
|
||||
},
|
||||
Tags: git.AllTags,
|
||||
})
|
||||
|
||||
|
||||
if err != nil {
|
||||
Error("Unable to clone repository", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
"url": repo.Name,
|
||||
"error": err.Error(),
|
||||
"url": repo.Name,
|
||||
})
|
||||
return err
|
||||
}
|
||||
@@ -79,13 +79,13 @@ func PrepareRepository(repo *GitRepository) error {
|
||||
repo.Handler, err = git.PlainOpen(repo.LocalPath)
|
||||
if err != nil {
|
||||
Error("Unable to open local repository", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
"path": repo.LocalPath,
|
||||
"error": err.Error(),
|
||||
"path": repo.LocalPath,
|
||||
})
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
os.Chdir(repo.LocalPath)
|
||||
return nil
|
||||
}
|
||||
@@ -105,7 +105,7 @@ func ListCommits(repo *GitRepository) ([]CommitDetails, error) {
|
||||
if err != nil {
|
||||
return []CommitDetails{}, err
|
||||
}
|
||||
|
||||
|
||||
commitsList, err := repo.Handler.Log(&git.LogOptions{From: ref.Hash()})
|
||||
if err != nil {
|
||||
return []CommitDetails{}, err
|
||||
@@ -126,14 +126,14 @@ func ListCommits(repo *GitRepository) ([]CommitDetails, error) {
|
||||
})
|
||||
|
||||
Debug("Listing commits", map[string]interface{}{"commits": tmpResults})
|
||||
|
||||
|
||||
// Filter commits starting from the specified commit if provided
|
||||
if repo.StartCommit != "" {
|
||||
for commitId, cmt := range tmpResults {
|
||||
if cmt.Hash == repo.StartCommit {
|
||||
Debug("Found commit match", map[string]interface{}{
|
||||
"commit": cmt.Hash,
|
||||
"index": commitId,
|
||||
"index": commitId,
|
||||
})
|
||||
repo.Commits = tmpResults[commitId:]
|
||||
break
|
||||
@@ -150,32 +150,32 @@ func ListCommits(repo *GitRepository) ([]CommitDetails, error) {
|
||||
// ListExistingTags lists all tags in the repository
|
||||
func ListExistingTags(repo *GitRepository) {
|
||||
Debug("Listing existing tags", nil)
|
||||
|
||||
|
||||
// Check if Handler is nil to avoid panic
|
||||
if repo.Handler == nil {
|
||||
Debug("Repository handler is nil, skipping tag listing", nil)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
refs, err := repo.Handler.Tags()
|
||||
if err != nil {
|
||||
Error("Unable to list tags", map[string]interface{}{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
if err := refs.ForEach(func(ref *plumbing.Reference) error {
|
||||
repo.Tags = append(repo.Tags, TagDetails{
|
||||
Name: ref.Name().Short(),
|
||||
Hash: ref.Hash().String(),
|
||||
})
|
||||
|
||||
|
||||
Debug("Found tag", map[string]interface{}{
|
||||
"tag": ref.Name().Short(),
|
||||
"tag": ref.Name().Short(),
|
||||
"hash": ref.Hash().String(),
|
||||
})
|
||||
|
||||
|
||||
return nil
|
||||
}); err != nil {
|
||||
Error("Error iterating tags", map[string]interface{}{"error": err.Error()})
|
||||
}
|
||||
}
|
||||
}
|
||||
+13
-13
@@ -64,7 +64,7 @@ func TestListCommits(t *testing.T) {
|
||||
t.Run("Test commit filtering logic", func(t *testing.T) {
|
||||
// Create a test repository with predefined commits
|
||||
repo := &GitRepository{}
|
||||
|
||||
|
||||
// Manually populate the commits for testing
|
||||
repo.Commits = []CommitDetails{
|
||||
{
|
||||
@@ -83,7 +83,7 @@ func TestListCommits(t *testing.T) {
|
||||
|
||||
// Test with StartCommit specified
|
||||
repo.StartCommit = "def456"
|
||||
|
||||
|
||||
// Instead of calling ListCommits which would try to use the nil Handler,
|
||||
// we'll just test the filtering logic directly
|
||||
if repo.StartCommit != "" {
|
||||
@@ -94,19 +94,19 @@ func TestListCommits(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Verify the filtering worked correctly
|
||||
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")
|
||||
})
|
||||
|
||||
|
||||
t.Run("Test with nil Handler", func(t *testing.T) {
|
||||
// Create a test repository with nil Handler
|
||||
repo := &GitRepository{}
|
||||
|
||||
|
||||
// Now we can safely call ListCommits since we've added a nil check
|
||||
commits, err := ListCommits(repo)
|
||||
|
||||
|
||||
// Verify the function returns without error
|
||||
assert.NoError(t, err, "Should not error 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) {
|
||||
// Create a test repository
|
||||
repo := &GitRepository{}
|
||||
|
||||
|
||||
// Since we can't test the actual git operations, we'll test the function's behavior
|
||||
// by manually setting up the repository state
|
||||
|
||||
|
||||
// Manually add tags to verify they're processed correctly
|
||||
repo.Tags = []TagDetails{
|
||||
{
|
||||
@@ -131,20 +131,20 @@ func TestListExistingTags(t *testing.T) {
|
||||
Hash: "abc123",
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
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, "abc123", repo.Tags[0].Hash, "Tag hash should match")
|
||||
})
|
||||
|
||||
|
||||
t.Run("Test with nil Handler", func(t *testing.T) {
|
||||
// Create a test repository with nil Handler
|
||||
repo := &GitRepository{}
|
||||
|
||||
|
||||
// Now we can safely call ListExistingTags since we've added a nil check
|
||||
ListExistingTags(repo)
|
||||
|
||||
|
||||
// Verify no tags were added
|
||||
assert.Empty(t, repo.Tags, "Should have no tags after calling with nil Handler")
|
||||
})
|
||||
}
|
||||
}
|
||||
+19
-19
@@ -21,7 +21,7 @@ func UpdatePackage() bool {
|
||||
|
||||
binaryName := fmt.Sprintf("semver-gen-%s-%s", runtime.GOOS, runtime.GOARCH)
|
||||
Info("Checking for updates", map[string]interface{}{"binaryName": binaryName})
|
||||
|
||||
|
||||
gql := graphql.NewConnection()
|
||||
gql.SetEndpoint("https://api.github.com/graphql")
|
||||
gql.SetOutput("mapstring")
|
||||
@@ -29,11 +29,11 @@ func UpdatePackage() bool {
|
||||
headers := map[string]interface{}{
|
||||
"Authorization": fmt.Sprintf("Bearer %s", ghToken),
|
||||
}
|
||||
|
||||
|
||||
variables := map[string]interface{}{
|
||||
"binaryName": binaryName,
|
||||
}
|
||||
|
||||
|
||||
var query = `query ($binaryName: String) {
|
||||
repository(name: "semver-generator", owner: "lukaszraczylo") {
|
||||
latestRelease {
|
||||
@@ -48,7 +48,7 @@ func UpdatePackage() bool {
|
||||
}
|
||||
}
|
||||
}`
|
||||
|
||||
|
||||
result, err := gql.Query(query, variables, headers)
|
||||
if err != nil {
|
||||
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("")
|
||||
if !ok {
|
||||
Error("Unable to obtain download url for the binary", map[string]interface{}{
|
||||
"binary": binaryName,
|
||||
"binary": binaryName,
|
||||
"output": output,
|
||||
})
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
// Skip actual download in test mode
|
||||
if flag.Lookup("test.v") == nil && os.Getenv("CI") == "" {
|
||||
downloadedBinaryPath := fmt.Sprintf("/tmp/%s", binaryName)
|
||||
@@ -71,12 +71,12 @@ func UpdatePackage() bool {
|
||||
err = g.Download(output, downloadedBinaryPath)
|
||||
if err != nil {
|
||||
Error("Unable to download binary", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
"error": err.Error(),
|
||||
"binaryPath": downloadedBinaryPath,
|
||||
})
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
currentBinary, err := os.Executable()
|
||||
if err != nil {
|
||||
Error("Unable to obtain current binary path", map[string]interface{}{
|
||||
@@ -84,7 +84,7 @@ func UpdatePackage() bool {
|
||||
})
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
err = os.Rename(downloadedBinaryPath, currentBinary)
|
||||
if err != nil {
|
||||
Error("Unable to overwrite current binary", map[string]interface{}{
|
||||
@@ -92,7 +92,7 @@ func UpdatePackage() bool {
|
||||
})
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
err = os.Chmod(currentBinary, 0777)
|
||||
if err != nil {
|
||||
Error("Unable to make binary executable", map[string]interface{}{
|
||||
@@ -101,7 +101,7 @@ func UpdatePackage() bool {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -111,16 +111,16 @@ func CheckLatestRelease() (string, bool) {
|
||||
if !ghTokenSet {
|
||||
return "[no GITHUB_TOKEN set]", false
|
||||
}
|
||||
|
||||
|
||||
gql := graphql.NewConnection()
|
||||
gql.SetEndpoint("https://api.github.com/graphql")
|
||||
|
||||
|
||||
headers := map[string]interface{}{
|
||||
"Authorization": fmt.Sprintf("bearer %s", ghToken),
|
||||
}
|
||||
|
||||
|
||||
variables := map[string]interface{}{}
|
||||
|
||||
|
||||
var query = `query {
|
||||
repository(name: "semver-generator", owner: "lukaszraczylo", followRenames: true) {
|
||||
releases(last: 2) {
|
||||
@@ -132,17 +132,17 @@ func CheckLatestRelease() (string, bool) {
|
||||
}
|
||||
}
|
||||
}`
|
||||
|
||||
|
||||
result, err := gql.Query(query, variables, headers)
|
||||
if err != nil {
|
||||
Error("Unable to query GitHub API", map[string]interface{}{"error": err.Error()})
|
||||
return "", false
|
||||
}
|
||||
|
||||
|
||||
output, _ := ask.For(result, "repository.releases.nodes[0].tag.name").String("")
|
||||
if output == "v1" {
|
||||
output, _ = ask.For(result, "repository.releases.nodes[1].tag.name").String("")
|
||||
}
|
||||
|
||||
|
||||
return output, true
|
||||
}
|
||||
}
|
||||
@@ -63,4 +63,4 @@ func TestUpdatePackage(t *testing.T) {
|
||||
}
|
||||
|
||||
// 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.
|
||||
@@ -56,4 +56,4 @@ func Critical(message string, pairs map[string]interface{}) {
|
||||
Pairs: pairs,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestInitLogger(t *testing.T) {
|
||||
// Test with debug mode enabled
|
||||
logger := InitLogger(true)
|
||||
@@ -26,10 +25,10 @@ func TestLoggingFunctions(t *testing.T) {
|
||||
Debug("Debug message", map[string]interface{}{"key": "value"})
|
||||
Info("Info message", map[string]interface{}{"key": "value"})
|
||||
Error("Error message", map[string]interface{}{"key": "value"})
|
||||
|
||||
|
||||
// Skip testing Critical as it might call os.Exit
|
||||
// Critical("Critical message", map[string]interface{}{"key": "value"})
|
||||
|
||||
|
||||
// Test passes if we get here without panicking
|
||||
assert.True(t, true)
|
||||
}
|
||||
@@ -44,10 +43,10 @@ func TestLoggingWithNilLogger(t *testing.T) {
|
||||
Debug("Debug message", map[string]interface{}{"key": "value"})
|
||||
Info("Info message", map[string]interface{}{"key": "value"})
|
||||
Error("Error message", map[string]interface{}{"key": "value"})
|
||||
|
||||
|
||||
// Skip testing Critical as it might call os.Exit
|
||||
// Critical("Critical message", map[string]interface{}{"key": "value"})
|
||||
|
||||
|
||||
// Test passes if we get here without panicking
|
||||
assert.True(t, true)
|
||||
}
|
||||
@@ -57,15 +56,15 @@ func TestCriticalNilLogger(t *testing.T) {
|
||||
// Save original logger and restore after test
|
||||
originalLogger := Logger
|
||||
defer func() { Logger = originalLogger }()
|
||||
|
||||
|
||||
// Set logger to nil
|
||||
Logger = nil
|
||||
|
||||
|
||||
// This should not panic
|
||||
Critical("Critical message", map[string]interface{}{"key": "value"})
|
||||
|
||||
|
||||
// Test passes if we get here without panicking
|
||||
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
@@ -22,7 +22,7 @@ func CalculateSemver(
|
||||
for _, tagHash := range tags {
|
||||
if commit.Hash == tagHash.Hash {
|
||||
Debug("Found existing tag", map[string]interface{}{
|
||||
"tag": tagHash.Name,
|
||||
"tag": tagHash.Name,
|
||||
"commit": strings.TrimSuffix(commit.Message, "\n"),
|
||||
})
|
||||
semver = ParseExistingSemver(tagHash.Name, semver)
|
||||
@@ -35,7 +35,7 @@ func CalculateSemver(
|
||||
if !strictMode {
|
||||
semver.Patch++
|
||||
Debug("Incrementing patch (DEFAULT)", map[string]interface{}{
|
||||
"commit": strings.TrimSuffix(commit.Message, "\n"),
|
||||
"commit": strings.TrimSuffix(commit.Message, "\n"),
|
||||
"semver": FormatSemver(semver),
|
||||
})
|
||||
}
|
||||
@@ -55,44 +55,44 @@ func CalculateSemver(
|
||||
semver.EnableReleaseCandidate = false
|
||||
semver.Release = 0
|
||||
Debug("Incrementing major (WORDING)", map[string]interface{}{
|
||||
"commit": strings.TrimSuffix(commit.Message, "\n"),
|
||||
"commit": strings.TrimSuffix(commit.Message, "\n"),
|
||||
"semver": FormatSemver(semver),
|
||||
})
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
if matchMinor {
|
||||
semver.Minor++
|
||||
semver.Patch = 1
|
||||
semver.EnableReleaseCandidate = false
|
||||
semver.Release = 0
|
||||
Debug("Incrementing minor (WORDING)", map[string]interface{}{
|
||||
"commit": strings.TrimSuffix(commit.Message, "\n"),
|
||||
"commit": strings.TrimSuffix(commit.Message, "\n"),
|
||||
"semver": FormatSemver(semver),
|
||||
})
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
if matchReleaseCandidate {
|
||||
semver.Release++
|
||||
semver.Patch = 1
|
||||
semver.EnableReleaseCandidate = true
|
||||
Debug("Incrementing release candidate (WORDING)", map[string]interface{}{
|
||||
"commit": strings.TrimSuffix(commit.Message, "\n"),
|
||||
"commit": strings.TrimSuffix(commit.Message, "\n"),
|
||||
"semver": FormatSemver(semver),
|
||||
})
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
if matchPatch {
|
||||
semver.Patch++
|
||||
Debug("Incrementing patch (WORDING)", map[string]interface{}{
|
||||
"commit": strings.TrimSuffix(commit.Message, "\n"),
|
||||
"commit": strings.TrimSuffix(commit.Message, "\n"),
|
||||
"semver": FormatSemver(semver),
|
||||
})
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return semver
|
||||
}
|
||||
}
|
||||
+11
-11
@@ -19,7 +19,7 @@ func TestCalculateSemver(t *testing.T) {
|
||||
// More sophisticated mock implementation for testing
|
||||
for _, h := range haystack {
|
||||
// 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:])) {
|
||||
return []string{h}
|
||||
}
|
||||
@@ -29,7 +29,7 @@ func TestCalculateSemver(t *testing.T) {
|
||||
|
||||
// Test data
|
||||
now := time.Now()
|
||||
|
||||
|
||||
// Common wording and blacklist for all tests
|
||||
wording := Wording{
|
||||
Patch: []string{"update", "fix", "initial"},
|
||||
@@ -77,10 +77,10 @@ func TestCalculateSemver(t *testing.T) {
|
||||
respectExisting: true,
|
||||
strictMode: false,
|
||||
want: SemVer{
|
||||
Major: 2,
|
||||
Minor: 0,
|
||||
Patch: 1, // Initial tag 2.0.0 + one patch increment
|
||||
Release: 1,
|
||||
Major: 2,
|
||||
Minor: 0,
|
||||
Patch: 1, // Initial tag 2.0.0 + one patch increment
|
||||
Release: 1,
|
||||
EnableReleaseCandidate: true,
|
||||
},
|
||||
},
|
||||
@@ -110,10 +110,10 @@ func TestCalculateSemver(t *testing.T) {
|
||||
respectExisting: true,
|
||||
strictMode: true,
|
||||
want: SemVer{
|
||||
Major: 2,
|
||||
Minor: 0,
|
||||
Patch: 1, // Initial tag 2.0.0 + patch from "update" keyword
|
||||
Release: 1,
|
||||
Major: 2,
|
||||
Minor: 0,
|
||||
Patch: 1, // Initial tag 2.0.0 + patch from "update" keyword
|
||||
Release: 1,
|
||||
EnableReleaseCandidate: true,
|
||||
},
|
||||
},
|
||||
@@ -254,4 +254,4 @@ func TestCalculateSemver(t *testing.T) {
|
||||
assert.Equal(t, tt.want.EnableReleaseCandidate, got.EnableReleaseCandidate, "EnableReleaseCandidate mismatch")
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
+13
-13
@@ -54,33 +54,33 @@ var extractNumber = regexp.MustCompile("[0-9]+")
|
||||
// ParseExistingSemver parses a semantic version from a tag name
|
||||
func ParseExistingSemver(tagName string, currentSemver SemVer) SemVer {
|
||||
Debug("Parsing existing semver", map[string]interface{}{"tag": tagName})
|
||||
|
||||
|
||||
tagNameParts := strings.Split(tagName, ".")
|
||||
if len(tagNameParts) < 3 {
|
||||
Debug("Unable to parse incompatible semver (non x.y.z)", map[string]interface{}{"tag": tagName})
|
||||
return currentSemver
|
||||
}
|
||||
|
||||
|
||||
semanticVersion := SemVer{}
|
||||
|
||||
|
||||
// Extract major version
|
||||
majorMatches := extractNumber.FindAllString(tagNameParts[0], -1)
|
||||
if len(majorMatches) > 0 {
|
||||
semanticVersion.Major, _ = strconv.Atoi(majorMatches[0])
|
||||
}
|
||||
|
||||
|
||||
// Extract minor version
|
||||
minorMatches := extractNumber.FindAllString(tagNameParts[1], -1)
|
||||
if len(minorMatches) > 0 {
|
||||
semanticVersion.Minor, _ = strconv.Atoi(minorMatches[0])
|
||||
}
|
||||
|
||||
|
||||
// Extract patch version
|
||||
patchMatches := extractNumber.FindAllString(tagNameParts[2], -1)
|
||||
if len(patchMatches) > 0 {
|
||||
semanticVersion.Patch, _ = strconv.Atoi(patchMatches[0])
|
||||
}
|
||||
|
||||
|
||||
// Extract release candidate version if present
|
||||
if len(tagNameParts) > 3 {
|
||||
releaseMatches := extractNumber.FindAllString(tagNameParts[3], -1)
|
||||
@@ -89,14 +89,14 @@ func ParseExistingSemver(tagName string, currentSemver SemVer) SemVer {
|
||||
semanticVersion.EnableReleaseCandidate = true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return semanticVersion
|
||||
}
|
||||
|
||||
// CheckMatches checks if any of the targets match the content
|
||||
func CheckMatches(content []string, targets []string, blacklist []string) bool {
|
||||
contentStr := strings.Join(content, " ")
|
||||
|
||||
|
||||
// First check if any target matches
|
||||
hasMatch := false
|
||||
for _, tgt := range targets {
|
||||
@@ -104,8 +104,8 @@ func CheckMatches(content []string, targets []string, blacklist []string) bool {
|
||||
if len(matches) > 0 {
|
||||
hasMatch = true
|
||||
Debug("Found match", map[string]interface{}{
|
||||
"target": tgt,
|
||||
"match": strings.Join(matches, ","),
|
||||
"target": tgt,
|
||||
"match": strings.Join(matches, ","),
|
||||
"content": contentStr,
|
||||
})
|
||||
break
|
||||
@@ -117,14 +117,14 @@ func CheckMatches(content []string, targets []string, blacklist []string) bool {
|
||||
for _, blacklistTerm := range blacklist {
|
||||
if strings.Contains(strings.ToLower(contentStr), strings.ToLower(blacklistTerm)) {
|
||||
Debug("Blacklisted term detected, ignoring commit", map[string]interface{}{
|
||||
"content": contentStr,
|
||||
"content": contentStr,
|
||||
"blacklist_term": blacklistTerm,
|
||||
})
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return hasMatch
|
||||
}
|
||||
|
||||
@@ -132,4 +132,4 @@ func CheckMatches(content []string, targets []string, blacklist []string) bool {
|
||||
var FuzzyFind = func(needle string, haystack []string) []string {
|
||||
// This will be replaced with the actual implementation in main.go
|
||||
return nil
|
||||
}
|
||||
}
|
||||
+10
-10
@@ -58,14 +58,14 @@ func TestParseExistingSemver(t *testing.T) {
|
||||
InitLogger(false)
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
tagName string
|
||||
name string
|
||||
tagName string
|
||||
currentSemver SemVer
|
||||
want SemVer
|
||||
want SemVer
|
||||
}{
|
||||
{
|
||||
name: "Standard semver",
|
||||
tagName: "1.2.3",
|
||||
name: "Standard semver",
|
||||
tagName: "1.2.3",
|
||||
currentSemver: SemVer{},
|
||||
want: SemVer{
|
||||
Major: 1,
|
||||
@@ -74,8 +74,8 @@ func TestParseExistingSemver(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "With v prefix",
|
||||
tagName: "v2.3.4",
|
||||
name: "With v prefix",
|
||||
tagName: "v2.3.4",
|
||||
currentSemver: SemVer{},
|
||||
want: SemVer{
|
||||
Major: 2,
|
||||
@@ -84,8 +84,8 @@ func TestParseExistingSemver(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "With release candidate",
|
||||
tagName: "3.4.5-rc.2",
|
||||
name: "With release candidate",
|
||||
tagName: "3.4.5-rc.2",
|
||||
currentSemver: SemVer{},
|
||||
want: SemVer{
|
||||
Major: 3,
|
||||
@@ -196,4 +196,4 @@ func TestCheckMatches(t *testing.T) {
|
||||
assert.Equal(t, tt.want, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,58 +1,54 @@
|
||||
module github.com/lukaszraczylo/semver-generator
|
||||
|
||||
go 1.23.0
|
||||
go 1.24.0
|
||||
|
||||
toolchain go1.23.6
|
||||
toolchain go1.24.6
|
||||
|
||||
require (
|
||||
github.com/go-git/go-git/v5 v5.13.2
|
||||
github.com/go-git/go-git/v5 v5.16.4
|
||||
github.com/lithammer/fuzzysearch v1.1.8
|
||||
github.com/lukaszraczylo/ask v0.0.0-20240916204100-6e9ef53a62d9
|
||||
github.com/lukaszraczylo/go-simple-graphql v1.2.42
|
||||
github.com/lukaszraczylo/graphql-monitoring-proxy v0.25.154
|
||||
github.com/lukaszraczylo/go-simple-graphql v1.2.89
|
||||
github.com/lukaszraczylo/graphql-monitoring-proxy v0.41.9
|
||||
github.com/lukaszraczylo/pandati v0.0.29
|
||||
github.com/melbahja/got v0.7.0
|
||||
github.com/spf13/cobra v1.9.1
|
||||
github.com/spf13/viper v1.19.0
|
||||
github.com/stretchr/testify v1.10.0
|
||||
github.com/spf13/cobra v1.10.1
|
||||
github.com/spf13/viper v1.21.0
|
||||
github.com/stretchr/testify v1.11.1
|
||||
)
|
||||
|
||||
require (
|
||||
dario.cat/mergo v1.0.1 // indirect
|
||||
dario.cat/mergo v1.0.2 // indirect
|
||||
github.com/Microsoft/go-winio v0.6.2 // indirect
|
||||
github.com/ProtonMail/go-crypto v1.1.5 // indirect
|
||||
github.com/avast/retry-go/v4 v4.6.1 // indirect
|
||||
github.com/cloudflare/circl v1.6.0 // indirect
|
||||
github.com/cyphar/filepath-securejoin v0.4.1 // indirect
|
||||
github.com/ProtonMail/go-crypto v1.3.0 // indirect
|
||||
github.com/avast/retry-go/v4 v4.7.0 // indirect
|
||||
github.com/cloudflare/circl v1.6.1 // indirect
|
||||
github.com/cyphar/filepath-securejoin v0.6.1 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/emirpasic/gods v1.18.1 // indirect
|
||||
github.com/fsnotify/fsnotify v1.8.0 // indirect
|
||||
github.com/fsnotify/fsnotify v1.9.0 // 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-viper/mapstructure/v2 v2.4.0 // indirect
|
||||
github.com/goccy/go-json v0.10.5 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
|
||||
github.com/gookit/color v1.5.4 // indirect
|
||||
github.com/gookit/goutil v0.6.18 // indirect
|
||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||
github.com/gookit/goutil v0.7.2 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
||||
github.com/kevinburke/ssh_config v1.2.0 // indirect
|
||||
github.com/magiconair/properties v1.8.9 // indirect
|
||||
github.com/kevinburke/ssh_config v1.4.0 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.14 // 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/pjbgf/sha1cd v0.3.2 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||||
github.com/pjbgf/sha1cd v0.5.0 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/rs/zerolog v1.33.0 // indirect
|
||||
github.com/sagikazarmark/locafero v0.7.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/skeema/knownhosts v1.3.1 // indirect
|
||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
||||
github.com/spf13/afero v1.12.0 // indirect
|
||||
github.com/spf13/cast v1.7.1 // indirect
|
||||
github.com/spf13/pflag v1.0.6 // indirect
|
||||
github.com/sagikazarmark/locafero v0.12.0 // indirect
|
||||
github.com/sergi/go-diff v1.4.0 // indirect
|
||||
github.com/skeema/knownhosts v1.3.2 // indirect
|
||||
github.com/spf13/afero v1.15.0 // indirect
|
||||
github.com/spf13/cast v1.10.0 // indirect
|
||||
github.com/spf13/pflag v1.0.10 // indirect
|
||||
github.com/subosito/gotenv v1.6.0 // indirect
|
||||
github.com/tidwall/gjson v1.18.0 // indirect
|
||||
github.com/tidwall/match v1.1.1 // indirect
|
||||
@@ -60,16 +56,14 @@ require (
|
||||
github.com/tidwall/sjson v1.2.5 // indirect
|
||||
github.com/wI2L/jsondiff v0.6.1 // indirect
|
||||
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
||||
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/crypto v0.35.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect
|
||||
golang.org/x/net v0.35.0 // indirect
|
||||
golang.org/x/sync v0.11.0 // indirect
|
||||
golang.org/x/sys v0.30.0 // indirect
|
||||
golang.org/x/term v0.29.0 // indirect
|
||||
golang.org/x/text v0.22.0 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
||||
golang.org/x/crypto v0.45.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect
|
||||
golang.org/x/net v0.47.0 // indirect
|
||||
golang.org/x/sync v0.18.0 // indirect
|
||||
golang.org/x/sys v0.38.0 // indirect
|
||||
golang.org/x/term v0.37.0 // indirect
|
||||
golang.org/x/text v0.31.0 // indirect
|
||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
||||
@@ -1,36 +1,36 @@
|
||||
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
|
||||
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
|
||||
dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8=
|
||||
dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA=
|
||||
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/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
|
||||
github.com/ProtonMail/go-crypto v1.1.5 h1:eoAQfK2dwL+tFSFpr7TbOaPNUbPiJj4fLYwwGE1FQO4=
|
||||
github.com/ProtonMail/go-crypto v1.1.5/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
|
||||
github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw=
|
||||
github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE=
|
||||
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/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||
github.com/avast/retry-go/v4 v4.6.1 h1:VkOLRubHdisGrHnTu89g08aQEWEgRU7LVEop3GbIcMk=
|
||||
github.com/avast/retry-go/v4 v4.6.1/go.mod h1:V6oF8njAwxJ5gRo1Q7Cxab24xs5NCWZBeaHHBklR8mA=
|
||||
github.com/avast/retry-go/v4 v4.7.0 h1:yjDs35SlGvKwRNSykujfjdMxMhMQQM0TnIjJaHB+Zio=
|
||||
github.com/avast/retry-go/v4 v4.7.0/go.mod h1:ZMPDa3sY2bKgpLtap9JRUgk2yTAba7cgiFhqxY2Sg6Q=
|
||||
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
|
||||
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
||||
github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk=
|
||||
github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
||||
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
|
||||
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
||||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||
github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s=
|
||||
github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
|
||||
github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE=
|
||||
github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc=
|
||||
github.com/davecgh/go-spew v1.1.0/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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/elazarl/goproxy v1.4.0 h1:4GyuSbFa+s26+3rmYNSuUVsx+HgPrV1bk1jXI0l9wjM=
|
||||
github.com/elazarl/goproxy v1.4.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ=
|
||||
github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
|
||||
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/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
|
||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
|
||||
github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
|
||||
github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=
|
||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
|
||||
@@ -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-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/v5 v5.13.2 h1:7O7xvsK7K+rZPKW6AQR1YyNhfywkv7B8/FsP3ki6Zv0=
|
||||
github.com/go-git/go-git/v5 v5.13.2/go.mod h1:hWdW5P4YZRjmpGHwRH2v3zkWcNl6HeXaXQEMGb3NJ9A=
|
||||
github.com/go-git/go-git/v5 v5.16.4 h1:7ajIEZHZJULcyJebDLo99bGgS0jRrOxzZG4uCk2Yb2Y=
|
||||
github.com/go-git/go-git/v5 v5.16.4/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8=
|
||||
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
|
||||
github.com/go-viper/mapstructure/v2 v2.4.0/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/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
||||
github.com/goccy/go-reflect v1.2.0 h1:O0T8rZCuNmGXewnATuKYnkL0xm6o8UNOJZd/gOkb9ms=
|
||||
@@ -48,20 +50,18 @@ 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/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/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
|
||||
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/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/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/gookit/goutil v0.7.2 h1:NSiqWWY+BT0MwIlKDeSVPfQmr9xTkkAqwDjhplobdgo=
|
||||
github.com/gookit/goutil v0.7.2/go.mod h1:vJS9HXctYTCLtCsZot5L5xF+O1oR17cDYO9R0HxBmnU=
|
||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
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/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
|
||||
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
||||
github.com/kevinburke/ssh_config v1.4.0 h1:6xxtP5bZ2E4NF5tuQulISpTO2z8XbtH8cg1PWkxoFkQ=
|
||||
github.com/kevinburke/ssh_config v1.4.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M=
|
||||
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
|
||||
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
@@ -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/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/go-simple-graphql v1.2.42 h1:u27/Z6gC+vHLeNwsQ2UIy75LgW80p2wJtAAQrNNfft4=
|
||||
github.com/lukaszraczylo/go-simple-graphql v1.2.42/go.mod h1:TATbOjdO26pt1S681Sm88nvKEZds3dqInIVtjvi5y40=
|
||||
github.com/lukaszraczylo/graphql-monitoring-proxy v0.25.154 h1:+InKbNRfeViwcEj3J+Coz7fnt6LJjhunsphwrkxwO3Y=
|
||||
github.com/lukaszraczylo/graphql-monitoring-proxy v0.25.154/go.mod h1:dFlfc6jT0L2tIhjBq5irRqP4jsYrq3W8nzpf7KTFx+E=
|
||||
github.com/lukaszraczylo/go-simple-graphql v1.2.89 h1:Xbu1Ny+a0lT2Sr2SaSC8mcHmGQDwGD4TJKk4DDd+PwA=
|
||||
github.com/lukaszraczylo/go-simple-graphql v1.2.89/go.mod h1:PxQYblQDZISmYYj8sNfazAWxAOh1rhAtU208y+uPV8s=
|
||||
github.com/lukaszraczylo/graphql-monitoring-proxy v0.41.9 h1:5qGh0lgM/nXZSet8aA2L8N3v7XJD62qK7BW9pnNETWE=
|
||||
github.com/lukaszraczylo/graphql-monitoring-proxy v0.41.9/go.mod h1:pCBFnL+NZ0S7QzTgROP7AIR8lP3uIgcL3lc+cbGTMHE=
|
||||
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/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.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
|
||||
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
|
||||
@@ -90,51 +88,46 @@ 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/melbahja/got v0.7.0 h1:YHbiuNZVS8fIkyV0iXyThQQliwlKZb5h4k80zBVovxg=
|
||||
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/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/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
|
||||
github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4=
|
||||
github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
||||
github.com/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0=
|
||||
github.com/pjbgf/sha1cd v0.5.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0/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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
||||
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
||||
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/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
|
||||
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/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
|
||||
github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=
|
||||
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/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
|
||||
github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4=
|
||||
github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI=
|
||||
github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
|
||||
github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
|
||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8=
|
||||
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/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
|
||||
github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
|
||||
github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
|
||||
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
|
||||
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/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
|
||||
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/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
|
||||
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
|
||||
github.com/skeema/knownhosts v1.3.2 h1:EDL9mgf4NzwMXCTfaxSD/o/a5fxDw/xL9nkU28JjdBg=
|
||||
github.com/skeema/knownhosts v1.3.2/go.mod h1:bEg3iQAuw+jyiw+484wwFJoKSLwcfd7fqRy+N0QTiow=
|
||||
github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
|
||||
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
|
||||
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
|
||||
github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
|
||||
github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
|
||||
github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
|
||||
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
|
||||
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
|
||||
github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
|
||||
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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
||||
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
|
||||
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||
@@ -151,18 +144,16 @@ github.com/wI2L/jsondiff v0.6.1 h1:ISZb9oNWbP64LHnu4AUhsMF5W0FIj5Ok3Krip9Shqpw=
|
||||
github.com/wI2L/jsondiff v0.6.1/go.mod h1:KAEIojdQq66oJiHhDyQez2x+sRit0vIzC9KeK0yizxM=
|
||||
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
|
||||
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
|
||||
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
|
||||
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
|
||||
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
|
||||
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-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
|
||||
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
|
||||
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4=
|
||||
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
|
||||
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
|
||||
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
|
||||
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
|
||||
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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
@@ -170,13 +161,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-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.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
|
||||
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
|
||||
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
|
||||
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
|
||||
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
|
||||
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
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-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
@@ -190,21 +181,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.6.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.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
|
||||
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
|
||||
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
|
||||
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
|
||||
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.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.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.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
|
||||
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
|
||||
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
|
||||
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
|
||||
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.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
@@ -214,8 +205,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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
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/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
|
||||
+1
-1
@@ -30,4 +30,4 @@ func TestMain(t *testing.T) {
|
||||
|
||||
// Verify that the version was set correctly
|
||||
assert.Equal(t, "test-version", cmd.PKG_VERSION, "PKG_VERSION should be set correctly")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user