This commit is contained in:
Izrafil Archimedes
2026-02-23 09:20:56 +01:00
commit fccdc61545
18 changed files with 1595 additions and 0 deletions

View File

@@ -0,0 +1,302 @@
[
{
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef",
"sha": "deadbeef",
"created": "2024-04-23T13:20:33+12:00",
"html_url": "https://gitea.zexlab.dev/owner/test-repo/commit/deadbeef",
"commit": {
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef",
"author": {
"name": "A User",
"email": "owner@noreply.zexlab.dev",
"date": "2024-04-23T13:20:33+12:00"
},
"committer": {
"name": "A User",
"email": "owner@noreply.zexlab.dev",
"date": "2024-04-23T13:20:33+12:00"
},
"message": "fix: Removed lint as not go project\n",
"tree": {
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/trees/deadbeef",
"sha": "deadbeef",
"created": "2024-04-23T13:20:33+12:00"
},
"verification": {
"verified": false,
"reason": "gpg.error.not_signed_commit",
"signature": "",
"signer": null,
"payload": ""
}
},
"author": {
"id": 1,
"login": "owner",
"login_name": "",
"source_id": 0,
"full_name": "A User",
"email": "owner@noreply.zexlab.dev",
"avatar_url": "https://secure.gravatar.com/avatar/ahash?d=identicon",
"html_url": "https://gitea.zexlab.dev/owner",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2021-05-05T11:08:04+12:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "owner"
},
"committer": {
"id": 1,
"login": "owner",
"login_name": "",
"source_id": 0,
"full_name": "A User",
"email": "owner@noreply.zexlab.dev",
"avatar_url": "https://secure.gravatar.com/avatar/ahash?d=identicon",
"html_url": "https://gitea.zexlab.dev/owner",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2021-05-05T11:08:04+12:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "owner"
},
"parents": [
{
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef",
"sha": "deadbeef",
"created": "0001-01-01T00:00:00Z"
}
],
"files": [
{
"filename": ".gitea/workflows/.ci.yml",
"status": "modified"
}
],
"stats": {
"total": 16,
"additions": 8,
"deletions": 8
}
},
{
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef",
"sha": "deadbeef",
"created": "2024-04-23T13:17:11+12:00",
"html_url": "https://gitea.zexlab.dev/owner/test-repo/commit/deadbeef",
"commit": {
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef",
"author": {
"name": "A User",
"email": "owner@noreply.zexlab.dev",
"date": "2024-04-23T13:17:11+12:00"
},
"committer": {
"name": "A User",
"email": "owner@noreply.zexlab.dev",
"date": "2024-04-23T13:17:11+12:00"
},
"message": "fix: Oops, need a tidyup\n",
"tree": {
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/trees/deadbeef",
"sha": "deadbeef",
"created": "2024-04-23T13:17:11+12:00"
},
"verification": {
"verified": false,
"reason": "gpg.error.not_signed_commit",
"signature": "",
"signer": null,
"payload": ""
}
},
"author": {
"id": 1,
"login": "owner",
"login_name": "",
"source_id": 0,
"full_name": "A User",
"email": "owner@noreply.zexlab.dev",
"avatar_url": "https://secure.gravatar.com/avatar/ahash?d=identicon",
"html_url": "https://gitea.zexlab.dev/owner",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2021-05-05T11:08:04+12:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "owner"
},
"committer": {
"id": 1,
"login": "owner",
"login_name": "",
"source_id": 0,
"full_name": "A User",
"email": "owner@noreply.zexlab.dev",
"avatar_url": "https://secure.gravatar.com/avatar/ahash?d=identicon",
"html_url": "https://gitea.zexlab.dev/owner",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2021-05-05T11:08:04+12:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "owner"
},
"parents": [
{
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef",
"sha": "deadbeef",
"created": "0001-01-01T00:00:00Z"
}
],
"files": [
{
"filename": ".gitea/workflows/ci.yaml",
"status": "removed"
}
],
"stats": {
"total": 62,
"additions": 0,
"deletions": 62
}
},
{
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef",
"sha": "deadbeef",
"created": "2024-04-23T13:15:00+12:00",
"html_url": "https://gitea.zexlab.dev/owner/test-repo/commit/deadbeef",
"commit": {
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef",
"author": {
"name": "A User",
"email": "owner@noreply.zexlab.dev",
"date": "2024-04-23T13:15:00+12:00"
},
"committer": {
"name": "A User",
"email": "owner@noreply.zexlab.dev",
"date": "2024-04-23T13:15:00+12:00"
},
"message": "fix: Update CI\n",
"tree": {
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/trees/deadbeef",
"sha": "deadbeef",
"created": "2024-04-23T13:15:00+12:00"
},
"verification": {
"verified": false,
"reason": "gpg.error.not_signed_commit",
"signature": "",
"signer": null,
"payload": ""
}
},
"author": {
"id": 1,
"login": "owner",
"login_name": "",
"source_id": 0,
"full_name": "A User",
"email": "owner@noreply.zexlab.dev",
"avatar_url": "https://secure.gravatar.com/avatar/ahash?d=identicon",
"html_url": "https://gitea.zexlab.dev/owner",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2021-05-05T11:08:04+12:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "owner"
},
"committer": {
"id": 1,
"login": "owner",
"login_name": "",
"source_id": 0,
"full_name": "A User",
"email": "owner@noreply.zexlab.dev",
"avatar_url": "https://secure.gravatar.com/avatar/ahash?d=identicon",
"html_url": "https://gitea.zexlab.dev/owner",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2021-05-05T11:08:04+12:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "owner"
},
"parents": [
{
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef",
"sha": "deadbeef",
"created": "0001-01-01T00:00:00Z"
}
],
"files": [
{
"filename": ".gitea/workflows/.ci.yml",
"status": "added"
}
],
"stats": {
"total": 36,
"additions": 36,
"deletions": 0
}
}
]

