grim/youtrack-import

Use the built in mime stuff to figure out the content type for attachments
package youtrack
import (
"encoding/xml"
"fmt"
"net/http"
)
type VersionField struct {
Released bool `xml:"released,attr"`
Archived bool `xml:"archived,attr"`
Description string `xml:"description,attr"`
ReleaseDate int64 `xml:"releaseDate,attr"`
Name string `xml:",cdata"`
}
type VersionFieldBundle struct {
XMLName xml.Name `xml:"versions"`
Name string `xml:"name,attr"`
Versions []VersionField `xml:"version"`
}
func (c *Client) GetProjectVersions(projectID string) (*VersionFieldBundle, error) {
pcf, err := c.GetProjectCustomField(projectID, "Affected versions")
if err != nil {
return nil, err
}
name, err := pcf.GetBundleName()
if err != nil {
return nil, err
}
return c.GetVersionFieldBundle(name)
}
func (c *Client) GetVersionFieldBundle(name string) (*VersionFieldBundle, error) {
resp, err := c.request(
http.MethodGet,
c.uri+"/admin/customfield/versionBundle/"+name,
nil,
)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if err := c.checkStatus(resp, http.StatusOK); err != nil {
return nil, fmt.Errorf("failed to get versionBundle: %v", err)
}
bundle := &VersionFieldBundle{}
return bundle, xml.NewDecoder(resp.Body).Decode(bundle)
}
func (c *Client) AppendVersionFieldBundle(name, value string) error {
resp, err := c.request(
http.MethodPut,
c.uri+"/admin/customfield/versionBundle/"+name+"/"+value,
nil,
)
if err != nil {
return err
}
defer resp.Body.Close()
if err := c.checkStatus(resp, http.StatusCreated); err != nil {
return fmt.Errorf("failed to append %q to %q: %v", value, name, err)
}
return nil
}
func (c *Client) CreateVersions(p *Project) error {
bundle, err := c.GetProjectVersions(p.ID)
if err != nil {
return err
}
// create a map of the existing versions
existing := map[string]bool{}
for _, version := range bundle.Versions {
existing[version.Name] = true
}
// now run through the version slice and add all the versions
for _, version := range p.Versions {
fmt.Printf("creating version %q ... ", version)
if _, found := existing[version]; found {
fmt.Printf("already exists.\n")
continue
}
if err := c.AppendVersionFieldBundle(bundle.Name, version); err != nil {
fmt.Printf("failed.\n")
return err
}
fmt.Printf("done.\n")
}
return nil
}