@@ -69,6 +69,8 @@ type GitPullWorkflowResult = {
6969
7070type InitRepositoryOutcome = { WarningMessage: string option }
7171
72+ type GitErrorNotification = { Title: string ; Message: string }
73+
7274type GitState = {
7375 Status: GitSidebarStatus
7476 ChangedFiles: GitSidebarChange []
@@ -257,6 +259,7 @@ type GitDependencies = {
257259 GitConfirmMergeResolutionRequest -> JS.Promise< Result< GitConfirmMergeResolutionResult, string>>
258260 confirmLfsPrune: string -> bool
259261 confirmInstall: string -> bool
262+ reportError: GitErrorNotification -> unit
260263}
261264
262265let staleMergeConflictTokens = [|
@@ -509,6 +512,29 @@ let private applyPageChangeCmd (setPageState: PageState option -> unit) =
509512 fun _dispatch -> setPageState None
510513 ]
511514
515+ let private reportErrorCmd ( deps : GitDependencies ) ( title : string ) ( message : string ) : Cmd < Msg > = [
516+ fun _dispatch -> deps.reportError { Title = title; Message = message }
517+ ]
518+
519+ let private titleForWriteRequest =
520+ function
521+ | Fetch -> " Could not fetch changes"
522+ | Pull -> " Could not pull changes"
523+ | Push -> " Could not push changes"
524+ | PrimarySave _ -> " Could not save changes"
525+ | Clone _ -> " Could not clone repository"
526+ | CommitSelection _
527+ | CommitAll _ -> " Could not commit changes"
528+ | DiscardSelection _ -> " Could not discard changes"
529+ | SaveLfsSettings _ -> " Could not save Git LFS settings"
530+ | PruneLfsCache -> " Could not clean Git LFS cache"
531+ | DedupLfsStorage -> " Could not reduce Git LFS storage"
532+ | CreateBranch _ -> " Could not create branch"
533+ | SwitchBranch _ -> " Could not switch branch"
534+
535+ let private reportWriteErrorCmd deps request message =
536+ reportErrorCmd deps ( titleForWriteRequest request) message
537+
512538let private withBusyOperation busyOperation model = {
513539 model with
514540 BusyOperation = busyOperation
@@ -1048,7 +1074,11 @@ let update
10481074 PendingRefreshWarningNotice = None
10491075 }
10501076
1051- nextModel, applyPageChangeCmd setPageState GitPageChange.Clear
1077+ nextModel,
1078+ Cmd.batch [
1079+ applyPageChangeCmd setPageState GitPageChange.Clear
1080+ reportErrorCmd deps " Could not refresh Git state" message
1081+ ]
10521082 | RefreshCompleted(_, Ok refreshResult) when
10531083 refreshErrorMessage refreshResult |> Option.exists isMissingRepositoryMessage
10541084 ->
@@ -1060,17 +1090,16 @@ let update
10601090 |> withBusyOperation None
10611091 |> fun state -> { state with CurrentProgress = None }
10621092
1063- let hasError =
1064- match refreshResult.Status, refreshErrorMessage refreshResult with
1065- | Error _, _
1066- | Ok _, Some _ -> true
1067- | Ok _, None -> false
1093+ let refreshError = refreshErrorMessage refreshResult
10681094
10691095 let cmd =
1070- if hasError then
1071- applyPageChangeCmd setPageState GitPageChange.Clear
1072- else
1073- Cmd.none
1096+ match refreshError with
1097+ | Some message ->
1098+ Cmd.batch [
1099+ applyPageChangeCmd setPageState GitPageChange.Clear
1100+ reportErrorCmd deps " Could not refresh Git state" message
1101+ ]
1102+ | None -> Cmd.none
10741103
10751104 nextModel, cmd
10761105 | InitRepositoryRequested when model.CurrentArcPath.IsNone -> model, Cmd.none
@@ -1104,7 +1133,7 @@ let update
11041133 PendingRefreshWarningNotice = None
11051134 }
11061135
1107- nextModel, Cmd.none
1136+ nextModel, reportErrorCmd deps " Could not initialize Git repository " message
11081137 | InitRepositoryCompleted(_, Ok outcome) ->
11091138 let nextModel = {
11101139 model with
@@ -1159,7 +1188,11 @@ let update
11591188 ErrorNotice = Some message
11601189 }
11611190
1162- nextModel, resolveReplyCmd reply ( Error message)
1191+ nextModel,
1192+ Cmd.batch [
1193+ resolveReplyCmd reply ( Error message)
1194+ reportErrorCmd deps " Could not open Git change" message
1195+ ]
11631196 | ConfirmMergeResolutionRequested _ when model.CurrentArcPath.IsNone -> model, Cmd.none
11641197 | ConfirmMergeResolutionRequested request ->
11651198 match model.BusyOperation with
@@ -1206,9 +1239,10 @@ let update
12061239 Cmd.batch [
12071240 applyPageChangeCmd setPageState GitPageChange.Clear
12081241 Cmd.ofMsg RefreshRequested
1242+ reportErrorCmd deps " Could not confirm merge resolution" message
12091243 ]
12101244 else
1211- nextModel, Cmd.none
1245+ nextModel, reportErrorCmd deps " Could not confirm merge resolution " message
12121246 | ConfirmMergeResolutionCompleted(_, Ok outcome) ->
12131247 let nextModel =
12141248 model
@@ -1336,7 +1370,7 @@ let update
13361370 BusyNotice = None
13371371 ErrorNotice = Some message
13381372 },
1339- Cmd.none
1373+ reportErrorCmd deps " Could not preview update from online " message
13401374 | CloneRequested( request, reply) -> model, Cmd.ofMsg ( WriteRequested( Clone( request, reply)))
13411375 | PrimarySaveSelectionRequested request ->
13421376 model, Cmd.ofMsg ( WriteRequested( PrimarySave( prepareCommitSelection model request)))
@@ -1394,7 +1428,7 @@ let update
13941428 model with
13951429 ErrorNotice = Some " ARC folder name must not be empty."
13961430 },
1397- Cmd.none
1431+ reportErrorCmd deps " Could not rename ARC " " ARC folder name must not be empty. "
13981432 else
13991433 let nextModel =
14001434 model
@@ -1434,7 +1468,7 @@ let update
14341468 CurrentProgress = None
14351469 ErrorNotice = Some message
14361470 },
1437- Cmd.none
1471+ reportErrorCmd deps " Could not rename ARC " message
14381472 | PublishRenameCompleted(_, Ok _) ->
14391473 {
14401474 model with
@@ -1526,7 +1560,12 @@ let update
15261560 model, resolveStaleWriteCompletedCmd request result
15271561 | WriteCompleted(_, request, Error message) ->
15281562 let nextModel = writeErrorModel message model
1529- nextModel, resolveCloneReplyCmd request ( Error message)
1563+
1564+ nextModel,
1565+ Cmd.batch [
1566+ resolveCloneReplyCmd request ( Error message)
1567+ reportWriteErrorCmd deps request message
1568+ ]
15301569 | WriteCompleted(_, _, Ok( RequiresRemoteProjectRename message)) ->
15311570 let nextModel = {
15321571 model with
@@ -1565,7 +1604,11 @@ let update
15651604 InstallRetryState = GitInstallRetryState.Idle
15661605 }
15671606
1568- nextModel, resolveCloneReplyCmd request ( Error message)
1607+ nextModel,
1608+ Cmd.batch [
1609+ resolveCloneReplyCmd request ( Error message)
1610+ reportErrorCmd deps " Git LFS installation required" message
1611+ ]
15691612 | WriteInstallPromptAnswered( sessionId, request, true ) ->
15701613 let busyOperation = busyOperationForWriteRequest request
15711614
@@ -1595,7 +1638,11 @@ let update
15951638 InstallRetryState = GitInstallRetryState.Idle
15961639 }
15971640
1598- nextModel, resolveCloneReplyCmd request ( Error message)
1641+ nextModel,
1642+ Cmd.batch [
1643+ resolveCloneReplyCmd request ( Error message)
1644+ reportErrorCmd deps " Could not install Git LFS" message
1645+ ]
15991646 | WriteInstallCompleted(_, request, Ok operationResult) when not operationResult.Success ->
16001647 let message =
16011648 operationResult.Message |> Option.defaultValue " Git LFS installation failed."
@@ -1608,7 +1655,11 @@ let update
16081655 InstallRetryState = GitInstallRetryState.Idle
16091656 }
16101657
1611- nextModel, resolveCloneReplyCmd request ( Error message)
1658+ nextModel,
1659+ Cmd.batch [
1660+ resolveCloneReplyCmd request ( Error message)
1661+ reportErrorCmd deps " Could not install Git LFS" message
1662+ ]
16121663 | WriteInstallCompleted( sessionId, request, Ok _) ->
16131664 let busyOperation = busyOperationForWriteRequest request
16141665
@@ -1658,15 +1709,29 @@ let update
16581709 PendingPostMergePush = false
16591710 }
16601711
1661- nextModel, applyPageChangeCmd setPageState pageChange
1712+ nextModel,
1713+ Cmd.batch [
1714+ applyPageChangeCmd setPageState pageChange
1715+ reportErrorCmd deps " Could not push saved changes" message
1716+ ]
16621717 | WriteCompleted(_, request, Ok( CompletedWithPendingRemoteConfirmation(_, _, _))) ->
16631718 let message = " Git operation produced an invalid pending remote confirmation."
16641719 let nextModel = writeErrorModel message model
1665- nextModel, resolveCloneReplyCmd request ( Error message)
1720+
1721+ nextModel,
1722+ Cmd.batch [
1723+ resolveCloneReplyCmd request ( Error message)
1724+ reportWriteErrorCmd deps request message
1725+ ]
16661726 | WriteCompleted(_, request, Ok( CompletedWithPendingRemoteFailure(_, _))) ->
16671727 let message = " Git operation produced an invalid pending remote failure."
16681728 let nextModel = writeErrorModel message model
1669- nextModel, resolveCloneReplyCmd request ( Error message)
1729+
1730+ nextModel,
1731+ Cmd.batch [
1732+ resolveCloneReplyCmd request ( Error message)
1733+ reportWriteErrorCmd deps request message
1734+ ]
16701735 | WriteCompleted(_, request, Ok( Completed success)) ->
16711736 let baseModel , pageChange , warningMessage = applyWriteSuccessModel model success
16721737
0 commit comments