diff --git a/parser-typechecker/src/Unison/Codebase/Editor/HandleInput.hs b/parser-typechecker/src/Unison/Codebase/Editor/HandleInput.hs index 8c182e578..a67e718e6 100644 --- a/parser-typechecker/src/Unison/Codebase/Editor/HandleInput.hs +++ b/parser-typechecker/src/Unison/Codebase/Editor/HandleInput.hs @@ -402,7 +402,7 @@ loop = do stepManyAt (makeDeleteTermNames ++ makeDeleteTypeNames) root'' <- use root diffHelper (Branch.head root') (Branch.head root'') >>= - respondNumbered . uncurry ShowDiffAfterDelete + respondNumbered . uncurry ShowDiffAfterDeleteDefinitions else do failed <- loadSearchResults $ SR.fromNames failed @@ -481,7 +481,7 @@ loop = do b <- updateAtM dest $ const (pure merged) if b then do diffHelper (Branch.head destb) (Branch.head merged) >>= - respondNumbered . uncurry (ShowDiffAfterMerge dest) + respondNumbered . uncurry (ShowDiffAfterMerge dest0 dest) patch <- getPatchAt defaultPatchPath void $ propagatePatch inputDescription patch dest else respond (NothingTodo input) @@ -496,7 +496,7 @@ loop = do if merged == destb then respond (NothingTodo input) else diffHelper (Branch.head destb) (Branch.head merged) >>= - respondNumbered . uncurry (ShowDiffAfterMergePreview dest) + respondNumbered . uncurry (ShowDiffAfterMergePreview dest0 dest) DiffNamespaceI before0 after0 -> do let [beforep, afterp] = @@ -578,7 +578,10 @@ loop = do (Path.toName' (Path.unsplit' p)) (Branch.toNames0 b) diff = Names3.diff0 deletedNames mempty - respond $ ShowDiff input diff + diffHelper b Branch.empty0 >>= + respondNumbered + . uncurry (ShowDiffAfterDeleteBranch + $ resolveToAbsolute (Path.unsplit' p)) else do failed <- loadSearchResults $ SR.fromNames failed failedDependents <- loadSearchResults $ SR.fromNames failedDependents @@ -1322,7 +1325,7 @@ loop = do let destAbs = Path.toAbsolutePath currentPath' path resolveConfiguredGitUrl Pull path mayRepo >>= \case Left e -> eval . Notify $ e - Right ns -> loadRemoteBranchAt input inputDescription ns destAbs + Right ns -> pullRemoteBranchAt path input inputDescription ns destAbs PushRemoteBranchI mayRepo path -> do let srcAbs = Path.toAbsolutePath currentPath' path @@ -1730,15 +1733,16 @@ respondNumbered output = do -- Merges the specified remote branch into the specified local absolute path. -- Implementation detail of PullRemoteBranchI -loadRemoteBranchAt +pullRemoteBranchAt :: Var v => Monad m - => Input + => Path.Path' + -> Input -> Text -> (RemoteRepo, Maybe ShortBranchHash, Path) -> Path.Absolute -> Action' m v () -loadRemoteBranchAt input inputDescription (repo, sbh, remotePath) p = do +pullRemoteBranchAt p' input inputDescription (repo, sbh, remotePath) p = do b <- eval $ maybe (LoadRemoteRootBranch FailIfMissing repo) (LoadRemoteShortBranch repo) sbh case b of @@ -1755,7 +1759,7 @@ loadRemoteBranchAt input inputDescription (repo, sbh, remotePath) p = do doMerge b b0 = do merged <- eval . Eval $ Branch.merge b b0 diffHelper (Branch.head b0) (Branch.head merged) >>= - respondNumbered . uncurry ShowDiffAfterPull + respondNumbered . uncurry (ShowDiffAfterPull p' p) pure merged syncRemoteRootBranch diff --git a/parser-typechecker/src/Unison/Codebase/Editor/Output.hs b/parser-typechecker/src/Unison/Codebase/Editor/Output.hs index 6383ac1b5..52303edd4 100644 --- a/parser-typechecker/src/Unison/Codebase/Editor/Output.hs +++ b/parser-typechecker/src/Unison/Codebase/Editor/Output.hs @@ -71,12 +71,13 @@ pushPull push pull p = case p of data NumberedOutput v = ShowDiffNamespace Path.Absolute Path.Absolute PPE.PrettyPrintEnv (BranchDiffOutput v Ann) - | ShowDiffAfterDelete PPE.PrettyPrintEnv (BranchDiffOutput v Ann) -- path is Path.absoluteEmpty - | ShowDiffAfterMerge Path.Absolute PPE.PrettyPrintEnv (BranchDiffOutput v Ann) - | ShowDiffAfterMergePreview Path.Absolute PPE.PrettyPrintEnv (BranchDiffOutput v Ann) | ShowDiffAfterUndo PPE.PrettyPrintEnv (BranchDiffOutput v Ann) - | ShowDiffAfterPull PPE.PrettyPrintEnv (BranchDiffOutput v Ann) - + | ShowDiffAfterDeleteDefinitions PPE.PrettyPrintEnv (BranchDiffOutput v Ann) + | ShowDiffAfterDeleteBranch Path.Absolute PPE.PrettyPrintEnv (BranchDiffOutput v Ann) + | ShowDiffAfterMerge Path.Path' Path.Absolute PPE.PrettyPrintEnv (BranchDiffOutput v Ann) + | ShowDiffAfterMergePreview Path.Path' Path.Absolute PPE.PrettyPrintEnv (BranchDiffOutput v Ann) + | ShowDiffAfterPull Path.Path' Path.Absolute PPE.PrettyPrintEnv (BranchDiffOutput v Ann) + -- | ShowDiff data Output v @@ -311,4 +312,11 @@ isFailure o = case o of isNumberedFailure :: NumberedOutput v -> Bool isNumberedFailure = \case ShowDiffNamespace{} -> False + ShowDiffAfterDeleteDefinitions{} -> False + ShowDiffAfterDeleteBranch{} -> False + ShowDiffAfterMerge{} -> False + ShowDiffAfterMergePreview{} -> False + ShowDiffAfterUndo{} -> False + ShowDiffAfterPull{} -> False + diff --git a/parser-typechecker/src/Unison/CommandLine/OutputMessages.hs b/parser-typechecker/src/Unison/CommandLine/OutputMessages.hs index f676ffa63..bd6379d5e 100644 --- a/parser-typechecker/src/Unison/CommandLine/OutputMessages.hs +++ b/parser-typechecker/src/Unison/CommandLine/OutputMessages.hs @@ -128,8 +128,60 @@ renderFileName dir = P.group . P.blue . fromString <$> shortenDirectory dir notifyNumbered :: Var v => NumberedOutput v -> (Pretty, NumberedArgs) notifyNumbered o = case o of - ShowDiffNamespace oldPath rightPath ppe diffOutput -> - showDiffNamespace ppe oldPath rightPath diffOutput + ShowDiffNamespace oldPrefix newPrefix ppe diffOutput -> + showDiffNamespace ppe oldPrefix newPrefix diffOutput + + ShowDiffAfterDeleteDefinitions ppe diff -> + first (\p -> P.lines + [ p + , "" + , undoTip + ]) (showDiffNamespace ppe e e diff) + + ShowDiffAfterDeleteBranch bAbs ppe diff -> + first (\p -> P.lines + [ p + , "" + , undoTip + ]) (showDiffNamespace ppe bAbs bAbs diff) + + ShowDiffAfterMerge dest' destAbs ppe diffOutput -> + first (\p -> P.lines [ + P.wrap $ "Here's the changed in " <> prettyPath' dest' <> "after the merge:" + , "" + , p + , "" + , tip $ "You can use " <> IP.makeExample' IP.todo + <> "to see if this generated any work to do in this branch" + <> "and " <> IP.makeExample' IP.test <> "to run the tests." + <> "You can always" <> IP.makeExample' IP.undo <> "to undo the results of this merge." + ]) (showDiffNamespace ppe destAbs destAbs diffOutput) + + ShowDiffAfterMergePreview dest' destAbs ppe diffOutput -> + first (\p -> P.lines [ + P.wrap $ "Here's what would change in " <> prettyPath' dest' <> "after the merge:" + , "" + , p + ]) (showDiffNamespace ppe destAbs destAbs diffOutput) + + ShowDiffAfterUndo ppe diffOutput -> + first (\p -> P.lines ["Here's the changes I undid", "", p ]) + (showDiffNamespace ppe e e diffOutput) + + ShowDiffAfterPull dest' destAbs ppe diff -> + if OBD.isEmpty diff then + ("✅ Looks like " <> prettyPath' dest' <> " is up to date.", mempty) + else + first (\p -> P.lines $ [ + P.wrap $ "Here's what's changed in " <> prettyPath' dest' <> "after the pull:", "", + p, "", + undoTip + ]) + (showDiffNamespace ppe destAbs destAbs diff) + where e = Path.absoluteEmpty + undoTip = tip $ "You can always" <> IP.makeExample' IP.undo + <> "if this wasn't what you wanted." + notifyUser :: forall v . Var v => FilePath -> Output v -> IO Pretty notifyUser dir o = case o of diff --git a/unison-src/transcripts/diff.md b/unison-src/transcripts/diff.md index d0a2c5dcb..a66c04a63 100644 --- a/unison-src/transcripts/diff.md +++ b/unison-src/transcripts/diff.md @@ -66,15 +66,37 @@ unique type Y a b = Y a b .> delete.term ns2.fromJust' .> diff.namespace ns1 ns2 .> diff.namespace ns2 nsempty +.> delete.namespace ns2 ``` ## Display issues to fixup +- [ ] delete.term has some bonkers output + .> delete.term ns2.fromJust' + + Here's what I deleted: + + Updates: + + 1. ns1.fromJust#hs2i9lcgkd : Text + 2. ns1.fromJust#jk19sm5bf8 : Nat + + 3. ns2.fromJust' : Nat + - 4. ns1.b : Nat + + Name changes: -- this is ok vvv + + Original Changes + 5. ns2.fromJust ┐ 6. ns2.fromJust' (removed) + 7. ns2.fromJust' ┘ + + Tip: You can always `undo` if this wasn't what you wanted. + - [ ] Things look screwy when the type signature doesn't fit and has to get broken up into multiple lines. Maybe just disallow that? - [ ] add tagging of propagated updates to test propagated updates output - [ ] Delete blank line in between copies / renames entries if all entries are 1 to 1 see todo in the code -- [ ] Maybe group and/or add headings to the types, constructors, terms +- [ ] ~~Maybe group and/or add headings to the types, constructors, terms~~ - [x] Make a decision about how we want to show constructors in the diff - [x] When you delete a name with metadata, it also shows up in updates section with the deleted metadata.