mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 08:21:11 +00:00 
			
		
		
		
	* first draft
* update gitea sdk to 9e280adb4da
* adapt feat of updated sdk
* releases now works
* break the Reactions loop
* use convertGiteaLabel
* fix endless loop because paggination is not supported there !!!
* rename gitea local uploader files
* pagination can bite you in the ass
* Version Checks
* lint
* docs
* rename gitea sdk import to miss future conficts
* go-swagger: dont scan the sdk structs
* make sure gitea can shutdown gracefully
* make GetPullRequests and GetIssues similar
* rm useles
* Add Test: started ...
* ... add tests ...
* Add tests and Fixing things
* Workaround missing SHA
* Adapt: Ensure that all migration requests are cancellable
(714ab71ddc)
* LINT: fix misspells in test set
* adapt ListMergeRequestAwardEmoji
* update sdk
* Return error when creating giteadownloader failed
* update sdk
* adapt new sdk
* adopt new features
* check version before err
* adapt: 'migrate service type switch page'
* optimize
* Fix DefaultBranch
* impruve
* handle subPath
* fix test
* Fix ReviewCommentPosition
* test GetReviews
* add DefaultBranch int test set
* rm unused
* Update SDK to v0.13.0
* addopt sdk changes
* found better link
* format template
* Update Docs
* Update Gitea SDK (v0.13.1)
		
	
			
		
			
				
	
	
		
			213 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			213 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
// Copyright 2016 The Gogs Authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a MIT-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
package gitea
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"net/url"
 | 
						|
	"strings"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
// Milestone milestone is a collection of issues on one repository
 | 
						|
type Milestone struct {
 | 
						|
	ID           int64      `json:"id"`
 | 
						|
	Title        string     `json:"title"`
 | 
						|
	Description  string     `json:"description"`
 | 
						|
	State        StateType  `json:"state"`
 | 
						|
	OpenIssues   int        `json:"open_issues"`
 | 
						|
	ClosedIssues int        `json:"closed_issues"`
 | 
						|
	Created      time.Time  `json:"created_at"`
 | 
						|
	Updated      *time.Time `json:"updated_at"`
 | 
						|
	Closed       *time.Time `json:"closed_at"`
 | 
						|
	Deadline     *time.Time `json:"due_on"`
 | 
						|
}
 | 
						|
 | 
						|
// ListMilestoneOption list milestone options
 | 
						|
type ListMilestoneOption struct {
 | 
						|
	ListOptions
 | 
						|
	// open, closed, all
 | 
						|
	State StateType
 | 
						|
	Name  string
 | 
						|
}
 | 
						|
 | 
						|
// QueryEncode turns options into querystring argument
 | 
						|
func (opt *ListMilestoneOption) QueryEncode() string {
 | 
						|
	query := opt.getURLQuery()
 | 
						|
	if opt.State != "" {
 | 
						|
		query.Add("state", string(opt.State))
 | 
						|
	}
 | 
						|
	if len(opt.Name) != 0 {
 | 
						|
		query.Add("name", opt.Name)
 | 
						|
	}
 | 
						|
	return query.Encode()
 | 
						|
}
 | 
						|
 | 
						|
// ListRepoMilestones list all the milestones of one repository
 | 
						|
func (c *Client) ListRepoMilestones(owner, repo string, opt ListMilestoneOption) ([]*Milestone, *Response, error) {
 | 
						|
	opt.setDefaults()
 | 
						|
	milestones := make([]*Milestone, 0, opt.PageSize)
 | 
						|
 | 
						|
	link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/milestones", owner, repo))
 | 
						|
	link.RawQuery = opt.QueryEncode()
 | 
						|
	resp, err := c.getParsedResponse("GET", link.String(), nil, nil, &milestones)
 | 
						|
	return milestones, resp, err
 | 
						|
}
 | 
						|
 | 
						|
// GetMilestone get one milestone by repo name and milestone id
 | 
						|
