@@ -56,6 +56,21 @@ def comment_pr(repo, run_id):
56
56
if os .path .isdir ("pr" ):
57
57
shutil .rmtree ("pr" )
58
58
59
+ utils .download_artifact (repo , "comment" , "comment" , run_id )
60
+
61
+ try :
62
+ with open ("comment/ID" ) as file :
63
+ raw_comment_id = int (file .read ())
64
+ except Exception as e :
65
+ # If there is no existing comment, comment/ID will contain just a
66
+ # newline (due to jq & gh behaviour). This will cause `int(file.read())`
67
+ # to fail, so we catch that and set `raw_comment_id` to `None`.
68
+ print ("Could not retrieve an existing comment ID. \n " , e )
69
+ raw_comment_id = None
70
+ finally :
71
+ if os .path .isdir ("comment" ):
72
+ shutil .rmtree ("comment" )
73
+
59
74
# Try storing diff for previous run:
60
75
prev_run_id = 0
61
76
prev_diff_exists = False
@@ -95,14 +110,37 @@ def comment_pr(repo, run_id):
95
110
96
111
comment = comment_first_line + \
97
112
"A recent commit removed the previously reported differences."
98
- post_comment (comment , repo , pr_number )
113
+
114
+ if raw_comment_id is None :
115
+ post_initial_comment (comment , repo , pr_number )
116
+ else :
117
+ update_existing_comment (comment , repo , pr_number , raw_comment_id )
99
118
100
119
101
- def post_comment (comment , repo , pr_number ):
120
+ def post_initial_comment (comment , repo , pr_number ):
102
121
print (f"Posting comment to PR #{ pr_number } " )
103
122
utils .subprocess_run (["gh" , "pr" , "comment" , str (pr_number ),
104
123
"--repo" , repo , "--body" , comment ])
105
124
125
+ def update_existing_comment (comment , repo , pr_number , raw_comment_id ):
126
+ # Fetch existing comment, and validate:
127
+ # - comment belongs to the PR with number `pr_number`
128
+ # - comment starts with the expected prefix `comment_first_line`
129
+ # - comment author is github-actions[bot]
130
+ comment_author = "github-actions[bot]"
131
+ filter = f"select(.issue_url | endswith(\" { repo } /issues/{ pr_number } \" )) " + \
132
+ f"| select(.body | startswith(\" { comment_first_line } \" )) " + \
133
+ f"| select(.user.login == \" { comment_author } \" ) " + \
134
+ "| .id"
135
+ comment_id = utils .subprocess_check_output (["gh" , "api" , f"repos/{ repo } /issues/comments/{ raw_comment_id } " ,
136
+ "--jq" , filter ]).strip ()
137
+
138
+ if comment_id :
139
+ print (f"Updating comment { comment_id } on PR #{ pr_number } " )
140
+ utils .subprocess_run (["gh" , "api" , f"repos/{ repo } /issues/comments/{ comment_id } " ,
141
+ "-X" , "PATCH" , "-f" , f"body={ comment } " ])
142
+ else :
143
+ print (f"Comment { raw_comment_id } did not pass validations: not editing." )
106
144
107
145
def get_previous_run_id (repo , run_id , pr_number ):
108
146
"""
0 commit comments