123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- //
- // Copyright 2017, 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 (
- "bytes"
- "fmt"
- "net/url"
- "strconv"
- )
- // RepositoryFilesService handles communication with the repository files
- // related methods of the GitLab API.
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/repository_files.html
- type RepositoryFilesService struct {
- client *Client
- }
- // File represents a GitLab repository file.
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/repository_files.html
- type File struct {
- FileName string `json:"file_name"`
- FilePath string `json:"file_path"`
- Size int `json:"size"`
- Encoding string `json:"encoding"`
- Content string `json:"content"`
- Ref string `json:"ref"`
- BlobID string `json:"blob_id"`
- CommitID string `json:"commit_id"`
- }
- func (r File) String() string {
- return Stringify(r)
- }
- // GetFileOptions represents the available GetFile() options.
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#get-file-from-repository
- type GetFileOptions struct {
- Ref *string `url:"ref,omitempty" json:"ref,omitempty"`
- }
- // GetFile allows you to receive information about a file in repository like
- // name, size, content. Note that file content is Base64 encoded.
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#get-file-from-repository
- func (s *RepositoryFilesService) GetFile(pid interface{}, fileName string, opt *GetFileOptions, options ...OptionFunc) (*File, *Response, error) {
- project, err := parseID(pid)
- if err != nil {
- return nil, nil, err
- }
- u := fmt.Sprintf(
- "projects/%s/repository/files/%s",
- url.QueryEscape(project),
- url.PathEscape(fileName),
- )
- req, err := s.client.NewRequest("GET", u, opt, options)
- if err != nil {
- return nil, nil, err
- }
- f := new(File)
- resp, err := s.client.Do(req, f)
- if err != nil {
- return nil, resp, err
- }
- return f, resp, err
- }
- // GetFileMetaDataOptions represents the available GetFileMetaData() options.
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#get-file-from-repository
- type GetFileMetaDataOptions struct {
- Ref *string `url:"ref,omitempty" json:"ref,omitempty"`
- }
- // GetFileMetaData allows you to receive meta information about a file in
- // repository like name, size.
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#get-file-from-repository
- func (s *RepositoryFilesService) GetFileMetaData(pid interface{}, fileName string, opt *GetFileMetaDataOptions, options ...OptionFunc) (*File, *Response, error) {
- project, err := parseID(pid)
- if err != nil {
- return nil, nil, err
- }
- u := fmt.Sprintf(
- "projects/%s/repository/files/%s",
- url.QueryEscape(project),
- url.PathEscape(fileName),
- )
- req, err := s.client.NewRequest("HEAD", u, opt, options)
- if err != nil {
- return nil, nil, err
- }
- resp, err := s.client.Do(req, nil)
- if err != nil {
- return nil, resp, err
- }
- f := &File{
- BlobID: resp.Header.Get("X-Gitlab-Blob-Id"),
- CommitID: resp.Header.Get("X-Gitlab-Last-Commit-Id"),
- Encoding: resp.Header.Get("X-Gitlab-Encoding"),
- FileName: resp.Header.Get("X-Gitlab-File-Name"),
- FilePath: resp.Header.Get("X-Gitlab-File-Path"),
- Ref: resp.Header.Get("X-Gitlab-Ref"),
- }
- if sizeString := resp.Header.Get("X-Gitlab-Size"); sizeString != "" {
- f.Size, err = strconv.Atoi(sizeString)
- if err != nil {
- return nil, resp, err
- }
- }
- return f, resp, err
- }
- // GetRawFileOptions represents the available GetRawFile() options.
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#get-raw-file-from-repository
- type GetRawFileOptions struct {
- Ref *string `url:"ref,omitempty" json:"ref,omitempty"`
- }
- // GetRawFile allows you to receive the raw file in repository.
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#get-raw-file-from-repository
- func (s *RepositoryFilesService) GetRawFile(pid interface{}, fileName string, opt *GetRawFileOptions, options ...OptionFunc) ([]byte, *Response, error) {
- project, err := parseID(pid)
- if err != nil {
- return nil, nil, err
- }
- u := fmt.Sprintf(
- "projects/%s/repository/files/%s/raw",
- url.QueryEscape(project),
- url.PathEscape(fileName),
- )
- req, err := s.client.NewRequest("GET", u, opt, options)
- if err != nil {
- return nil, nil, err
- }
- var f bytes.Buffer
- resp, err := s.client.Do(req, &f)
- if err != nil {
- return nil, resp, err
- }
- return f.Bytes(), resp, err
- }
- // FileInfo represents file details of a GitLab repository file.
- //
- // GitLab API docs: https://docs.gitlab.com/ce/api/repository_files.html
- type FileInfo struct {
- FilePath string `json:"file_path"`
- Branch string `json:"branch"`
- }
- func (r FileInfo) String() string {
- return Stringify(r)
- }
- // CreateFileOptions represents the available CreateFile() options.
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#create-new-file-in-repository
- type CreateFileOptions struct {
- Branch *string `url:"branch,omitempty" json:"branch,omitempty"`
- Encoding *string `url:"encoding,omitempty" json:"encoding,omitempty"`
- AuthorEmail *string `url:"author_email,omitempty" json:"author_email,omitempty"`
- AuthorName *string `url:"author_name,omitempty" json:"author_name,omitempty"`
- Content *string `url:"content,omitempty" json:"content,omitempty"`
- CommitMessage *string `url:"commit_message,omitempty" json:"commit_message,omitempty"`
- }
- // CreateFile creates a new file in a repository.
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#create-new-file-in-repository
- func (s *RepositoryFilesService) CreateFile(pid interface{}, fileName string, opt *CreateFileOptions, options ...OptionFunc) (*FileInfo, *Response, error) {
- project, err := parseID(pid)
- if err != nil {
- return nil, nil, err
- }
- u := fmt.Sprintf(
- "projects/%s/repository/files/%s",
- url.QueryEscape(project),
- url.PathEscape(fileName),
- )
- req, err := s.client.NewRequest("POST", u, opt, options)
- if err != nil {
- return nil, nil, err
- }
- f := new(FileInfo)
- resp, err := s.client.Do(req, f)
- if err != nil {
- return nil, resp, err
- }
- return f, resp, err
- }
- // UpdateFileOptions represents the available UpdateFile() options.
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#update-existing-file-in-repository
- type UpdateFileOptions struct {
- Branch *string `url:"branch,omitempty" json:"branch,omitempty"`
- Encoding *string `url:"encoding,omitempty" json:"encoding,omitempty"`
- AuthorEmail *string `url:"author_email,omitempty" json:"author_email,omitempty"`
- AuthorName *string `url:"author_name,omitempty" json:"author_name,omitempty"`
- Content *string `url:"content,omitempty" json:"content,omitempty"`
- CommitMessage *string `url:"commit_message,omitempty" json:"commit_message,omitempty"`
- LastCommitID *string `url:"last_commit_id,omitempty" json:"last_commit_id,omitempty"`
- }
- // UpdateFile updates an existing file in a repository
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#update-existing-file-in-repository
- func (s *RepositoryFilesService) UpdateFile(pid interface{}, fileName string, opt *UpdateFileOptions, options ...OptionFunc) (*FileInfo, *Response, error) {
- project, err := parseID(pid)
- if err != nil {
- return nil, nil, err
- }
- u := fmt.Sprintf(
- "projects/%s/repository/files/%s",
- url.QueryEscape(project),
- url.PathEscape(fileName),
- )
- req, err := s.client.NewRequest("PUT", u, opt, options)
- if err != nil {
- return nil, nil, err
- }
- f := new(FileInfo)
- resp, err := s.client.Do(req, f)
- if err != nil {
- return nil, resp, err
- }
- return f, resp, err
- }
- // DeleteFileOptions represents the available DeleteFile() options.
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#delete-existing-file-in-repository
- type DeleteFileOptions struct {
- Branch *string `url:"branch,omitempty" json:"branch,omitempty"`
- AuthorEmail *string `url:"author_email,omitempty" json:"author_email,omitempty"`
- AuthorName *string `url:"author_name,omitempty" json:"author_name,omitempty"`
- CommitMessage *string `url:"commit_message,omitempty" json:"commit_message,omitempty"`
- }
- // DeleteFile deletes an existing file in a repository
- //
- // GitLab API docs:
- // https://docs.gitlab.com/ce/api/repository_files.html#delete-existing-file-in-repository
- func (s *RepositoryFilesService) DeleteFile(pid interface{}, fileName string, opt *DeleteFileOptions, options ...OptionFunc) (*Response, error) {
- project, err := parseID(pid)
- if err != nil {
- return nil, err
- }
- u := fmt.Sprintf(
- "projects/%s/repository/files/%s",
- url.QueryEscape(project),
- url.PathEscape(fileName),
- )
- req, err := s.client.NewRequest("DELETE", u, opt, options)
- if err != nil {
- return nil, err
- }
- return s.client.Do(req, nil)
- }
|