View File

@@ -0,0 +1,56 @@
[
{
"ref": "refs/tags/v2.0.0",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/refs/tags/v2.0.0",
"object": {
"type": "commit",
"sha": "deadbeef",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef"
}
},
{
"ref": "refs/tags/4.0.0-beta",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/refs/tags/4.0.0-beta",
"object": {
"type": "commit",
"sha": "deadbeef",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef"
}
},
{
"ref": "refs/tags/3.0.0-beta.2",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/refs/tags/3.0.0-beta.2",
"object": {
"type": "commit",
"sha": "deadbeef",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef"
}
},
{
"ref": "refs/tags/2.1.0-beta",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/refs/tags/2.1.0-beta",
"object": {
"type": "commit",
"sha": "deadbeef",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef"
}
},
{
"ref": "refs/tags/2.0.0",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/refs/tags/2.0.0",
"object": {
"type": "commit",
"sha": "deadbeef",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef"
}
},
{
"ref": "refs/tags/2020.4.19",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/refs/tags/2020.4.19",
"object": {
"type": "commit",
"sha": "deadbeef",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/git/commits/deadbeef"
}
}
]

View File

@@ -0,0 +1,92 @@
{
"id": 79,
"owner": {
"id": 5,
"login": "owner",
"login_name": "",
"source_id": 0,
"full_name": "some user name",
"email": "hey@zexlab.dev",
"avatar_url": "https://gitea.zexlab.dev/avatars/somehash",
"html_url": "https://gitea.zexlab.dev/owner",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-02-17T11:23:47+13:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "owner"
},
"name": "test-repo",
"full_name": "owner/test-repo",
"description": "",
"empty": false,
"private": true,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 115,
"language": "Go",
"languages_url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo/languages",
"html_url": "https://gitea.zexlab.dev/owner/test-repo",
"url": "https://gitea.zexlab.dev/api/v1/repos/owner/test-repo",
"link": "",
"ssh_url": "git@gitea.zexlab.dev:owner/test-repo.git",
"clone_url": "https://gitea.zexlab.dev/owner/test-repo.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 0,
"release_counter": 4,
"default_branch": "master",
"archived": false,
"created_at": "2024-07-20T23:06:00+12:00",
"updated_at": "2024-07-23T15:39:08+12:00",
"archived_at": "1970-01-01T12:00:00+12:00",
"permissions": {
"admin": false,
"push": false,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": true,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"projects_mode": "all",
"has_releases": true,
"has_packages": true,
"has_actions": true,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"allow_fast_forward_only_merge": true,
"allow_rebase_update": true,
"default_delete_branch_after_merge": false,
"default_merge_style": "merge",
"default_allow_maintainer_edit": false,
"avatar_url": "https://gitea.zexlab.dev/",
"internal": false,
"mirror_interval": "",
"object_format_name": "sha1",
"mirror_updated": "0001-01-01T00:00:00Z",
"repo_transfer": null
}

View File

@@ -0,0 +1,3 @@
{
"version": "1.21.1"
}

104
pkg/provider/test_server.go Normal file
View File

@@ -0,0 +1,104 @@
//coverage:ignore
package provider
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"code.gitea.io/sdk/gitea"
)
var validTags = map[string]bool{
"v5.0.0": true,
"5.0.0": true,
}
var (
server *httptest.Server
zexlabUser = "owner"
zexlabRepo = "test-repo"
zexlabDefaultBranch = "master"
zexlabCommits = []*gitea.Commit{
createGiteaCommit(testSHA, "fix: Removed lint as not go project\n", "2024-04-23T13:20:33+12:00"),
createGiteaCommit(testSHA, "fix: Oops, need a tidyup\n", "2024-04-23T13:17:11+12:00"),
createGiteaCommit(testSHA, "fix: Update CI\n", "2024-04-23T13:15:00+12:00"),
}
testSHA = "deadbeef"
)
func CreateTestServer() *httptest.Server {
ts := httptest.NewServer(http.HandlerFunc(ZexlabHandler))
return ts
}
//gocyclo:ignore
func ZexlabHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodGet && r.URL.Path == "/api/v1/version" {
// Client performs a request to check version
// Get json string from file
data, _ := retrieveData("data/Version.json")
_, _ = fmt.Fprint(w, string(data))
return
}
if r.Method == http.MethodGet && r.URL.Path == fmt.Sprintf("/api/v1/repos/%s/%s", zexlabUser, zexlabRepo) {
// Get json string from file
data, _ := retrieveData("data/GetRepoInfo.json")
_, _ = fmt.Fprint(w, string(data))
return
}
if r.Method == http.MethodGet && r.URL.Path == fmt.Sprintf("/api/v1/repos/%s/%s/commits", zexlabUser, zexlabRepo) {
// Get json string from file
data, _ := retrieveData("data/GetCommits.json")
_, _ = fmt.Fprint(w, string(data))
return
}
if r.Method == http.MethodGet && r.URL.Path == fmt.Sprintf("/api/v1/repos/%s/%s/git/refs/", zexlabUser, zexlabRepo) {
// Get json string from file
data, _ := retrieveData("data/GetRefs.json")
_, _ = fmt.Fprint(w, string(data))
return
}
if r.Method == http.MethodPost && r.URL.Path == fmt.Sprintf("/api/v1/repos/%s/%s/releases",
zexlabUser,
zexlabRepo) {
var data map[string]string
_ = json.NewDecoder(r.Body).Decode(&data)
_ = r.Body.Close()
if _, ok := validTags[data["tag_name"]]; !ok {
http.Error(w, "invalid tag name", http.StatusBadRequest)
return
}
fmt.Fprint(w, "{}")
return
}
http.Error(w, "invalid route", http.StatusNotImplemented)
}
func ZexlabHandlerFailed(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodGet && r.URL.Path == "/api/v1/version" {
// Client performs a request to check version
// Get json string from file
data, _ := retrieveData("data/Version.json")
_, _ = fmt.Fprint(w, string(data))
return
}
if r.Method == http.MethodGet && r.URL.Path == fmt.Sprintf("/api/v1/repos/%s/%s", zexlabUser, zexlabRepo) {
// Get json string from file
data, _ := retrieveData("data/GetRepoInfo.json")
_, _ = fmt.Fprint(w, string(data))
return
}
http.Error(w, "invalid route", http.StatusNotImplemented)
}

