123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- //
- // Copyright 2018, Sander van Harmelen
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- //
- package gitlab
- import (
- "fmt"
- "net/url"
- )
- // SearchService handles communication with the search related methods of the
- // GitLab API.
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html
- type SearchService struct {
- client *Client
- }
- // SearchOptions represents the available options for all search methods.
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html
- type SearchOptions ListOptions
- type searchOptions struct {
- SearchOptions
- Scope string `url:"scope" json:"scope"`
- Search string `url:"search" json:"search"`
- }
- // Projects searches the expression within projects
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-projects
- func (s *SearchService) Projects(query string, opt *SearchOptions, options ...OptionFunc) ([]*Project, *Response, error) {
- var ps []*Project
- resp, err := s.search("projects", query, &ps, opt, options...)
- return ps, resp, err
- }
- // ProjectsByGroup searches the expression within projects for
- // the specified group
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#group-search-api
- func (s *SearchService) ProjectsByGroup(gid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Project, *Response, error) {
- var ps []*Project
- resp, err := s.searchByGroup(gid, "projects", query, &ps, opt, options...)
- return ps, resp, err
- }
- // Issues searches the expression within issues
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-issues
- func (s *SearchService) Issues(query string, opt *SearchOptions, options ...OptionFunc) ([]*Issue, *Response, error) {
- var is []*Issue
- resp, err := s.search("issues", query, &is, opt, options...)
- return is, resp, err
- }
- // IssuesByGroup searches the expression within issues for
- // the specified group
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-issues
- func (s *SearchService) IssuesByGroup(gid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Issue, *Response, error) {
- var is []*Issue
- resp, err := s.searchByGroup(gid, "issues", query, &is, opt, options...)
- return is, resp, err
- }
- // IssuesByProject searches the expression within issues for
- // the specified project
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-issues
- func (s *SearchService) IssuesByProject(pid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Issue, *Response, error) {
- var is []*Issue
- resp, err := s.searchByProject(pid, "issues", query, &is, opt, options...)
- return is, resp, err
- }
- // MergeRequests searches the expression within merge requests
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/search.html#scope-merge_requests
- func (s *SearchService) MergeRequests(query string, opt *SearchOptions, options ...OptionFunc) ([]*MergeRequest, *Response, error) {
- var ms []*MergeRequest
- resp, err := s.search("merge_requests", query, &ms, opt, options...)
- return ms, resp, err
- }
- // MergeRequestsByGroup searches the expression within merge requests for
- // the specified group
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/search.html#scope-merge_requests
- func (s *SearchService) MergeRequestsByGroup(gid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*MergeRequest, *Response, error) {
- var ms []*MergeRequest
- resp, err := s.searchByGroup(gid, "merge_requests", query, &ms, opt, options...)
- return ms, resp, err
- }
- // MergeRequestsByProject searches the expression within merge requests for
- // the specified project
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/search.html#scope-merge_requests
- func (s *SearchService) MergeRequestsByProject(pid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*MergeRequest, *Response, error) {
- var ms []*MergeRequest
- resp, err := s.searchByProject(pid, "merge_requests", query, &ms, opt, options...)
- return ms, resp, err
- }
- // Milestones searches the expression within milestones
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-milestones
- func (s *SearchService) Milestones(query string, opt *SearchOptions, options ...OptionFunc) ([]*Milestone, *Response, error) {
- var ms []*Milestone
- resp, err := s.search("milestones", query, &ms, opt, options...)
- return ms, resp, err
- }
- // MilestonesByGroup searches the expression within milestones for
- // the specified group
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-milestones
- func (s *SearchService) MilestonesByGroup(gid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Milestone, *Response, error) {
- var ms []*Milestone
- resp, err := s.searchByGroup(gid, "milestones", query, &ms, opt, options...)
- return ms, resp, err
- }
- // MilestonesByProject searches the expression within milestones for
- // the specified project
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-milestones
- func (s *SearchService) MilestonesByProject(pid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Milestone, *Response, error) {
- var ms []*Milestone
- resp, err := s.searchByProject(pid, "milestones", query, &ms, opt, options...)
- return ms, resp, err
- }
- // SnippetTitles searches the expression within snippet titles
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/search.html#scope-snippet_titles
- func (s *SearchService) SnippetTitles(query string, opt *SearchOptions, options ...OptionFunc) ([]*Snippet, *Response, error) {
- var ss []*Snippet
- resp, err := s.search("snippet_titles", query, &ss, opt, options...)
- return ss, resp, err
- }
- // SnippetBlobs searches the expression within snippet blobs
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/search.html#scope-snippet_blobs
- func (s *SearchService) SnippetBlobs(query string, opt *SearchOptions, options ...OptionFunc) ([]*Snippet, *Response, error) {
- var ss []*Snippet
- resp, err := s.search("snippet_blobs", query, &ss, opt, options...)
- return ss, resp, err
- }
- // NotesByProject searches the expression within notes for the specified
- // project
- //
- // GitLab API docs: // https://docs.gitlab.com/ce/api/search.html#scope-notes
- func (s *SearchService) NotesByProject(pid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Note, *Response, error) {
- var ns []*Note
- resp, err := s.searchByProject(pid, "notes", query, &ns, opt, options...)
- return ns, resp, err
- }
- // WikiBlobs searches the expression within all wiki blobs
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/search.html#scope-wiki_blobs
- func (s *SearchService) WikiBlobs(query string, opt *SearchOptions, options ...OptionFunc) ([]*Wiki, *Response, error) {
- var ws []*Wiki
- resp, err := s.search("wiki_blobs", query, &ws, opt, options...)
- return ws, resp, err
- }
- // WikiBlobsByGroup searches the expression within wiki blobs for
- // specified group
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/search.html#scope-wiki_blobs
- func (s *SearchService) WikiBlobsByGroup(gid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Wiki, *Response, error) {
- var ws []*Wiki
- resp, err := s.searchByGroup(gid, "wiki_blobs", query, &ws, opt, options...)
- return ws, resp, err
- }
- // WikiBlobsByProject searches the expression within wiki blobs for
- // the specified project
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/search.html#scope-wiki_blobs
- func (s *SearchService) WikiBlobsByProject(pid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Wiki, *Response, error) {
- var ws []*Wiki
- resp, err := s.searchByProject(pid, "wiki_blobs", query, &ws, opt, options...)
- return ws, resp, err
- }
- // Commits searches the expression within all commits
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-commits
- func (s *SearchService) Commits(query string, opt *SearchOptions, options ...OptionFunc) ([]*Commit, *Response, error) {
- var cs []*Commit
- resp, err := s.search("commits", query, &cs, opt, options...)
- return cs, resp, err
- }
- // CommitsByGroup searches the expression within commits for the specified
- // group
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-commits
- func (s *SearchService) CommitsByGroup(gid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Commit, *Response, error) {
- var cs []*Commit
- resp, err := s.searchByGroup(gid, "commits", query, &cs, opt, options...)
- return cs, resp, err
- }
- // CommitsByProject searches the expression within commits for the
- // specified project
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-commits
- func (s *SearchService) CommitsByProject(pid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Commit, *Response, error) {
- var cs []*Commit
- resp, err := s.searchByProject(pid, "commits", query, &cs, opt, options...)
- return cs, resp, err
- }
- // Blob represents a single blob.
- type Blob struct {
- Basename string `json:"basename"`
- Data string `json:"data"`
- Filename string `json:"filename"`
- ID int `json:"id"`
- Ref string `json:"ref"`
- Startline int `json:"startline"`
- ProjectID int `json:"project_id"`
- }
- // Blobs searches the expression within all blobs
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-blobs
- func (s *SearchService) Blobs(query string, opt *SearchOptions, options ...OptionFunc) ([]*Blob, *Response, error) {
- var bs []*Blob
- resp, err := s.search("blobs", query, &bs, opt, options...)
- return bs, resp, err
- }
- // BlobsByGroup searches the expression within blobs for the specified
- // group
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-blobs
- func (s *SearchService) BlobsByGroup(gid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Blob, *Response, error) {
- var bs []*Blob
- resp, err := s.searchByGroup(gid, "blobs", query, &bs, opt, options...)
- return bs, resp, err
- }
- // BlobsByProject searches the expression within blobs for the specified
- // project
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/search.html#scope-blobs
- func (s *SearchService) BlobsByProject(pid interface{}, query string, opt *SearchOptions, options ...OptionFunc) ([]*Blob, *Response, error) {
- var bs []*Blob
- resp, err := s.searchByProject(pid, "blobs", query, &bs, opt, options...)
- return bs, resp, err
- }
- func (s *SearchService) search(scope, query string, result interface{}, opt *SearchOptions, options ...OptionFunc) (*Response, error) {
- opts := &searchOptions{SearchOptions: *opt, Scope: scope, Search: query}
- req, err := s.client.NewRequest("GET", "search", opts, options)
- if err != nil {
- return nil, err
- }
- return s.client.Do(req, result)
- }
- func (s *SearchService) searchByGroup(gid interface{}, scope, query string, result interface{}, opt *SearchOptions, options ...OptionFunc) (*Response, error) {
- group, err := parseID(gid)
- if err != nil {
- return nil, err
- }
- u := fmt.Sprintf("groups/%s/-/search", url.QueryEscape(group))
- opts := &searchOptions{SearchOptions: *opt, Scope: scope, Search: query}
- req, err := s.client.NewRequest("GET", u, opts, options)
- if err != nil {
- return nil, err
- }
- return s.client.Do(req, result)
- }
- func (s *SearchService) searchByProject(pid interface{}, scope, query string, result interface{}, opt *SearchOptions, options ...OptionFunc) (*Response, error) {
- project, err := parseID(pid)
- if err != nil {
- return nil, err
- }
- u := fmt.Sprintf("projects/%s/-/search", url.QueryEscape(project))
- opts := &searchOptions{SearchOptions: *opt, Scope: scope, Search: query}
- req, err := s.client.NewRequest("GET", u, opts, options)
- if err != nil {
- return nil, err
- }
- return s.client.Do(req, result)
- }
|