Skip to content

Commit 67d4c8b

Browse files
committed
Update event ID generation for Git actions
Commits containing copy file actions generated duplicate event IDs because the new file name wasn’t included in the ID calculation. This update improves event ID generation by considering the new file name when present. Signed-off-by: Jose Javier Merchante <jjmerchante@bitergia.com>
1 parent 930d3a9 commit 67d4c8b

3 files changed

Lines changed: 115 additions & 2 deletions

File tree

chronicler/events/core/git.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,11 @@ def _process_action(self, source, time, event_uuid, action, file_data):
116116
else:
117117
raise ValueError(f"No valid action: {action}")
118118

119-
event_id = uuid(event_uuid, file_data['file'], action)
119+
id_args = [event_uuid, file_data['file'], action]
120+
if 'newfile' in file_data:
121+
id_args.append(file_data['newfile'])
122+
123+
event_id = uuid(*id_args)
120124

121125
data = {
122126
"filename": file_data['file'],
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
title: Event ID generation for Git actions updated
3+
category: fixed
4+
author: Jose Javier Merchante <jjmerchante@bitergia.com>
5+
issue: null
6+
notes: >
7+
Commits containing multiple copy file actions for the same file
8+
generated duplicate event IDs because the new file name wasn’t
9+
included in the ID calculation.

tests/test_git.py

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
GIT_EVENT_MERGE_COMMIT,
2525
GIT_EVENT_ACTION_ADDED,
2626
GIT_EVENT_ACTION_MODIFIED,
27-
GIT_EVENT_ACTION_REPLACED)
27+
GIT_EVENT_ACTION_REPLACED,
28+
GIT_EVENT_ACTION_COPIED)
2829

2930

3031
class GitEventizerTestCase(unittest.TestCase):
@@ -253,6 +254,105 @@ def test_eventize_item_no_uuid(self):
253254
_ = eventizer.eventize_item(raw_item)
254255
self.assertEqual(str(context.exception), "'uuid' attribute not found on item.")
255256

257+
def test_eventize_commit_copy_files(self):
258+
"""Check if events with multiple copied files are generated correctly with different ids"""
259+
260+
eventizer = GitEventizer()
261+
262+
raw_item = {
263+
"backend_name": "Git",
264+
"backend_version": "1.0.1",
265+
"category": "commit",
266+
"classified_fields_filtered": None,
267+
"data": {
268+
"Author": "Tom <tom@example.com>",
269+
"AuthorDate": "Mon Apr 29 16:25:56 2019 -0700",
270+
"Commit": "GitHub <noreply@github.com>",
271+
"CommitDate": "Mon Apr 29 16:25:56 2019 -0700",
272+
"commit": "7882c41g607ee5273da9637da0bb20ca7634cb83",
273+
"files": [
274+
{
275+
"action": "C100",
276+
"added": "0",
277+
"file": "packages/react-events/FocusScope.js",
278+
"indexes": [
279+
"2ff785ef79",
280+
"2ff785ef79"
281+
],
282+
"modes": [
283+
"100644",
284+
"100644"
285+
],
286+
"newfile": "packages/react-events/drag.js",
287+
"removed": "0"
288+
},
289+
{
290+
"action": "C100",
291+
"added": "0",
292+
"file": "packages/react-events/FocusScope.js",
293+
"indexes": [
294+
"2ff785ef79",
295+
"2ff785ef79"
296+
],
297+
"modes": [
298+
"100644",
299+
"100644"
300+
],
301+
"newfile": "packages/react-events/focus-scope.js",
302+
"removed": "0"
303+
}
304+
],
305+
"message": "Sample message for commit",
306+
"parents": [
307+
"43c4e5f348eb5704464886e2dc3221e347041b82"
308+
],
309+
"refs": []
310+
},
311+
"offset": "7882c41g607ee5273da9637da0bb20ca7634cb83",
312+
"origin": "https://example.git",
313+
"perceval_version": "1.2.2",
314+
"search_fields": {
315+
"item_id": "7882c41g607ee5273da9637da0bb20ca7634cb83"
316+
},
317+
"tag": "https://example.git",
318+
"timestamp": 1.748521396234826E9,
319+
"updated_on": 1.556580356E9,
320+
"uuid": "6b4393b86512afc2e6757a6781e6018a661a72b0"
321+
}
322+
323+
events = eventizer.eventize_item(raw_item)
324+
325+
self.assertEqual(len(events), 3)
326+
327+
commit_event = events[0]
328+
self.assertEqual(commit_event['id'], '6b4393b86512afc2e6757a6781e6018a661a72b0')
329+
self.assertEqual(commit_event['type'], GIT_EVENT_COMMIT)
330+
self.assertEqual(commit_event['source'], 'https://example.git')
331+
self.assertEqual(commit_event['time'], 1556580356.0)
332+
self.assertEqual(commit_event.data['message'], "Sample message for commit")
333+
334+
action_event = events[1]
335+
self.assertEqual(action_event['id'], 'b911ec8df7e804b40dddb5f402e82ae816283e9c')
336+
self.assertEqual(action_event['linked_event'], '6b4393b86512afc2e6757a6781e6018a661a72b0')
337+
self.assertEqual(action_event['type'], GIT_EVENT_ACTION_COPIED)
338+
self.assertEqual(action_event['source'], 'https://example.git')
339+
self.assertEqual(action_event['time'], 1556580356.0)
340+
self.assertEqual(action_event.data['filename'], 'packages/react-events/FocusScope.js')
341+
self.assertEqual(action_event.data['new_filename'], 'packages/react-events/drag.js')
342+
self.assertEqual(action_event.data['added_lines'], '0')
343+
self.assertEqual(action_event.data['deleted_lines'], '0')
344+
345+
action_event = events[2]
346+
self.assertEqual(action_event['id'], '5e1d30f0fd85e34cb08987bbb202201a31769b39')
347+
self.assertEqual(action_event['linked_event'], '6b4393b86512afc2e6757a6781e6018a661a72b0')
348+
self.assertEqual(action_event['type'], GIT_EVENT_ACTION_COPIED)
349+
self.assertEqual(action_event['source'], 'https://example.git')
350+
self.assertEqual(action_event['time'], 1556580356.0)
351+
self.assertEqual(action_event.data['filename'], 'packages/react-events/FocusScope.js')
352+
self.assertEqual(action_event.data['new_filename'], 'packages/react-events/focus-scope.js')
353+
self.assertEqual(action_event.data['added_lines'], '0')
354+
self.assertEqual(action_event.data['deleted_lines'], '0')
355+
256356

257357
if __name__ == '__main__':
258358
unittest.main()

0 commit comments

Comments
 (0)