aboutsummaryrefslogtreecommitdiffstats
path: root/bridge/gitlab/import_notes.go
blob: b38cb37121dec763f04effb0c7590fbc843a519a (plain) (blame)
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package gitlab

import (
	"strings"

	"github.com/xanzy/go-gitlab"
)

type NoteType int

const (
	_ NoteType = iota
	NOTE_COMMENT
	NOTE_TITLE_CHANGED
	NOTE_DESCRIPTION_CHANGED
	NOTE_CLOSED
	NOTE_REOPENED
	NOTE_LOCKED
	NOTE_UNLOCKED
	NOTE_CHANGED_DUEDATE
	NOTE_REMOVED_DUEDATE
	NOTE_ASSIGNED
	NOTE_UNASSIGNED
	NOTE_CHANGED_MILESTONE
	NOTE_REMOVED_MILESTONE
	NOTE_MENTIONED_IN_ISSUE
	NOTE_MENTIONED_IN_MERGE_REQUEST
	NOTE_UNKNOWN
)

func (nt NoteType) String() string {
	switch nt {
	case NOTE_COMMENT:
		return "note comment"
	case NOTE_TITLE_CHANGED:
		return "note title changed"
	case NOTE_DESCRIPTION_CHANGED:
		return "note description changed"
	case NOTE_CLOSED:
		return "note closed"
	case NOTE_REOPENED:
		return "note reopened"
	case NOTE_LOCKED:
		return "note locked"
	case NOTE_UNLOCKED:
		return "note unlocked"
	case NOTE_CHANGED_DUEDATE:
		return "note changed duedate"
	case NOTE_REMOVED_DUEDATE:
		return "note remove duedate"
	case NOTE_ASSIGNED:
		return "note assigned"
	case NOTE_UNASSIGNED:
		return "note unassigned"
	case NOTE_CHANGED_MILESTONE:
		return "note changed milestone"
	case NOTE_REMOVED_MILESTONE:
		return "note removed in milestone"
	case NOTE_MENTIONED_IN_ISSUE:
		return "note mentioned in issue"
	case NOTE_MENTIONED_IN_MERGE_REQUEST:
		return "note mentioned in merge request"
	case NOTE_UNKNOWN:
		return "note unknown"
	default:
		panic("unknown note type")
	}
}

// GetNoteType parse a note system and body and return the note type and it content
func GetNoteType(n *gitlab.Note) (NoteType, string) {
	// when a note is a comment system is set to false
	// when a note is a different event system is set to true
	// because Gitlab
	if !n.System {
		return NOTE_COMMENT, n.Body
	}

	if n.Body == "closed" {
		return NOTE_CLOSED, ""
	}

	if n.Body == "reopened" {
		return NOTE_REOPENED, ""
	}

	if n.Body == "changed the description" {
		return NOTE_DESCRIPTION_CHANGED, ""
	}

	if n.Body == "locked this issue" {
		return NOTE_LOCKED, ""
	}

	if n.Body == "unlocked this issue" {
		return NOTE_UNLOCKED, ""
	}

	if strings.HasPrefix(n.Body, "changed title from") {
		return NOTE_TITLE_CHANGED, getNewTitle(n.Body)
	}

	if strings.HasPrefix(n.Body, "changed due date to") {
		return NOTE_CHANGED_DUEDATE, ""
	}

	if n.Body == "removed due date" {
		return NOTE_REMOVED_DUEDATE, ""
	}

	if strings.HasPrefix(n.Body, "assigned to @") {
		return NOTE_ASSIGNED, ""
	}

	if strings.HasPrefix(n.Body, "unassigned @") {
		return NOTE_UNASSIGNED, ""
	}

	if strings.HasPrefix(n.Body, "changed milestone to %") {
		return NOTE_CHANGED_MILESTONE, ""
	}

	if strings.HasPrefix(n.Body, "removed milestone") {
		return NOTE_REMOVED_MILESTONE, ""
	}

	if strings.HasPrefix(n.Body, "mentioned in issue") {
		return NOTE_MENTIONED_IN_ISSUE, ""
	}

	if strings.HasPrefix(n.Body, "mentioned in merge request") {
		return NOTE_MENTIONED_IN_MERGE_REQUEST, ""
	}

	return NOTE_UNKNOWN, ""
}

// getNewTitle parses body diff given by gitlab api and return it final form
// examples: "changed title from **fourth issue** to **fourth issue{+ changed+}**"
//           "changed title from **fourth issue{- changed-}** to **fourth issue**"
// because Gitlab
func getNewTitle(diff string) string {
	newTitle := strings.Split(diff, "** to **")[1]
	newTitle = strings.Replace(newTitle, "{+", "", -1)
	newTitle = strings.Replace(newTitle, "+}", "", -1)
	return strings.TrimSuffix(newTitle, "**")
}