Skip to content

Commit 095c55c

Browse files
committed
refactor: code structure for improved readability and maintainability
1 parent 36eef8a commit 095c55c

File tree

3 files changed

+84
-1756
lines changed

3 files changed

+84
-1756
lines changed

README.md

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -457,12 +457,14 @@ steps:
457457

458458
The tool uses semantic exit codes to integrate with CI/CD systems:
459459

460-
- **0**: Success - No breaking changes detected
461-
- **1**: Warning - Non-breaking changes detected (additions only)
462-
- **2**: Error - Breaking changes detected
463-
- **3**: Critical - Assembly loading or parsing errors
464-
- **4**: Configuration - Invalid configuration or command-line arguments
465-
- **99**: Unexpected - Unhandled exceptions or system errors
460+
- **0**: Success - Comparison completed successfully with no breaking changes detected
461+
- **1**: Breaking Changes - Comparison completed successfully but breaking changes were detected
462+
- **2**: Comparison Error - An error occurred during the comparison process
463+
- **3**: Assembly Load Error - Failed to load one or more assemblies for comparison
464+
- **4**: Configuration Error - Configuration error or invalid settings detected
465+
- **5**: Invalid Arguments - Invalid command line arguments provided
466+
- **6**: File Not Found - One or more required files could not be found
467+
- **99**: Unexpected Error - An unexpected error occurred during execution
466468

467469
### Using Exit Codes in Scripts
468470

@@ -475,13 +477,14 @@ EXIT_CODE=$?
475477
476478
case $EXIT_CODE in
477479
0)
478-
echo "✅ No breaking changes detected"
480+
echo "✅ Comparison completed successfully with no breaking changes"
479481
;;
480482
1)
481-
echo "⚠️ Non-breaking changes detected"
483+
echo "⚠️ Breaking changes detected - review before release"
484+
exit 1
482485
;;
483486
2)
484-
echo "❌ Breaking changes detected - blocking release"
487+
echo "❌ Comparison error occurred"
485488
exit 1
486489
;;
487490
3)
@@ -492,8 +495,20 @@ case $EXIT_CODE in
492495
echo "⚙️ Configuration error"
493496
exit 1
494497
;;
498+
5)
499+
echo "📝 Invalid command line arguments"
500+
exit 1
501+
;;
502+
6)
503+
echo "📁 Required files not found"
504+
exit 1
505+
;;
506+
99)
507+
echo "🔥 Unexpected error occurred"
508+
exit 1
509+
;;
495510
*)
496-
echo "🔥 Unexpected error"
511+
echo "❓ Unknown exit code: $EXIT_CODE"
497512
exit 1
498513
;;
499514
esac
@@ -514,12 +529,13 @@ dotnetapidiff compare \
514529
--output json > api-changes.json
515530
516531
# Parse results for automated decision making
517-
if [ $? -eq 2 ]; then
532+
if [ $? -eq 1 ]; then
518533
echo "Breaking changes detected - increment major version"
519-
elif [ $? -eq 1 ]; then
520-
echo "Non-breaking changes detected - increment minor version"
534+
elif [ $? -eq 0 ]; then
535+
echo "No breaking changes detected - increment minor or patch version"
521536
else
522-
echo "No API changes - increment patch version"
537+
echo "Error occurred during comparison - check logs"
538+
exit 1
523539
fi
524540
```
525541

@@ -678,10 +694,14 @@ Task("CheckApiCompatibility")
678694
Arguments = "compare baseline.dll current.dll --config config.json"
679695
});
680696
681-
if (exitCode == 2)
697+
if (exitCode == 1)
682698
{
683699
throw new Exception("Breaking changes detected!");
684700
}
701+
else if (exitCode != 0)
702+
{
703+
throw new Exception($"API comparison failed with exit code {exitCode}");
704+
}
685705
});
686706
```
687707

src/DotNetApiDiff/Commands/CompareCommand.cs

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -540,34 +540,78 @@ private Models.ApiComparison CreateApiComparisonFromResult(Models.ComparisonResu
540540
.Select(d => new Models.ApiChange
541541
{
542542
Type = Models.ChangeType.Added,
543-
TargetMember = new Models.ApiMember { Name = d.ElementName },
543+
Description = d.Description,
544+
TargetMember = new Models.ApiMember
545+
{
546+
Name = ExtractMemberName(d.ElementName),
547+
FullName = d.ElementName,
548+
Signature = d.NewSignature ?? "Unknown"
549+
},
544550
IsBreakingChange = d.IsBreakingChange
545551
}).ToList(),
546552
Removals = comparisonResult.Differences
547553
.Where(d => d.ChangeType == Models.ChangeType.Removed)
548554
.Select(d => new Models.ApiChange
549555
{
550556
Type = Models.ChangeType.Removed,
551-
SourceMember = new Models.ApiMember { Name = d.ElementName },
557+
Description = d.Description,
558+
SourceMember = new Models.ApiMember
559+
{
560+
Name = ExtractMemberName(d.ElementName),
561+
FullName = d.ElementName,
562+
Signature = d.OldSignature ?? "Unknown"
563+
},
552564
IsBreakingChange = d.IsBreakingChange
553565
}).ToList(),
554566
Modifications = comparisonResult.Differences
555567
.Where(d => d.ChangeType == Models.ChangeType.Modified)
556568
.Select(d => new Models.ApiChange
557569
{
558570
Type = Models.ChangeType.Modified,
559-
SourceMember = new Models.ApiMember { Name = d.ElementName },
560-
TargetMember = new Models.ApiMember { Name = d.ElementName },
571+
Description = d.Description,
572+
SourceMember = new Models.ApiMember
573+
{
574+
Name = ExtractMemberName(d.ElementName),
575+
FullName = d.ElementName,
576+
Signature = d.OldSignature ?? "Unknown"
577+
},
578+
TargetMember = new Models.ApiMember
579+
{
580+
Name = ExtractMemberName(d.ElementName),
581+
FullName = d.ElementName,
582+
Signature = d.NewSignature ?? "Unknown"
583+
},
561584
IsBreakingChange = d.IsBreakingChange
562585
}).ToList(),
563586
Excluded = comparisonResult.Differences
564587
.Where(d => d.ChangeType == Models.ChangeType.Excluded)
565588
.Select(d => new Models.ApiChange
566589
{
567590
Type = Models.ChangeType.Excluded,
568-
SourceMember = new Models.ApiMember { Name = d.ElementName },
591+
Description = d.Description,
592+
SourceMember = new Models.ApiMember
593+
{
594+
Name = ExtractMemberName(d.ElementName),
595+
FullName = d.ElementName,
596+
Signature = "Unknown"
597+
},
569598
IsBreakingChange = false
570599
}).ToList()
571600
};
572601
}
602+
603+
/// <summary>
604+
/// Extracts the member name from a full element name
605+
/// </summary>
606+
/// <param name="elementName">The full element name</param>
607+
/// <returns>The member name</returns>
608+
private static string ExtractMemberName(string elementName)
609+
{
610+
if (string.IsNullOrEmpty(elementName))
611+
return "Unknown";
612+
613+
// For full names like "Namespace.Class.Method", extract just "Method"
614+
var lastDotIndex = elementName.LastIndexOf('.');
615+
return lastDotIndex >= 0 ? elementName.Substring(lastDotIndex + 1) : elementName;
616+
}
573617
}

0 commit comments

Comments
 (0)