@@ -16,7 +16,7 @@ defmodule SlackCoder.Github.Watchers.MergeConflict do
16
16
GenServer . start_link ( __MODULE__ , % { prs: [ ] } , name: __MODULE__ )
17
17
end
18
18
19
- @ normal_wait_time 60 * 5 * 1_000
19
+ @ normal_wait_time 60 * 1 * 1_000
20
20
def init ( state ) do
21
21
Process . send_after ( self ( ) , :check_conflicts , @ normal_wait_time )
22
22
{ :ok , state }
@@ -95,28 +95,38 @@ defmodule SlackCoder.Github.Watchers.MergeConflict do
95
95
{ :noreply , state }
96
96
end
97
97
def handle_info ( :check_conflicts , % { prs: prs } = state ) do
98
- remaining_prs =
99
- case SlackCoder.Github . query ( @ mergeable_query , variable_params ( prs ) ) do
100
- { :ok , % { "data" => data } } when is_map ( data ) ->
101
- response_prs = Map . values ( data ) |> Enum . map ( & ( & 1 [ "pullRequest" ] ) ) |> Enum . filter ( & ( & 1 ) )
98
+ # This could take some time with the autoretry, so don't hold up the genserver or others tryig to
99
+ # contact the genserver will time out since the genserver can be sleeping
100
+ s = self ( )
101
+ Task.Supervisor . start_child SlackCoder.TaskSupervisor , fn ->
102
+ remaining_prs =
103
+ case SlackCoder.Github . query ( @ mergeable_query , variable_params ( prs ) ) do
104
+ { :ok , % { "data" => data } } when is_map ( data ) ->
105
+ response_prs = Map . values ( data ) |> Enum . map ( & ( & 1 [ "pullRequest" ] ) ) |> Enum . filter ( & ( & 1 ) )
102
106
103
- Enum . reject ( prs , fn ( pr ) ->
104
- response = Enum . find ( response_prs , & ( & 1 [ "number" ] == pr . number && & 1 [ "repository" ] [ "name" ] == pr . repo && & 1 [ "repository" ] [ "owner" ] [ "login" ] == pr . owner ) )
105
- if response && response [ "mergeable" ] != @ unknown do
106
- Logger . debug [ IO.ANSI . green , IO.ANSI . bright , "[MergeConflict] " , IO.ANSI . normal , IO.ANSI . default_color , "Status of PR-" , to_string ( pr . number ) , " " , response [ "mergeable" ] ]
107
- pr
108
- |> Github . find_watcher ( )
109
- |> PullRequest . update_sync ( % { "mergeable_state" => response [ "mergeable" ] |> convert_mergeable ( ) } )
110
- end
111
- end )
112
- % HTTPoison.Error { reason: :timeout } ->
113
- # Ignore (Rate limiting)
114
- prs
115
- error ->
116
- Logger . warn "Received unexpected response from Github: #{ inspect error } "
117
- prs
118
- end
107
+ Enum . reject ( prs , fn ( pr ) ->
108
+ response = Enum . find ( response_prs , & ( & 1 [ "number" ] == pr . number && & 1 [ "repository" ] [ "name" ] == pr . repo && & 1 [ "repository" ] [ "owner" ] [ "login" ] == pr . owner ) )
109
+ if response && response [ "mergeable" ] != @ unknown do
110
+ Logger . debug [ IO.ANSI . green , IO.ANSI . bright , "[MergeConflict] " , IO.ANSI . normal , IO.ANSI . default_color , "Status of PR-" , to_string ( pr . number ) , " " , response [ "mergeable" ] ]
111
+ pr
112
+ |> Github . find_watcher ( )
113
+ |> PullRequest . update_sync ( % { "mergeable_state" => response [ "mergeable" ] |> convert_mergeable ( ) } )
114
+ end
115
+ end )
116
+ % HTTPoison.Error { reason: :timeout } ->
117
+ # Ignore (Rate limiting)
118
+ prs
119
+ error ->
120
+ Logger . warn "Received unexpected response from Github: #{ inspect error } "
121
+ prs
122
+ end
123
+ send ( s , { :check_conflict_complete , remaining_prs } )
124
+ end
119
125
126
+ { :noreply , state }
127
+ end
128
+
129
+ def handle_info ( { :check_conflict_complete , remaining_prs } , state ) do
120
130
Process . send_after ( self ( ) , :check_conflicts , check_conflict_timeout ( remaining_prs ) )
121
131
{ :noreply , Map . put ( state , :prs , remaining_prs ) }
122
132
end
0 commit comments