mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
466 lines
19 KiB
Go
466 lines
19 KiB
Go
package gerrit
|
||
|
||
import (
|
||
"fmt"
|
||
"net/url"
|
||
)
|
||
|
||
// ProjectsService contains Project related REST endpoints
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html
|
||
type ProjectsService struct {
|
||
client *Client
|
||
}
|
||
|
||
// ProjectInfo entity contains information about a project.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#project-info
|
||
type ProjectInfo struct {
|
||
ID string `json:"id"`
|
||
Name string `json:"name"`
|
||
Parent string `json:"parent,omitempty"`
|
||
Description string `json:"description,omitempty"`
|
||
State string `json:"state,omitempty"`
|
||
Branches map[string]string `json:"branches,omitempty"`
|
||
WebLinks []WebLinkInfo `json:"web_links,omitempty"`
|
||
}
|
||
|
||
// ProjectInput entity contains information for the creation of a new project.
|
||
type ProjectInput struct {
|
||
Name string `json:"name,omitempty"`
|
||
Parent string `json:"parent,omitempty"`
|
||
Description string `json:"description,omitempty"`
|
||
PermissionsOnly bool `json:"permissions_only"`
|
||
CreateEmptyCommit bool `json:"create_empty_commit"`
|
||
SubmitType string `json:"submit_type,omitempty"`
|
||
Branches []string `json:"branches,omitempty"`
|
||
Owners []string `json:"owners,omitempty"`
|
||
UseContributorAgreements string `json:"use_contributor_agreements"`
|
||
UseSignedOffBy string `json:"use_signed_off_by"`
|
||
CreateNewChangeForAllNotInTarget string `json:"create_new_change_for_all_not_in_target"`
|
||
UseContentMerge string `json:"use_content_merge"`
|
||
RequireChangeID string `json:"require_change_id"`
|
||
MaxObjectSizeLimit string `json:"max_object_size_limit,omitempty"`
|
||
PluginConfigValues map[string]map[string]string `json:"plugin_config_values,omitempty"`
|
||
}
|
||
|
||
// GCInput entity contains information to run the Git garbage collection.
|
||
type GCInput struct {
|
||
ShowProgress bool `json:"show_progress"`
|
||
Aggressive bool `json:"aggressive"`
|
||
}
|
||
|
||
// HeadInput entity contains information for setting HEAD for a project.
|
||
type HeadInput struct {
|
||
Ref string `json:"ref"`
|
||
}
|
||
|
||
// BanInput entity contains information for banning commits in a project.
|
||
type BanInput struct {
|
||
Commits []string `json:"commits"`
|
||
Reason string `json:"reason,omitempty"`
|
||
}
|
||
|
||
// BanResultInfo entity describes the result of banning commits.
|
||
type BanResultInfo struct {
|
||
NewlyBanned []string `json:"newly_banned,omitempty"`
|
||
AlreadyBanned []string `json:"already_banned,omitempty"`
|
||
Ignored []string `json:"ignored,omitempty"`
|
||
}
|
||
|
||
// ThemeInfo entity describes a theme.
|
||
type ThemeInfo struct {
|
||
CSS string `type:"css,omitempty"`
|
||
Header string `type:"header,omitempty"`
|
||
Footer string `type:"footer,omitempty"`
|
||
}
|
||
|
||
// ReflogEntryInfo entity describes an entry in a reflog.
|
||
type ReflogEntryInfo struct {
|
||
OldID string `json:"old_id"`
|
||
NewID string `json:"new_id"`
|
||
Who GitPersonInfo `json:"who"`
|
||
Comment string `json:"comment"`
|
||
}
|
||
|
||
// ProjectParentInput entity contains information for setting a project parent.
|
||
type ProjectParentInput struct {
|
||
Parent string `json:"parent"`
|
||
CommitMessage string `json:"commit_message,omitempty"`
|
||
}
|
||
|
||
// RepositoryStatisticsInfo entity contains information about statistics of a Git repository.
|
||
type RepositoryStatisticsInfo struct {
|
||
NumberOfLooseObjects int `json:"number_of_loose_objects"`
|
||
NumberOfLooseRefs int `json:"number_of_loose_refs"`
|
||
NumberOfPackFiles int `json:"number_of_pack_files"`
|
||
NumberOfPackedObjects int `json:"number_of_packed_objects"`
|
||
NumberOfPackedRefs int `json:"number_of_packed_refs"`
|
||
SizeOfLooseObjects int `json:"size_of_loose_objects"`
|
||
SizeOfPackedObjects int `json:"size_of_packed_objects"`
|
||
}
|
||
|
||
// InheritedBooleanInfo entity represents a boolean value that can also be inherited.
|
||
type InheritedBooleanInfo struct {
|
||
Value bool `json:"value"`
|
||
ConfiguredValue string `json:"configured_value"`
|
||
InheritedValue bool `json:"inherited_value,omitempty"`
|
||
}
|
||
|
||
// MaxObjectSizeLimitInfo entity contains information about the max object size limit of a project.
|
||
type MaxObjectSizeLimitInfo struct {
|
||
Value string `json:"value,omitempty"`
|
||
ConfiguredValue string `json:"configured_value,omitempty"`
|
||
InheritedValue string `json:"inherited_value,omitempty"`
|
||
}
|
||
|
||
// ConfigParameterInfo entity describes a project configuration parameter.
|
||
type ConfigParameterInfo struct {
|
||
DisplayName string `json:"display_name,omitempty"`
|
||
Description string `json:"description,omitempty"`
|
||
Warning string `json:"warning,omitempty"`
|
||
Type string `json:"type"`
|
||
Value string `json:"value,omitempty"`
|
||
Values []string `json:"values,omitempty"`
|
||
// TODO: 5 fields are missing here, because the documentation seems to be fucked up
|
||
// See https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#config-parameter-info
|
||
}
|
||
|
||
// ProjectDescriptionInput entity contains information for setting a project description.
|
||
type ProjectDescriptionInput struct {
|
||
Description string `json:"description,omitempty"`
|
||
CommitMessage string `json:"commit_message,omitempty"`
|
||
}
|
||
|
||
// ConfigInfo entity contains information about the effective project configuration.
|
||
type ConfigInfo struct {
|
||
Description string `json:"description,omitempty"`
|
||
UseContributorAgreements InheritedBooleanInfo `json:"use_contributor_agreements,omitempty"`
|
||
UseContentMerge InheritedBooleanInfo `json:"use_content_merge,omitempty"`
|
||
UseSignedOffBy InheritedBooleanInfo `json:"use_signed_off_by,omitempty"`
|
||
CreateNewChangeForAllNotInTarget InheritedBooleanInfo `json:"create_new_change_for_all_not_in_target,omitempty"`
|
||
RequireChangeID InheritedBooleanInfo `json:"require_change_id,omitempty"`
|
||
EnableSignedPush InheritedBooleanInfo `json:"enable_signed_push,omitempty"`
|
||
MaxObjectSizeLimit MaxObjectSizeLimitInfo `json:"max_object_size_limit"`
|
||
SubmitType string `json:"submit_type"`
|
||
State string `json:"state,omitempty"`
|
||
Commentlinks map[string]string `json:"commentlinks"`
|
||
Theme ThemeInfo `json:"theme,omitempty"`
|
||
PluginConfig map[string]ConfigParameterInfo `json:"plugin_config,omitempty"`
|
||
Actions map[string]ActionInfo `json:"actions,omitempty"`
|
||
}
|
||
|
||
// ConfigInput entity describes a new project configuration.
|
||
type ConfigInput struct {
|
||
Description string `json:"description,omitempty"`
|
||
UseContributorAgreements string `json:"use_contributor_agreements,omitempty"`
|
||
UseContentMerge string `json:"use_content_merge,omitempty"`
|
||
UseSignedOffBy string `json:"use_signed_off_by,omitempty"`
|
||
CreateNewChangeForAllNotInTarget string `json:"create_new_change_for_all_not_in_target,omitempty"`
|
||
RequireChangeID string `json:"require_change_id,omitempty"`
|
||
MaxObjectSizeLimit MaxObjectSizeLimitInfo `json:"max_object_size_limit,omitempty"`
|
||
SubmitType string `json:"submit_type,omitempty"`
|
||
State string `json:"state,omitempty"`
|
||
PluginConfigValues map[string]map[string]string `json:"plugin_config_values,omitempty"`
|
||
}
|
||
|
||
// ProjectBaseOptions specifies the really basic options for projects
|
||
// and sub functionality (e.g. Tags)
|
||
type ProjectBaseOptions struct {
|
||
// Limit the number of projects to be included in the results.
|
||
Limit int `url:"n,omitempty"`
|
||
|
||
// Skip the given number of branches from the beginning of the list.
|
||
Skip string `url:"s,omitempty"`
|
||
}
|
||
|
||
// ProjectOptions specifies the parameters to the ProjectsService.ListProjects.
|
||
type ProjectOptions struct {
|
||
ProjectBaseOptions
|
||
|
||
// Limit the results to the projects having the specified branch and include the sha1 of the branch in the results.
|
||
Branch string `url:"b,omitempty"`
|
||
|
||
// Include project description in the results.
|
||
Description bool `url:"d,omitempty"`
|
||
|
||
// Limit the results to those projects that start with the specified prefix.
|
||
Prefix string `url:"p,omitempty"`
|
||
|
||
// Limit the results to those projects that match the specified regex.
|
||
// Boundary matchers '^' and '$' are implicit.
|
||
// For example: the regex 'test.*' will match any projects that start with 'test' and regex '.*test' will match any project that end with 'test'.
|
||
Regex string `url:"r,omitempty"`
|
||
|
||
// Skip the given number of projects from the beginning of the list.
|
||
Skip string `url:"S,omitempty"`
|
||
|
||
// Limit the results to those projects that match the specified substring.
|
||
Substring string `url:"m,omitempty"`
|
||
|
||
// Get projects inheritance in a tree-like format.
|
||
// This option does not work together with the branch option.
|
||
Tree bool `url:"t,omitempty"`
|
||
|
||
// Get projects with specified type: ALL, CODE, PERMISSIONS.
|
||
Type string `url:"type,omitempty"`
|
||
}
|
||
|
||
// ListProjects lists the projects accessible by the caller.
|
||
// This is the same as using the ls-projects command over SSH, and accepts the same options as query parameters.
|
||
// The entries in the map are sorted by project name.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#list-projects
|
||
func (s *ProjectsService) ListProjects(opt *ProjectOptions) (*map[string]ProjectInfo, *Response, error) {
|
||
u := "projects/"
|
||
|
||
u, err := addOptions(u, opt)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
v := new(map[string]ProjectInfo)
|
||
resp, err := s.client.Call("GET", u, nil, v)
|
||
return v, resp, err
|
||
}
|
||
|
||
// GetProject retrieves a project.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#get-project
|
||
func (s *ProjectsService) GetProject(projectName string) (*ProjectInfo, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s", url.QueryEscape(projectName))
|
||
|
||
v := new(ProjectInfo)
|
||
resp, err := s.client.Call("GET", u, nil, v)
|
||
return v, resp, err
|
||
}
|
||
|
||
// CreateProject creates a new project.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#create-project
|
||
func (s *ProjectsService) CreateProject(projectName string, input *ProjectInput) (*ProjectInfo, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s/", url.QueryEscape(projectName))
|
||
|
||
v := new(ProjectInfo)
|
||
resp, err := s.client.Call("PUT", u, input, v)
|
||
return v, resp, err
|
||
}
|
||
|
||
// GetProjectDescription retrieves the description of a project.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#get-project-description
|
||
func (s *ProjectsService) GetProjectDescription(projectName string) (string, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s/description", url.QueryEscape(projectName))
|
||
|
||
return getStringResponseWithoutOptions(s.client, u)
|
||
}
|
||
|
||
// GetProjectParent retrieves the name of a project’s parent project.
|
||
// For the All-Projects root project an empty string is returned.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#get-project-parent
|
||
func (s *ProjectsService) GetProjectParent(projectName string) (string, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s/parent", url.QueryEscape(projectName))
|
||
return getStringResponseWithoutOptions(s.client, u)
|
||
}
|
||
|
||
// GetHEAD retrieves for a project the name of the branch to which HEAD points.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#get-head
|
||
func (s *ProjectsService) GetHEAD(projectName string) (string, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s/HEAD", url.QueryEscape(projectName))
|
||
return getStringResponseWithoutOptions(s.client, u)
|
||
}
|
||
|
||
// GetRepositoryStatistics return statistics for the repository of a project.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#get-repository-statistics
|
||
func (s *ProjectsService) GetRepositoryStatistics(projectName string) (*RepositoryStatisticsInfo, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s/statistics.git", url.QueryEscape(projectName))
|
||
|
||
req, err := s.client.NewRequest("GET", u, nil)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
v := new(RepositoryStatisticsInfo)
|
||
resp, err := s.client.Do(req, v)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return v, resp, err
|
||
}
|
||
|
||
// GetConfig gets some configuration information about a project.
|
||
// Note that this config info is not simply the contents of project.config;
|
||
// it generally contains fields that may have been inherited from parent projects.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#get-config
|
||
func (s *ProjectsService) GetConfig(projectName string) (*ConfigInfo, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s/config'", url.QueryEscape(projectName))
|
||
|
||
req, err := s.client.NewRequest("GET", u, nil)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
v := new(ConfigInfo)
|
||
resp, err := s.client.Do(req, v)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return v, resp, err
|
||
}
|
||
|
||
// SetProjectDescription sets the description of a project.
|
||
// The new project description must be provided in the request body inside a ProjectDescriptionInput entity.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#set-project-description
|
||
func (s *ProjectsService) SetProjectDescription(projectName string, input *ProjectDescriptionInput) (*string, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s/description'", url.QueryEscape(projectName))
|
||
|
||
// TODO Use here the getStringResponseWithoutOptions (for PUT requests)
|
||
|
||
req, err := s.client.NewRequest("PUT", u, input)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
v := new(string)
|
||
resp, err := s.client.Do(req, v)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return v, resp, err
|
||
}
|
||
|
||
// DeleteProjectDescription deletes the description of a project.
|
||
// The request body does not need to include a ProjectDescriptionInput entity if no commit message is specified.
|
||
//
|
||
// Please note that some proxies prohibit request bodies for DELETE requests.
|
||
// In this case, if you want to specify a commit message, use PUT to delete the description.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#delete-project-description
|
||
func (s *ProjectsService) DeleteProjectDescription(projectName string) (*Response, error) {
|
||
u := fmt.Sprintf("projects/%s/description'", url.QueryEscape(projectName))
|
||
return s.client.DeleteRequest(u, nil)
|
||
}
|
||
|
||
// BanCommit marks commits as banned for the project.
|
||
// If a commit is banned Gerrit rejects every push that includes this commit with contains banned commit ...
|
||
//
|
||
// Note:
|
||
// This REST endpoint only marks the commits as banned, but it does not remove the commits from the history of any central branch.
|
||
// This needs to be done manually.
|
||
// The commits to be banned must be specified in the request body as a BanInput entity.
|
||
//
|
||
// The caller must be project owner.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#ban-commit
|
||
func (s *ProjectsService) BanCommit(projectName string, input *BanInput) (*BanResultInfo, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s/ban'", url.QueryEscape(projectName))
|
||
|
||
req, err := s.client.NewRequest("PUT", u, input)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
v := new(BanResultInfo)
|
||
resp, err := s.client.Do(req, v)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return v, resp, err
|
||
}
|
||
|
||
// SetConfig sets the configuration of a project.
|
||
// The new configuration must be provided in the request body as a ConfigInput entity.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#set-config
|
||
func (s *ProjectsService) SetConfig(projectName string, input *ConfigInput) (*ConfigInfo, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s/config'", url.QueryEscape(projectName))
|
||
|
||
req, err := s.client.NewRequest("PUT", u, input)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
v := new(ConfigInfo)
|
||
resp, err := s.client.Do(req, v)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return v, resp, err
|
||
}
|
||
|
||
// SetHEAD sets HEAD for a project.
|
||
// The new ref to which HEAD should point must be provided in the request body inside a HeadInput entity.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#set-head
|
||
func (s *ProjectsService) SetHEAD(projectName string, input *HeadInput) (*string, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s/HEAD'", url.QueryEscape(projectName))
|
||
|
||
// TODO Use here the getStringResponseWithoutOptions (for PUT requests)
|
||
|
||
req, err := s.client.NewRequest("PUT", u, input)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
v := new(string)
|
||
resp, err := s.client.Do(req, v)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return v, resp, err
|
||
}
|
||
|
||
// SetProjectParent sets the parent project for a project.
|
||
// The new name of the parent project must be provided in the request body inside a ProjectParentInput entity.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#set-project-parent
|
||
func (s *ProjectsService) SetProjectParent(projectName string, input *ProjectParentInput) (*string, *Response, error) {
|
||
u := fmt.Sprintf("projects/%s/parent'", url.QueryEscape(projectName))
|
||
|
||
// TODO Use here the getStringResponseWithoutOptions (for PUT requests)
|
||
|
||
req, err := s.client.NewRequest("PUT", u, input)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
v := new(string)
|
||
resp, err := s.client.Do(req, v)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return v, resp, err
|
||
}
|
||
|
||
// RunGC runs the Git garbage collection for the repository of a project.
|
||
// The response is the streamed output of the garbage collection.
|
||
//
|
||
// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#run-gc
|
||
func (s *ProjectsService) RunGC(projectName string, input *GCInput) (*Response, error) {
|
||
u := fmt.Sprintf("projects/%s/gc'", url.QueryEscape(projectName))
|
||
|
||
req, err := s.client.NewRequest("POST", u, input)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
resp, err := s.client.Do(req, nil)
|
||
if err != nil {
|
||
return resp, err
|
||
}
|
||
|
||
return resp, err
|
||
}
|