@@ -567,3 +567,70 @@ export class TagError extends Error {
567567 return this ;
568568 }
569569}
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