feat(gitea): client core, fake server and repo endpoints

This commit is contained in:
2026-08-29 15:52:54 -05:00
parent 43bc5819c0
commit 7c11987b00
5 changed files with 1158 additions and 2 deletions
+90
View File
@@ -0,0 +1,90 @@
package gitea
import (
"context"
"net/url"
)
// User is the account projection repos and PRs carry.
type User struct {
ID int64 `json:"id"`
Login string `json:"login"`
FullName string `json:"full_name,omitempty"`
}
// Repo is the repository projection (read shape).
type Repo struct {
ID int64 `json:"id"`
Owner User `json:"owner"`
Name string `json:"name"`
FullName string `json:"full_name"`
Description string `json:"description"`
Private bool `json:"private"`
Empty bool `json:"empty"`
DefaultBranch string `json:"default_branch"`
HTMLURL string `json:"html_url"`
CloneURL string `json:"clone_url"`
}
// RepoParams is the repo-create write shape. Owner routes the create:
// empty creates under the authenticated account (POST /user/repos), any
// other value creates under that organization (POST /orgs/{owner}/repos).
type RepoParams struct {
Owner string
Name string
Description string
Private bool
AutoInit bool
DefaultBranch string
}
type repoWrite struct {
Name string `json:"name"`
Description string `json:"description"`
Private bool `json:"private"`
AutoInit bool `json:"auto_init"`
DefaultBranch string `json:"default_branch,omitempty"`
}
// CreateRepo creates a repository and returns it.
func (c *Client) CreateRepo(ctx context.Context, p RepoParams) (*Repo, error) {
path := "/user/repos"
if p.Owner != "" {
path = "/orgs/" + url.PathEscape(p.Owner) + "/repos"
}
var out Repo
if err := c.do(ctx, "POST", path, nil, repoWrite{
Name: p.Name,
Description: p.Description,
Private: p.Private,
AutoInit: p.AutoInit,
DefaultBranch: p.DefaultBranch,
}, &out); err != nil {
return nil, err
}
return &out, nil
}
// ListRepos lists repositories. An empty owner lists the authenticated
// account's own repos (GET /user/repos); otherwise the named account's
// or organization's (GET /users/{owner}/repos).
func (c *Client) ListRepos(ctx context.Context, owner string) ([]Repo, error) {
path := "/user/repos"
if owner != "" {
path = "/users/" + url.PathEscape(owner) + "/repos"
}
var out []Repo
if err := c.do(ctx, "GET", path, nil, nil, &out); err != nil {
return nil, err
}
return out, nil
}
// GetRepo fetches one repository.
func (c *Client) GetRepo(ctx context.Context, owner, name string) (*Repo, error) {
var out Repo
if err := c.do(ctx, "GET", "/repos/"+url.PathEscape(owner)+"/"+url.PathEscape(name), nil, nil, &out); err != nil {
return nil, err
}
return &out, nil
}