init
This commit is contained in:
302
pkg/provider/data/GetCommits.json
Normal file
302
pkg/provider/data/GetCommits.json
Normal 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
|
||||
}
|
||||
}
|
||||
]
|
||||
56
pkg/provider/data/GetRefs.json
Normal file
56
pkg/provider/data/GetRefs.json
Normal 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"
|
||||
}
|
||||
}
|
||||
]
|
||||
92
pkg/provider/data/GetRepoInfo.json
Normal file
92
pkg/provider/data/GetRepoInfo.json
Normal 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
|
||||
}
|
||||
3
pkg/provider/data/Version.json
Normal file
3
pkg/provider/data/Version.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"version": "1.21.1"
|
||||
}
|
||||
104
pkg/provider/test_server.go
Normal file
104
pkg/provider/test_server.go
Normal 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
107
pkg/provider/utils.go
Normal 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
234
pkg/provider/zexlab.go
Normal 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
256
pkg/provider/zexlab_test.go
Normal 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")
|
||||
}
|
||||
Reference in New Issue
Block a user