-
Notifications
You must be signed in to change notification settings - Fork 10
/
common.clj
139 lines (119 loc) · 6.39 KB
/
common.clj
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
(ns flower.tracker.github.common
(:require [clojure.string :as string]
[flower.macros :as macros]
[flower.tracker.proto :as proto])
(:import (java.net URL)
(org.eclipse.egit.github.core Issue
Label)
(org.eclipse.egit.github.core.client GitHubClient
RequestException)
(org.eclipse.egit.github.core.service RepositoryService
IssueService
MilestoneService
UserService)))
;;
;; Public definitions
;;
(macros/public-definition get-github-conn-inner always-cached)
(macros/public-definition get-github-project-inner always-cached)
(macros/public-definition get-github-projects-inner cached)
(macros/public-definition get-github-workitems-inner cached)
(macros/public-definition get-github-workitem-comments-inner cached)
(macros/public-definition get-github-iterations-inner cached)
(macros/public-definition get-github-capacity-inner cached)
(macros/public-definition set-github-workitem-inner!)
;;
;; Private definitions
;;
(defn- private-get-github-conn-inner
([tracker] (let [auth (get-in (proto/get-tracker-component tracker)
[:auth]
{})
login (get auth :github-login)
password (get auth :github-password)
token (get auth :github-token)]
(cond
token (private-get-github-conn-inner tracker token)
(and login password) (private-get-github-conn-inner tracker login password)
:else (GitHubClient/createClient (proto/get-tracker-url tracker)))))
([tracker token] (doto (GitHubClient/createClient (proto/get-tracker-url tracker))
(.setOAuth2Token token)))
([tracker login password] (doto (GitHubClient/createClient (proto/get-tracker-url tracker))
(.setCredentials login password))))
(defn- private-get-github-projects-inner [tracker]
(let [user-name (-> (URL. (proto/get-tracker-url tracker))
(.getPath)
(rest)
(string/join))
conn-inner (get-github-conn-inner tracker)
repository-service (RepositoryService. conn-inner)]
(try
(.getOrgRepositories repository-service user-name)
(catch RequestException re (.getRepositories repository-service user-name)))))
(defn- private-get-github-project-inner [tracker]
(let [project-name (proto/get-project-name tracker)]
(-> (filter (fn [project]
(= (.getName project)
project-name))
(private-get-github-projects-inner tracker))
(first))))
(defn- private-get-github-workitems-inner
([tracker] (let [conn-inner (get-github-conn-inner tracker)
project-inner (get-github-project-inner tracker)
issue-service (IssueService. conn-inner)]
(.getIssues issue-service project-inner nil)))
([tracker task-ids] (let [task-ids-list (into [] (map #(Integer. %)
(filter identity task-ids)))]
(into [] (filter (fn [issue]
(.contains task-ids-list (.getNumber issue)))
(get-github-workitems-inner tracker))))))
(defn- private-get-github-workitem-comments-inner [tracker workitem-inner]
(let [conn-inner (get-github-conn-inner tracker)
project-inner (get-github-project-inner tracker)
workitem-id (.getNumber workitem-inner)
issue-service (IssueService. conn-inner)]
(.getComments issue-service project-inner workitem-id)))
(defn- private-get-github-iterations-inner [tracker]
(let [conn-inner (get-github-conn-inner tracker)
repository-inner (get-github-project-inner tracker)
milestone-service (MilestoneService. conn-inner)]
(.getMilestones milestone-service repository-inner nil)))
(defn- private-get-github-capacity-inner [tracker iteration]
nil)
(defn- private-set-github-workitem-inner! [tracker task-id fields]
(let [conn-inner (get-github-conn-inner tracker)
project-inner (get-github-project-inner tracker)
issue-service (IssueService. conn-inner)
user-service (UserService. conn-inner)
workitem-inner (or (first (get-github-workitems-inner tracker [task-id]))
(Issue.))
workitem-inner-new (doto workitem-inner
(.setTitle (if (contains? fields :task-title)
(get fields :task-title)
(.getTitle workitem-inner)))
(.setBody (if (contains? fields :task-description)
(get fields :task-description)
(.getBody workitem-inner)))
(.setUser (if (contains? fields :task-assignee)
(let [assignee-name (get fields :task-assignee)]
(and assignee-name
(.getUser user-service assignee-name)))
(.getUser workitem-inner)))
(.setLabels (if (contains? fields :task-tags)
(let [tags (get fields :task-tags)]
(and tags
(map (fn [label-name]
(doto (Label.)
(.setName label-name)))
tags)))
(.getLabels workitem-inner)))
(.setState (if (contains? fields :task-state)
(get fields :task-state)
(.getState workitem-inner))))]
(if task-id
(.editIssue issue-service
project-inner
workitem-inner-new)
(.createIssue issue-service
project-inner
workitem-inner-new))))