@@ -218,8 +218,21 @@ def __init__(self, path: str):
218
218
log .debug (f"Failed to get changed files via git diff (Bitbucket): { error } " )
219
219
# Fallback to git show for single commit
220
220
if not detected :
221
- self .show_files = self .repo .git .show (self .commit , name_only = True , format = "%n" ).splitlines ()
222
- log .debug (f"Changed files detected via git show: { self .show_files } " )
221
+ # Check if this is a merge commit first
222
+ if self ._is_merge_commit ():
223
+ # For merge commits, use git diff with parent
224
+ if self ._detect_merge_commit_changes ():
225
+ detected = True
226
+ else :
227
+ # Fallback to git show if merge detection fails
228
+ self .show_files = self .repo .git .show (self .commit , name_only = True , format = "%n" ).splitlines ()
229
+ log .debug (f"Changed files detected via git show (merge commit fallback): { self .show_files } " )
230
+ detected = True
231
+ else :
232
+ # Regular single commit
233
+ self .show_files = self .repo .git .show (self .commit , name_only = True , format = "%n" ).splitlines ()
234
+ log .debug (f"Changed files detected via git show: { self .show_files } " )
235
+ detected = True
223
236
self .changed_files = []
224
237
for item in self .show_files :
225
238
if item != "" :
@@ -380,6 +393,69 @@ def get_formatted_committer(self) -> str:
380
393
log .debug ("Using fallback committer: unknown" )
381
394
return "unknown"
382
395
396
+ def _is_merge_commit (self ) -> bool :
397
+ """
398
+ Check if the current commit is a merge commit.
399
+
400
+ Returns:
401
+ True if this is a merge commit (has multiple parents), False otherwise
402
+ """
403
+ try :
404
+ # A merge commit has multiple parents
405
+ is_merge = len (self .commit .parents ) > 1
406
+ log .debug (f"Commit { self .commit .hexsha [:8 ]} has { len (self .commit .parents )} parents, is_merge: { is_merge } " )
407
+ return is_merge
408
+ except Exception as error :
409
+ log .debug (f"Error checking if commit is merge commit: { error } " )
410
+ return False
411
+
412
+ def _detect_merge_commit_changes (self ) -> bool :
413
+ """
414
+ Detect changed files in a merge commit using git diff with parent.
415
+
416
+ This method handles the case where git show --name-only doesn't work
417
+ for merge commits (expected Git behavior).
418
+
419
+ Returns:
420
+ True if detection was successful, False otherwise
421
+ """
422
+ try :
423
+ if not self ._is_merge_commit ():
424
+ log .debug ("Not a merge commit, skipping merge commit detection" )
425
+ return False
426
+
427
+ # For merge commits, we need to diff against a parent
428
+ # We'll use the first parent (typically the target branch)
429
+ if not self .commit .parents :
430
+ log .debug ("Merge commit has no parents - cannot perform merge-aware diff" )
431
+ return False
432
+
433
+ parent_commit = self .commit .parents [0 ]
434
+
435
+ # Verify parent commit is accessible
436
+ try :
437
+ parent_sha = parent_commit .hexsha
438
+ # Quick validation that parent exists
439
+ self .repo .commit (parent_sha )
440
+ except Exception as parent_error :
441
+ log .error (f"Cannot resolve parent commit { parent_sha } : { parent_error } " )
442
+ return False
443
+
444
+ # Use git diff to show changes from parent to merge commit
445
+ diff_range = f'{ parent_sha } ..{ self .commit .hexsha } '
446
+ log .debug (f"Attempting merge commit diff: git diff --name-only { diff_range } " )
447
+
448
+ diff_files = self .repo .git .diff ('--name-only' , diff_range )
449
+ self .show_files = diff_files .splitlines ()
450
+
451
+ log .debug (f"Changed files detected via git diff (merge commit): { self .show_files } " )
452
+ log .info (f"Changed file detection: method=merge-diff, source=merge-commit-fallback, files={ len (self .show_files )} " )
453
+ return True
454
+
455
+ except Exception as error :
456
+ log .debug (f"Failed to detect merge commit changes: { error } " )
457
+ return False
458
+
383
459
def get_default_branch_name (self ) -> str :
384
460
"""
385
461
Get the default branch name from the remote origin.
0 commit comments