func (c *Client) GetMilestone(owner, repo string, id int64) (*Milestone, *Response, error) {
 | 
						|
	milestone := new(Milestone)
 | 
						|
	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/milestones/%d", owner, repo, id), nil, nil, milestone)
 | 
						|
	return milestone, resp, err
 | 
						|
}
 | 
						|
 | 
						|
// GetMilestoneByName get one milestone by repo and milestone name
 | 
						|
func (c *Client) GetMilestoneByName(owner, repo string, name string) (*Milestone, *Response, error) {
 | 
						|
	if c.CheckServerVersionConstraint(">=1.13") != nil {
 | 
						|
		// backwards compatibility mode
 | 
						|
		m, resp, err := c.resolveMilestoneByName(owner, repo, name)
 | 
						|
		return m, resp, err
 | 
						|
	}
 | 
						|
	milestone := new(Milestone)
 | 
						|
	resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/milestones/%s", owner, repo, name), nil, nil, milestone)
 | 
						|
	return milestone, resp, err
 | 
						|
}
 | 
						|
 | 
						|
// CreateMilestoneOption options for creating a milestone
 | 
						|
type CreateMilestoneOption struct {
 | 
						|
	Title       string     `json:"title"`
 | 
						|
	Description string     `json:"description"`
 | 
						|
	State       StateType  `json:"state"`
 | 
						|
	Deadline    *time.Time `json:"due_on"`
 | 
						|
}
 | 
						|
 | 
						|
// Validate the CreateMilestoneOption struct
 | 
						|
