project_import_export.go

  1package gitlab
  2
  3import (
  4	"bytes"
  5	"fmt"
  6	"time"
  7)
  8
  9// ProjectImportExportService handles communication with the project
 10// import/export related methods of the GitLab API.
 11//
 12// GitLab API docs:
 13// https://docs.gitlab.com/ce/user/project/settings/import_export.html
 14type ProjectImportExportService struct {
 15	client *Client
 16}
 17
 18// ImportStatus represents a project import status.
 19//
 20// GitLab API docs:
 21// https://docs.gitlab.com/ce/api/project_import_export.html#import-status
 22type ImportStatus struct {
 23	ID                int        `json:"id"`
 24	Description       string     `json:"description"`
 25	Name              string     `json:"name"`
 26	NameWithNamespace string     `json:"name_with_namespace"`
 27	Path              string     `json:"path"`
 28	PathWithNamespace string     `json:"path_with_namespace"`
 29	CreateAt          *time.Time `json:"create_at"`
 30	ImportStatus      string     `json:"import_status"`
 31}
 32
 33func (s ImportStatus) String() string {
 34	return Stringify(s)
 35}
 36
 37// ExportStatus represents a project export status.
 38//
 39// GitLab API docs:
 40// https://docs.gitlab.com/ce/api/project_import_export.html#export-status
 41type ExportStatus struct {
 42	ID                int        `json:"id"`
 43	Description       string     `json:"description"`
 44	Name              string     `json:"name"`
 45	NameWithNamespace string     `json:"name_with_namespace"`
 46	Path              string     `json:"path"`
 47	PathWithNamespace string     `json:"path_with_namespace"`
 48	CreatedAt         *time.Time `json:"created_at"`
 49	ExportStatus      string     `json:"export_status"`
 50	Message           string     `json:"message"`
 51	Links             struct {
 52		APIURL string `json:"api_url"`
 53		WebURL string `json:"web_url"`
 54	} `json:"_links"`
 55}
 56
 57func (s ExportStatus) String() string {
 58	return Stringify(s)
 59}
 60
 61// ScheduleExportOptions represents the available ScheduleExport() options.
 62//
 63// GitLab API docs:
 64// https://docs.gitlab.com/ce/api/project_import_export.html#schedule-an-export
 65type ScheduleExportOptions struct {
 66	Description *string `url:"description,omitempty" json:"description,omitempty"`
 67	Upload      struct {
 68		URL        *string `url:"url,omitempty" json:"url,omitempty"`
 69		HTTPMethod *string `url:"http_method,omitempty" json:"http_method,omitempty"`
 70	} `url:"upload,omitempty" json:"upload,omitempty"`
 71}
 72
 73// ScheduleExport schedules a project export.
 74//
 75// GitLab API docs:
 76// https://docs.gitlab.com/ce/api/project_import_export.html#schedule-an-export
 77func (s *ProjectImportExportService) ScheduleExport(pid interface{}, opt *ScheduleExportOptions, options ...OptionFunc) (*Response, error) {
 78	project, err := parseID(pid)
 79	if err != nil {
 80		return nil, err
 81	}
 82	u := fmt.Sprintf("projects/%s/export", pathEscape(project))
 83
 84	req, err := s.client.NewRequest("POST", u, opt, options)
 85	if err != nil {
 86		return nil, err
 87	}
 88
 89	return s.client.Do(req, nil)
 90}
 91
 92// ExportStatus get the status of export.
 93//
 94// GitLab API docs:
 95// https://docs.gitlab.com/ce/api/project_import_export.html#export-status
 96func (s *ProjectImportExportService) ExportStatus(pid interface{}, options ...OptionFunc) (*ExportStatus, *Response, error) {
 97	project, err := parseID(pid)
 98	if err != nil {
 99		return nil, nil, err
100	}
101	u := fmt.Sprintf("projects/%s/export", pathEscape(project))
102
103	req, err := s.client.NewRequest("GET", u, nil, options)
104	if err != nil {
105		return nil, nil, err
106	}
107
108	es := new(ExportStatus)
109	resp, err := s.client.Do(req, es)
110	if err != nil {
111		return nil, resp, err
112	}
113
114	return es, resp, err
115}
116
117// ExportDownload download the finished export.
118//
119// GitLab API docs:
120// https://docs.gitlab.com/ce/api/project_import_export.html#export-download
121func (s *ProjectImportExportService) ExportDownload(pid interface{}, options ...OptionFunc) ([]byte, *Response, error) {
122	project, err := parseID(pid)
123	if err != nil {
124		return nil, nil, err
125	}
126	u := fmt.Sprintf("projects/%s/export/download", pathEscape(project))
127
128	req, err := s.client.NewRequest("GET", u, nil, options)
129	if err != nil {
130		return nil, nil, err
131	}
132
133	var b bytes.Buffer
134	resp, err := s.client.Do(req, &b)
135	if err != nil {
136		return nil, resp, err
137	}
138
139	return b.Bytes(), resp, err
140}
141
142// ImportFileOptions represents the available ImportFile() options.
143//
144// GitLab API docs:
145// https://docs.gitlab.com/ce/api/project_import_export.html#import-a-file
146type ImportFileOptions struct {
147	Namespace      *string               `url:"namespace,omitempty" json:"namespace,omitempty"`
148	File           *string               `url:"file,omitempty" json:"file,omitempty"`
149	Path           *string               `url:"path,omitempty" json:"path,omitempty"`
150	Overwrite      *bool                 `url:"overwrite,omitempty" json:"overwrite,omitempty"`
151	OverrideParams *CreateProjectOptions `url:"override_params,omitempty" json:"override_params,omitempty"`
152}
153
154// ImportProject import the project.
155//
156// GitLab API docs:
157// https://docs.gitlab.com/ce/api/project_import_export.html#import-a-file
158func (s *ProjectImportExportService) ImportProject(opt *ImportFileOptions, options ...OptionFunc) (*ImportStatus, *Response, error) {
159	req, err := s.client.NewRequest("POST", "/projects/import", opt, options)
160	if err != nil {
161		return nil, nil, err
162	}
163
164	is := new(ImportStatus)
165	resp, err := s.client.Do(req, is)
166	if err != nil {
167		return nil, resp, err
168	}
169
170	return is, resp, err
171}
172
173// ImportStatus get the status of an import.
174//
175// GitLab API docs:
176// https://docs.gitlab.com/ce/api/project_import_export.html#import-status
177func (s *ProjectImportExportService) ImportStatus(pid interface{}, options ...OptionFunc) (*ImportStatus, *Response, error) {
178	project, err := parseID(pid)
179	if err != nil {
180		return nil, nil, err
181	}
182	u := fmt.Sprintf("projects/%s/import", pathEscape(project))
183
184	req, err := s.client.NewRequest("GET", u, nil, options)
185	if err != nil {
186		return nil, nil, err
187	}
188
189	is := new(ImportStatus)
190	resp, err := s.client.Do(req, is)
191	if err != nil {
192		return nil, resp, err
193	}
194
195	return is, resp, err
196}