grim/youtrack-import

cdadae07e61c
Convert bold, italic, and bold italic to the markdown version
package youtrack
import (
"encoding/xml"
"fmt"
"net/http"
"net/url"
"time"
)
type Version struct {
Name string
Description string
Released bool
ReleaseDate time.Time
Archived bool
}
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 string, version Version) error {
baseUri := c.uri + "/admin/customfield/versionBundle/" + name + "/" + version.Name
values := url.Values{}
if version.Description != "" {
values.Add("description", version.Description)
}
if version.Released != false {
values.Add("released", "true")
}
if !version.ReleaseDate.IsZero() {
values.Add("releaseDate", fmt.Sprintf("%d", version.ReleaseDate.Unix()*1000))
}
if version.Archived != false {
values.Add("archived", "true")
}
resp, err := c.request(
http.MethodPut,
baseUri+"?"+values.Encode(),
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", version.Name, 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.Name)
if _, found := existing[version.Name]; 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
}