func (opt CreateMilestoneOption) Validate() error {
 | 
						|
	if len(strings.TrimSpace(opt.Title)) == 0 {
 | 
						|
		return fmt.Errorf("title is empty")
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// CreateMilestone create one milestone with options
 | 
						|
func (c *Client) CreateMilestone(owner, repo string, opt CreateMilestoneOption) (*Milestone, *Response, error) {
 | 
						|
	if err := opt.Validate(); err != nil {
 | 
						|
		return nil, nil, err
 | 
						|
	}
 | 
						|
	body, err := json.Marshal(&opt)
 | 
						|
	if err != nil {
 | 
						|
		return nil, nil, err
 | 
						|
	}
 | 
						|
	milestone := new(Milestone)
 | 
						|
	resp, err := c.getParsedResponse("POST", fmt.Sprintf("/repos/%s/%s/milestones", owner, repo), jsonHeader, bytes.NewReader(body), milestone)
 | 
						|
 | 
						|
	// make creating closed milestones need gitea >= v1.13.0
 | 
						|
	// this make it backwards compatible
 | 
						|
	if err == nil && opt.State == StateClosed && milestone.State != StateClosed {
 | 
						|
		closed := StateClosed
 | 
						|
		return c.EditMilestone(owner, repo, milestone.ID, EditMilestoneOption{
 | 
						|
			State: &closed,
 | 
						|
		})
 | 
						|
	}
 | 
						|
 | 
						|
	return milestone, resp, err
 | 
						|
}
 | 
						|
 | 
						|
// EditMilestoneOption options for editing a milestone
 | 
						|
type EditMilestoneOption struct {
 | 
						|
	Title       string     `json:"title"`
 | 
						|
	Description *string    `json:"description"`
 | 
						|
	State       *StateType `json:"state"`
 | 
						|
	Deadline    *time.Time `json:"due_on"`
 | 
						|
}
 | 
						|
 | 
						|
// Validate the EditMilestoneOption struct
 | 
						|
func (opt EditMilestoneOption) Validate() error {
 | 
						|
	if len(opt.Title) != 0 && len(strings.TrimSpace(opt.Title)) == 0 {
 | 
						|
		return fmt.Errorf("title is empty")
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// EditMilestone modify milestone with options
 | 
						|
func (c *Client) EditMilestone(owner, repo string, id int64, opt EditMilestoneOption) (*Milestone, *Response, error) {
 | 
						|
	if err := opt.Validate(); err != nil {
 | 
						|
		return nil, nil, err
 | 
						|
	}
 | 
						|
	body, err := json.Marshal(&opt)
 | 
						|
	if err != nil {
 | 
						|
		return nil, nil, err
 | 
						|
	}
 | 
						|
	milestone := new(Milestone)
 | 
						|
	resp, err := c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/milestones/%d", owner, repo, id), jsonHeader, bytes.NewReader(body), milestone)
 | 
						|
	return milestone, resp, err
 | 
						|
}
 | 
						|
 | 
						|
// EditMilestoneByName modify milestone with options
 | 
						|
func (c *Client) EditMilestoneByName(owner, repo string, name string, opt EditMilestoneOption) (*Milestone, *Response, error) {
 | 
						|
	if c.CheckServerVersionConstraint(">=1.13") != nil {
 | 
						|
		// backwards compatibility mode
 | 
						|
		m, _, err := c.resolveMilestoneByName(owner, repo, name)
 | 
						|
		if err != nil {
 | 
						|
			return nil, nil, err
 | 
						|
		}
 | 
						|
		return c.EditMilestone(owner, repo, m.ID, opt)
 | 
						|
	}
 | 
						|
	if err := opt.Validate(); err != nil {
 | 
						|
		return nil, nil, err
 | 
						|
	}
 | 
						|
	body, err := json.Marshal(&opt)
 | 
						|
	if err != nil {
 | 
						|
		return nil, nil, err
 | 
						|
	}
 | 
						|
	milestone := new(Milestone)
 | 
						|
	resp, err := c.getParsedResponse("PATCH", fmt.Sprintf("/repos/%s/%s/milestones/%s", owner, repo, name), jsonHeader, bytes.NewReader(body), milestone)
 | 
						|
	return milestone, resp, err
 | 
						|
}
 | 
						|
 | 
						|
// DeleteMilestone delete one milestone by id
 | 
						|
func (c *Client) DeleteMilestone(owner, repo string, id int64) (*Response, error) {
 | 
						|
	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/milestones/%d", owner, repo, id), nil, nil)
 | 
						|
	return resp, err
 | 
						|
}
 | 
						|
 | 
						|
// DeleteMilestoneByName delete one milestone by name
 | 
						|
func (c *Client) DeleteMilestoneByName(owner, repo string, name string) (*Response, error) {
 | 
						|
	if c.CheckServerVersionConstraint(">=1.13") != nil {
 | 
						|
		// backwards compatibility mode
 | 
						|
		m, _, err := c.resolveMilestoneByName(owner, repo, name)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
		return c.DeleteMilestone(owner, repo, m.ID)
 | 
						|
	}
 | 
						|
	_, resp, err := c.getResponse("DELETE", fmt.Sprintf("/repos/%s/%s/milestones/%s", owner, repo, name), nil, nil)
 | 
						|
	return resp, err
 | 
						|
}
 | 
						|
 | 
						|
// resolveMilestoneByName is a fallback method to find milestone id by name
 | 
						|
func (c *Client) resolveMilestoneByName(owner, repo, name string) (*Milestone, *Response, error) {
 | 
						|
	for i := 1; ; i++ {
 | 
						|
		miles, resp, err := c.ListRepoMilestones(owner, repo, ListMilestoneOption{
 | 
						|
			ListOptions: ListOptions{
 | 
						|
				Page: i,
 | 
						|
			},
 | 
						|
			State: "all",
 | 
						|
		})
 | 
						|
		if err != nil {
 | 
						|
			return nil, nil, err
 | 
						|
		}
 | 
						|
		if len(miles) == 0 {
 | 
						|
			return nil, nil, fmt.Errorf("milestone '%s' do not exist", name)
 | 
						|
		}
 | 
						|
		for _, m := range miles {
 | 
						|
			if strings.ToLower(strings.TrimSpace(m.Title)) == strings.ToLower(strings.TrimSpace(name)) {
 | 
						|
				return m, resp, nil
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |