-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmain.go
129 lines (107 loc) · 3.35 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package main
import (
"bytes"
"flag"
"fmt"
"log"
"runtime/debug"
"github.com/natenho/go-jira-migrate/migration"
)
var (
version = "dev"
commit = "none"
date = "unknown"
)
const defaultWorkerPoolSize = 8
type flagStringArray []string
func (f *flagStringArray) String() string {
if f == nil {
return ""
}
var buffer bytes.Buffer
for _, value := range *f {
buffer.WriteString(value)
}
return buffer.String()
}
func (f *flagStringArray) Set(value string) error {
*f = append(*f, value)
return nil
}
func main() {
var sourceUrl = flag.String("source", "", "Source JIRA URL (e.g. https://your-source-domain.atlassian.net/)")
var targetUrl = flag.String("target", "", "Target JIRA URL (e.g. https://your-target-domain.atlassian.net/)")
var user = flag.String("user", "", "User")
var apiKey = flag.String("api-key", "", "API Key (to create one, visit https://tinyurl.com/jira-api-token/)")
var sourceProjectKey = flag.String("source-project", "", "Source project key (e.g. MYPROJ)")
var targetProjectKey = flag.String("target-project", "", "Target project key (e.g. OTHER)")
var jql = flag.String("query", "Status != Done", "JQL query returning issues to be migrated from the selected project (e.g. \"status != Done\" to migrate only pending issues)")
var workers = flag.Int("workers", defaultWorkerPoolSize, "How many migrations should occur in parallel")
var importSprints = flag.Bool("sprints", true, "Define if sprints will be imported")
var deleteOnError = flag.Bool("delete-on-error", false, "Define if issues migrated with errors should be deleted")
var version = flag.Bool("version", false, "Print version and exit")
var customFields flagStringArray
flag.Var(&customFields, "field", "Custom fields to read from source project (includes 'Story point estimate' and 'Flagged' by default)")
customFields = append(customFields, "Story point estimate")
customFields = append(customFields, "Story Points")
customFields = append(customFields, "Flagged")
var additionalLabels flagStringArray
flag.Var(&additionalLabels, "label", "Additional labels to assign to migrated issues (includes 'MIGRATED' label) by default")
additionalLabels = append(additionalLabels, "MIGRATED")
flag.Parse()
if *version {
printVersion()
return
}
if *sourceProjectKey == "" {
log.Println("Invalid project key")
printVersion()
flag.Usage()
return
}
if *targetProjectKey == "" {
log.Println("Invalid target project key")
printVersion()
flag.Usage()
return
}
if *jql == "" {
log.Println("Invalid JQL query")
printVersion()
flag.Usage()
return
}
migrator, err := migration.NewMigrator(
*sourceUrl,
*targetUrl,
*user,
*apiKey,
*sourceProjectKey,
*targetProjectKey,
migration.WithWorkerPoolSize(*workers),
migration.WithAdditionalLabels(additionalLabels...),
migration.WithCustomFields(customFields...),
migration.WithSprints(*importSprints),
migration.WithDeleteOnError(*deleteOnError),
)
if err != nil {
log.Println(err)
return
}
results, err := migrator.Execute(*jql)
if err != nil {
log.Println(err)
return
}
var issueCount int
for result := range results {
log.Println(result)
issueCount++
}
log.Printf("%d issues processed.", issueCount)
}
func printVersion() {
if buildInfo, ok := debug.ReadBuildInfo(); ok {
fmt.Printf("%s@%s commit %s (%s) %s\n", buildInfo.Path, version, commit, date, buildInfo.GoVersion)
}
}