From 3f2ecd46ca8cf0b3e255ae768414c4a3bc972216 Mon Sep 17 00:00:00 2001 From: Wu Fengguang Date: Mon, 26 May 2025 17:26:36 +0800 Subject: [PATCH 1/2] user_activity: skip NoneType error File "/c/openeuler/openEuler-Advisor/advisors/./user_activity.py", line 212, in main eve_list = advisor.get_pub_events(member_id, args.number, args.member, args.strict) File "/c/openeuler/openEuler-Advisor/advisors/./user_activity.py", line 86, in get_pub_events repo_name = event['repo'].get('full_name', "") ^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'get' Signed-off-by: Wu Fengguang --- advisors/user_activity.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/advisors/user_activity.py b/advisors/user_activity.py index 09ee57d7..78d0c819 100755 --- a/advisors/user_activity.py +++ b/advisors/user_activity.py @@ -79,6 +79,8 @@ class Advisor: last_id = event['id'] if not event['type']: continue + if not event['repo']: + continue if ignore_memberevent and event['type'] == 'MemberEvent': continue if event['type'] == 'FollowEvent': -- Gitee From 0517c54ed02066e406b56918d331e9832f551c6f Mon Sep 17 00:00:00 2001 From: Wu Fengguang Date: Mon, 26 May 2025 17:42:45 +0800 Subject: [PATCH 2/2] user_activity: skip HTTP error There are many SIG members, prefer continue getting more info rather than stop early at some random error. wfg /c/openeuler/openEuler-Advisor/advisors% ./user_activity.py -s sig-RISC-V File "/c/openeuler/openEuler-Advisor/advisors/./user_activity.py", line 214, in main eve_list = advisor.get_pub_events(member_id, args.number, args.member, args.strict) File "/c/openeuler/openEuler-Advisor/advisors/./user_activity.py", line 102, in get_pub_events events = self.get_json(new_url) File "/c/openeuler/openEuler-Advisor/advisors/./user_activity.py", line 42, in get_json result = urllib.request.urlopen(req) File "/usr/lib/python3.13/urllib/request.py", line 189, in urlopen return opener.open(url, data, timeout) ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.13/urllib/request.py", line 495, in open response = meth(req, response) File "/usr/lib/python3.13/urllib/request.py", line 604, in http_response response = self.parent.error( 'http', request, response, code, msg, hdrs) File "/usr/lib/python3.13/urllib/request.py", line 533, in error return self._call_chain(*args) ~~~~~~~~~~~~~~~~^^^^^^^ File "/usr/lib/python3.13/urllib/request.py", line 466, in _call_chain result = func(*args) File "/usr/lib/python3.13/urllib/request.py", line 613, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 500: Internal Server Error Use Exception to cover various kind of errors: urllib.error.URLError: Signed-off-by: Wu Fengguang --- advisors/user_activity.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/advisors/user_activity.py b/advisors/user_activity.py index 78d0c819..69c3aea9 100755 --- a/advisors/user_activity.py +++ b/advisors/user_activity.py @@ -32,20 +32,25 @@ class Advisor: def get_json(self, url): """ - Return object parsed from remote json + Return object parsed from remote json, or None on HTTP error """ headers = self.header.copy() headers["Content-Type"] = "application/json;charset=UTF-8" req = urllib.request.Request(url=url, headers=headers, method="GET") + result = None for i in range(3): try: result = urllib.request.urlopen(req) break - except ConnectionResetError as err: + except Exception: continue - #with urllib.request.urlopen(req) as result: - resp = json.loads(result.read().decode("utf-8")) - return resp + if result is None: + return None + try: + resp = json.loads(result.read().decode("utf-8")) + return resp + except Exception: + return None def get_file(self, repo, path): """ @@ -100,6 +105,8 @@ class Advisor: #print(new_url) #print(len(event_list)) events = self.get_json(new_url) + if events is None: + break return event_list -- Gitee