@@ -567,3 +567,70 @@ export class TagError extends Error {
567
567
return this ;
568
568
}
569
569
}
570
+
571
+ export const enum MergeErrorReason {
572
+ Conflict ,
573
+ UnmergedFiles ,
574
+ UnstagedChanges ,
575
+ Other ,
576
+ }
577
+
578
+ export class MergeError extends Error {
579
+ static is ( ex : unknown , reason ?: MergeErrorReason ) : ex is MergeError {
580
+ return ex instanceof MergeError && ( reason == null || ex . reason === reason ) ;
581
+ }
582
+
583
+ readonly original ?: Error ;
584
+ readonly reason : MergeErrorReason | undefined ;
585
+ ref ?: string ;
586
+
587
+ private static buildMergeErrorMessage ( reason ?: MergeErrorReason , ref ?: string ) : string {
588
+ let baseMessage : string ;
589
+ if ( ref != null ) {
590
+ baseMessage = `Unable to merge ${ ref } ` ;
591
+ } else {
592
+ baseMessage = `Unable to merge` ;
593
+ }
594
+
595
+ switch ( reason ) {
596
+ case MergeErrorReason . Conflict :
597
+ return `${ baseMessage } due to conflicts` ;
598
+ case MergeErrorReason . UnmergedFiles :
599
+ return `${ baseMessage } because you have unmerged files` ;
600
+ case MergeErrorReason . UnstagedChanges :
601
+ return `${ baseMessage } because you have unstaged changes` ;
602
+ default :
603
+ return baseMessage ;
604
+ }
605
+
606
+ return baseMessage ;
607
+ }
608
+
609
+ constructor ( reason ?: MergeErrorReason , original ?: Error , ref ?: string ) ;
610
+ constructor ( message ?: string , original ?: Error ) ;
611
+ constructor ( messageOrReason : string | MergeErrorReason | undefined , original ?: Error , ref ?: string ) {
612
+ let reason : MergeErrorReason | undefined ;
613
+ if ( typeof messageOrReason !== 'string' ) {
614
+ reason = messageOrReason as MergeErrorReason ;
615
+ } else {
616
+ super ( messageOrReason ) ;
617
+ }
618
+
619
+ const message =
620
+ typeof messageOrReason === 'string'
621
+ ? messageOrReason
622
+ : MergeError . buildMergeErrorMessage ( messageOrReason as MergeErrorReason , ref ) ;
623
+ super ( message ) ;
624
+
625
+ this . original = original ;
626
+ this . reason = reason ;
627
+ this . ref = ref ;
628
+ Error . captureStackTrace ?.( this , MergeError ) ;
629
+ }
630
+
631
+ WithRef ( ref : string ) {
632
+ this . ref = ref ;
633
+ this . message = MergeError . buildMergeErrorMessage ( this . reason , ref ) ;
634
+ return this ;
635
+ }
636
+ }
0 commit comments