107
pkg/provider/utils.go Normal file
View File

@@ -0,0 +1,107 @@
package provider
import (
"fmt"
"io"
"os"
"testing"
"time"
"code.gitea.io/sdk/gitea"
"github.com/stretchr/testify/require"
)
func createGiteaCommit(sha, message, date string) *gitea.Commit {
tDate, _ := time.Parse("2006-01-02T15:04:05±hh:mm", date)
return &gitea.Commit{
CommitMeta: &gitea.CommitMeta{
URL: "",
SHA: sha,
Created: tDate,
},
HTMLURL: "",
RepoCommit: &gitea.RepoCommit{
URL: "",
Author: &gitea.CommitUser{
Identity: gitea.Identity{
Name: "A User",
Email: "owner@noreply.zexlab.dev",
},
Date: date,
},
Committer: &gitea.CommitUser{
Identity: gitea.Identity{
Name: "A User",
Email: "owner@noreply.zexlab.dev",
},
Date: date,
},
Message: message,
Tree: &gitea.CommitMeta{
URL: "",
SHA: "",
Created: tDate,
},
Verification: &gitea.PayloadCommitVerification{
Verified: false,
Reason: "",
Signature: "",
Payload: "",
},
},
Author: &gitea.User{
ID: 0,
UserName: "owner",
FullName: "A User",
Email: "owner@noreply.zexlab.dev",
},
Committer: &gitea.User{
ID: 0,
UserName: "owner",
FullName: "A User",
Email: "owner@noreply.zexlab.dev",
},
Parents: nil,
Files: nil,
Stats: &gitea.CommitStats{
Total: 0,
Additions: 0,
Deletions: 0,
},
}
}
func retrieveData(filepath string) ([]byte, error) {
jsonFile, err := os.Open(filepath)
if err != nil {
return nil, err
}
defer func(jsonFile *os.File) {
_ = jsonFile.Close()
}(jsonFile)
byteValue, _ := io.ReadAll(jsonFile)
return byteValue, nil
}
func setup() {
server = CreateTestServer()
}
func createTestZexlabRepo(t *testing.T) *ZexlabRepository {
assertions := require.New(t)
repo := &ZexlabRepository{}
err := repo.Init(map[string]string{
"server_url": server.URL,
"slug": fmt.Sprintf("%s/%s", zexlabUser, zexlabRepo),
"token": "token",
})
assertions.NoError(err)
return repo
}
func teardown() {
server.Close()
}

