110110"""
111111
112112
113- def handle_github_message ( body , config , is_pr = False ):
113+ def passes_github_filters ( item , config , upstream , item_type = "issue" ):
114114 """
115- Handle GitHub message from FedMsg.
116-
117- :param Dict body: FedMsg Message body
118- :param Dict config: Config File
119- :param Bool is_pr: msg refers to a pull request
120- :returns: Issue object
121- :rtype: sync2jira.intermediary.Issue
115+ Apply GitHub filters (labels, milestone, other fields) to an item.
116+
117+ :param dict item: GitHub issue or PR data
118+ :param dict _filter: Filter configuration
119+ :param str upstream: Upstream repository name
120+ :param str item_type: Type of item for logging ("issue" or "PR")
121+ :returns: True if item passes all filters, False otherwise
122+ :rtype: bool
122123 """
123- owner = body ["repository" ]["owner" ]["login" ]
124- repo = body ["repository" ]["name" ]
125- upstream = "{owner}/{repo}" .format (owner = owner , repo = repo )
126-
124+ filter_config = (
125+ config ["sync2jira" ].get ("filters" , {}).get ("github" , {}).get (upstream , {})
126+ )
127127 mapped_repos = config ["sync2jira" ]["map" ]["github" ]
128128 if upstream not in mapped_repos :
129129 log .debug ("%r not in Github map: %r" , upstream , mapped_repos .keys ())
130130 return None
131- key = "pullrequest" if is_pr else "issue"
131+ key = "pullrequest" if item_type == "PR" else "issue"
132132 if key not in mapped_repos [upstream ].get ("sync" , []):
133133 log .debug (
134134 "%r not in Github sync map: %r" ,
@@ -137,36 +137,57 @@ def handle_github_message(body, config, is_pr=False):
137137 )
138138 return None
139139
140- _filter = config ["sync2jira" ].get ("filters" , {}).get ("github" , {}).get (upstream , {})
141-
142- issue = body ["issue" ]
143- for key , expected in _filter .items ():
140+ for key , expected in filter_config .items ():
144141 if key == "labels" :
145- # special handling for label: we look for it in the list of msg labels
146- actual = {label ["name" ] for label in issue [ "labels" ] }
142+ # special handling for label: we look for it in the list of labels
143+ actual = {label ["name" ] for label in item . get ( "labels" , []) }
147144 if actual .isdisjoint (expected ):
148- log .debug ("Labels %s not found on issue: %s" , expected , upstream )
149- return None
145+ log .debug (
146+ "Labels %s not found on %s: %s" , expected , upstream , item_type
147+ )
148+ return False
150149 elif key == "milestone" :
151150 # special handling for milestone: use the number
152- milestone = issue .get (key ) or {} # Key might exist with value `None`
151+ milestone = item .get (key ) or {} # Key might exist with value `None`
153152 actual = milestone .get ("number" )
154153 if expected != actual :
155- log .debug ("Milestone %s not set on issue: %s" , expected , upstream )
156- return None
154+ log .debug (
155+ "Milestone %s not set on %s: %s" , expected , upstream , item_type
156+ )
157+ return False
157158 else :
158159 # direct comparison
159- actual = issue .get (key )
160+ actual = item .get (key )
160161 if actual != expected :
161162 log .debug (
162- "Actual %r %r != expected %r on issue %s" ,
163+ "Actual %r %r != expected %r on %s %s" ,
163164 key ,
164165 actual ,
165166 expected ,
166167 upstream ,
168+ item_type ,
167169 )
168- return None
170+ return False
171+ return True
172+
173+
174+ def handle_github_message (body , config , is_pr = False ):
175+ """
176+ Handle GitHub message from FedMsg.
177+
178+ :param Dict body: FedMsg Message body
179+ :param Dict config: Config File
180+ :param Bool is_pr: msg refers to a pull request
181+ :returns: Issue object
182+ :rtype: sync2jira.intermediary.Issue
183+ """
184+ owner = body ["repository" ]["owner" ]["login" ]
185+ repo = body ["repository" ]["name" ]
186+ upstream = "{owner}/{repo}" .format (owner = owner , repo = repo )
169187
188+ issue = body ["issue" ]
189+ if not passes_github_filters (issue , config , upstream , item_type = "issue" ):
190+ return None
170191 if is_pr and not issue .get ("closed_at" ):
171192 log .debug (
172193 "%r is a pull request. Ignoring." , issue .get ("html_url" , "<missing URL>" )
0 commit comments