grim/youtrack-import
Clone
Summary
Browse
Changes
Graph
Convert bold, italic, and bold italic to the markdown version
draft
2020-08-04, Gary Kramlich
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
}