234
pkg/provider/zexlab.go Normal file
View File

@@ -0,0 +1,234 @@
package provider
import (
"context"
"fmt"
"os"
"regexp"
"strconv"
"strings"
"code.gitea.io/sdk/gitea"
"github.com/Masterminds/semver/v3"
"github.com/go-semantic-release/semantic-release/v2/pkg/provider"
"github.com/go-semantic-release/semantic-release/v2/pkg/semrel"
)
var PVERSION = "dev"
var zexlabServerURL = "https://zexlab.dev"
type ZexlabRepository struct {
client *gitea.Client
repo string
owner string
stripVTagPrefix bool
}
// gocyclo:ignore
func (repo *ZexlabRepository) Init(config map[string]string) error {
serverURL := config["server_url"]
if serverURL == "" {
serverURL = zexlabServerURL
}
slug := config["slug"]
if slug == "" {
slug = os.Getenv("GITHUB_REPOSITORY")
}
// Maybe we are running in Gitea Actions
if slug == "" {
slug = os.Getenv("GITEA_REPOSITORY")
}
// Maybe we are running in WoodpeckerCI
if slug == "" {
slug = os.Getenv("CI_REPO_NAME")
}
token := config["token"]
if token == "" {
token = os.Getenv("GITEA_TOKEN")
}
if token == "" {
return fmt.Errorf("zexlab token missing")
}
if !strings.Contains(slug, "/") {
return fmt.Errorf("invalid slug")
}
split := strings.Split(slug, "/")
// This could be due to act locally
// We'll work backwards to get the values
repo.owner = split[len(split)-2]
repo.repo = split[len(split)-1]
// Ensure no .git suffix remains
repo.repo = strings.TrimSuffix(repo.repo, ".git")
ctx := context.Background()
client, err := gitea.NewClient(serverURL,
gitea.SetToken(token),
gitea.SetContext(ctx))
if err != nil {
return err
}
repo.client = client
stripVTagPrefix := config["strip_v_tag_prefix"]
repo.stripVTagPrefix, err = strconv.ParseBool(stripVTagPrefix)
if stripVTagPrefix != "" && err != nil {
return fmt.Errorf("failed to set property strip_v_tag_prefix: %w", err)
}
return nil
}
func (repo *ZexlabRepository) GetInfo() (*provider.RepositoryInfo, error) {
r, _, err := repo.client.GetRepo(repo.owner, repo.repo)
if err != nil {
return nil, err
}
return &provider.RepositoryInfo{
Owner: r.Owner.UserName,
Repo: r.Name,
DefaultBranch: r.DefaultBranch,
Private: r.Private,
}, nil
}
func (repo *ZexlabRepository) GetCommits(_, toSha string) ([]*semrel.RawCommit, error) {
allCommits := make([]*semrel.RawCommit, 0)
opts := &gitea.ListOptions{PageSize: 100}
for {
commits, resp, err := repo.client.ListRepoCommits(repo.owner, repo.repo, gitea.ListCommitOptions{
SHA: toSha,
ListOptions: *opts,
})
if err != nil {
return nil, err
}
for _, commit := range commits {
sha := commit.SHA
// Resolve author info: prefer Gitea user, fallback to git commit data
authorLogin := ""
authorName := commit.RepoCommit.Author.Name
authorEmail := commit.RepoCommit.Author.Email
if commit.Author != nil {
authorLogin = commit.Author.UserName
authorName = commit.Author.FullName
authorEmail = commit.Author.Email
}
// Resolve committer info: prefer Gitea user, fallback to git commit data
committerLogin := ""
committerName := commit.RepoCommit.Committer.Name
committerEmail := commit.RepoCommit.Committer.Email
if commit.Committer != nil {
committerLogin = commit.Committer.UserName
committerName = commit.Committer.FullName
committerEmail = commit.Committer.Email
}
allCommits = append(allCommits, &semrel.RawCommit{
SHA: sha,
RawMessage: commit.RepoCommit.Message,
Annotations: map[string]string{
"author_login": authorLogin,
"author_name": authorName,
"author_email": authorEmail,
"author_date": commit.RepoCommit.Author.Date,
"committer_login": committerLogin,
"committer_name": committerName,
"committer_email": committerEmail,
"committer_date": commit.RepoCommit.Committer.Date,
},
})
}
if resp.NextPage == 0 {
break
}
opts.Page = resp.NextPage
}
return allCommits, nil
}
//gocyclo:ignore
func (repo *ZexlabRepository) GetReleases(rawRe string) ([]*semrel.Release, error) {
re := regexp.MustCompile(rawRe)
allReleases := make([]*semrel.Release, 0)
refs, resp, err := repo.client.GetRepoRefs(repo.owner, repo.repo, "")
if resp != nil && resp.StatusCode == 404 {
return allReleases, nil
}
if err != nil {
return nil, err
}
for _, r := range refs {
tag := strings.TrimPrefix(r.Ref, "refs/tags/")
if rawRe != "" && !re.MatchString(tag) {
continue
}
objType := r.Object.Type
if objType != "commit" && objType != "tag" {
continue
}
foundSha := r.Object.SHA
// resolve annotated tag
if objType == "tag" {
resTag, _, err := repo.client.GetRepoRef(repo.owner, repo.repo, foundSha)
if err != nil {
continue
}
if resTag.Object.Type != "commit" {
continue
}
foundSha = resTag.Object.SHA
}
version, err := semver.NewVersion(tag)
if err != nil {
continue
}
allReleases = append(allReleases, &semrel.Release{SHA: foundSha, Version: version.String()})
}
return allReleases, nil
}
func (repo *ZexlabRepository) CreateRelease(release *provider.CreateReleaseConfig) error {
prefix := "v"
if repo.stripVTagPrefix {
prefix = ""
}
tag := prefix + release.NewVersion
isPrerelease := release.Prerelease || semver.MustParse(release.NewVersion).Prerelease() != ""
opt := gitea.CreateReleaseOption{
TagName: tag,
Target: release.Branch,
Title: tag,
Note: release.Changelog,
IsPrerelease: isPrerelease,
}
_, _, err := repo.client.CreateRelease(repo.owner, repo.repo, opt)
if err != nil {
return fmt.Errorf("error returned %w, tag value [%s]", err, tag)
}
return nil
}
func (repo *ZexlabRepository) Name() string {
return "Zexlab"
}
func (repo *ZexlabRepository) Version() string {
return PVERSION
}

256
pkg/provider/zexlab_test.go Normal file
View File

@@ -0,0 +1,256 @@
package provider
import (
"fmt"
"os"
"testing"
"github.com/go-semantic-release/semantic-release/v2/pkg/provider"
"github.com/go-semantic-release/semantic-release/v2/pkg/semrel"
"github.com/stretchr/testify/require"
)
func TestNewZexlabRepository(t *testing.T) {
setup()
defer teardown()
assertions := require.New(t)
var repo *ZexlabRepository
repo = &ZexlabRepository{}
err := repo.Init(map[string]string{})
assertions.EqualError(err, "zexlab token missing")
repo = &ZexlabRepository{}
err = repo.Init(map[string]string{
"server_url": server.URL,
"slug": fmt.Sprintf("%s/%s", zexlabUser, zexlabRepo),
"token": "token",
})
assertions.NoError(err)
}
func TestVersionAndNameReturn(t *testing.T) {
setup()
defer teardown()
assertions := require.New(t)
repo := createTestZexlabRepo(t)
assertions.Equal("dev", repo.Version())
assertions.Equal("Zexlab", repo.Name())
}
func TestZexlabGetInfo(t *testing.T) {
setup()
defer teardown()
assertions := require.New(t)
repo := createTestZexlabRepo(t)
repoInfo, err := repo.GetInfo()
assertions.NoError(err)
assertions.Equal(zexlabDefaultBranch, repoInfo.DefaultBranch)
assertions.True(repoInfo.Private)
assertions.Equal(zexlabUser, repoInfo.Owner)
assertions.Equal(zexlabRepo, repoInfo.Repo)
}
func TestZexlabGetCommits(t *testing.T) {
setup()
defer teardown()
assertions := require.New(t)
repo := createTestZexlabRepo(t)
commits, err := repo.GetCommits("", "sa213445t6")
assertions.NoError(err)
for i, c := range commits {
assertions.Equal(c.SHA, zexlabCommits[i].SHA)
assertions.Equal(c.RawMessage, zexlabCommits[i].RepoCommit.Message)
assertions.Equal(c.Annotations["author_name"], zexlabCommits[i].Author.FullName)
assertions.Equal(c.Annotations["author_email"], zexlabCommits[i].Author.Email)
assertions.Equal(c.Annotations["committer_name"], zexlabCommits[i].Committer.FullName)
assertions.Equal(c.Annotations["committer_email"], zexlabCommits[i].Committer.Email)
assertions.Equal(c.Annotations["author_date"], zexlabCommits[i].RepoCommit.Author.Date)
assertions.Equal(c.Annotations["committer_date"], zexlabCommits[i].RepoCommit.Committer.Date)
}
}
func TestZexlabGetReleases(t *testing.T) {
setup()
defer teardown()
assertions := require.New(t)
repo := createTestZexlabRepo(t)
testCases := []struct {
vRange string
re string
expectedSHA string
expectedVersion string
}{
{"", "", testSHA, "2020.4.19"},
{"", "^v[0-9]*", testSHA, "2.0.0"},
{"2-beta", "", testSHA, "2.1.0-beta"},
{"3-beta", "", testSHA, "3.0.0-beta.2"},
{"4-beta", "", testSHA, "4.0.0-beta"},
}
for _, tc := range testCases {
t.Run(fmt.Sprintf("VersionRange: %s, Regex: %s", tc.vRange, tc.re), func(t *testing.T) {
releases, err := repo.GetReleases(tc.re)
assertions.NoError(err)
release, err := semrel.GetLatestReleaseFromReleases(releases, tc.vRange)
require.NoError(t, err)
assertions.Equal(tc.expectedSHA, release.SHA)
assertions.Equal(tc.expectedVersion, release.Version)
})
}
}
func TestZexlabCreateRelease(t *testing.T) {
setup()
defer teardown()
assertions := require.New(t)
repo := createTestZexlabRepo(t)
err := repo.CreateRelease(&provider.CreateReleaseConfig{
NewVersion: "5.0.0",
Prerelease: false,
Branch: "",
SHA: testSHA,
})
assertions.NoError(err)
}
func TestZexlabCreateReleaseStripPrefix(t *testing.T) {
setup()
defer teardown()
assertions := require.New(t)
repo := &ZexlabRepository{}
err := repo.Init(map[string]string{
"server_url": server.URL,
"slug": fmt.Sprintf("%s/%s", zexlabUser, zexlabRepo),
"token": "token",
"strip_v_tag_prefix": "true",
})
assertions.NoError(err)
err = repo.CreateRelease(&provider.CreateReleaseConfig{
NewVersion: "5.0.0",
Prerelease: false,
Branch: "",
SHA: testSHA,
})
assertions.NoError(err)
}
func TestZexlabInvalidTag(t *testing.T) {
setup()
defer teardown()
assertions := require.New(t)
repo := &ZexlabRepository{}
err := repo.Init(map[string]string{
"server_url": server.URL,
"slug": fmt.Sprintf("%s/%s", zexlabUser, zexlabRepo),
"token": "token",
})
assertions.NoError(err)
err = repo.CreateRelease(&provider.CreateReleaseConfig{
NewVersion: "1.0.1",
Prerelease: false,
Branch: "",
SHA: testSHA,
})
assertions.Errorf(err, "invalid tag name")
}
func TestZexlabEnvironmentVars(t *testing.T) {
setup()
defer teardown()
testCases := []struct {
name string
envVarName string
envVarValue string
}{
{
"Gitea Environment Var Slug",
"GITEA_REPOSITORY",
fmt.Sprintf("%s/%s",
zexlabUser,
zexlabRepo),
},
{
"GitHub Actions Environment Var Slug",
"GITHUB_REPOSITORY",
fmt.Sprintf("%s/%s",
zexlabUser,
zexlabRepo),
},
{
"WoodpeckerCI Environment Var Slug",
"CI_REPO_NAME",
fmt.Sprintf("%s/%s",
zexlabUser,
zexlabRepo),
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
_ = os.Setenv(tc.envVarName, tc.envVarValue)
repo := &ZexlabRepository{}
err := repo.Init(map[string]string{
"server_url": server.URL,
"token": "token",
})
require.NoError(t, err)
_ = os.Unsetenv(tc.envVarName)
})
}
}
func TestZexlabTokenNotSet(t *testing.T) {
setup()
defer teardown()
assertions := require.New(t)
repo := &ZexlabRepository{}
err := repo.Init(map[string]string{
"server_url": server.URL,
})
assertions.Errorf(err, "zexlab token missing")
}
func TestZexlabNonBooleanStripPrefix(t *testing.T) {
setup()
defer teardown()
assertions := require.New(t)
repo := &ZexlabRepository{}
err := repo.Init(map[string]string{
"server_url": server.URL,
"slug": fmt.Sprintf("%s/%s", zexlabUser, zexlabRepo),
"strip_v_tag_prefix": "something",
"token": "token",
})
assertions.Errorf(err, "failed to set property strip_v_tag_prefix: strconv.ParseBool: parsing \"something\": invalid syntax")
}