Skip to content

Commit

Permalink
Auto-create project-branches referenced in transcript prompts (#5077)
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisPenner committed Jun 12, 2024
1 parent 335512e commit 815c1b1
Show file tree
Hide file tree
Showing 34 changed files with 47 additions and 209 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@ import U.Codebase.Projects qualified as Projects
import U.Codebase.Reference qualified as C.Reference
import U.Codebase.Referent qualified as C.Referent
import U.Codebase.Sqlite.DbId (ObjectId)
import U.Codebase.Sqlite.DbId qualified as Db
import U.Codebase.Sqlite.NameLookups (PathSegments (..), ReversedName (..))
import U.Codebase.Sqlite.NamedRef qualified as S
import U.Codebase.Sqlite.ObjectType qualified as OT
import U.Codebase.Sqlite.Operations (NamesInPerspective (..))
import U.Codebase.Sqlite.Operations qualified as Ops
import U.Codebase.Sqlite.ProjectBranch (ProjectBranch (..))
import U.Codebase.Sqlite.Queries qualified as Q
import U.Codebase.Sqlite.V2.HashHandle (v2HashHandle)
import Unison.Builtin qualified as Builtins
Expand All @@ -41,6 +43,7 @@ import Unison.Codebase.SqliteCodebase.Branch.Cache (BranchCache)
import Unison.Codebase.SqliteCodebase.Conversions qualified as Cv
import Unison.ConstructorReference (GConstructorReference (..))
import Unison.ConstructorType qualified as CT
import Unison.Core.Project (ProjectBranchName, ProjectName)
import Unison.DataDeclaration (Decl)
import Unison.DataDeclaration qualified as Decl
import Unison.Hash (Hash)
Expand Down Expand Up @@ -731,3 +734,15 @@ makeMaybeCachedTransaction size action = do
pure \x -> do
conn <- Sqlite.unsafeGetConnection
Sqlite.unsafeIO (Cache.applyDefined cache (\x -> Sqlite.unsafeUnTransaction (action x) conn) x)

insertProjectAndBranch :: Db.ProjectId -> ProjectName -> Db.ProjectBranchId -> ProjectBranchName -> Sqlite.Transaction ()
insertProjectAndBranch projectId projectName branchId branchName = do
Q.insertProject projectId projectName
Q.insertProjectBranch
ProjectBranch
{ projectId,
branchId,
name = branchName,
parentBranchId = Nothing
}
Q.setMostRecentBranch projectId branchId
21 changes: 4 additions & 17 deletions unison-cli/src/Unison/Codebase/Editor/HandleInput/ProjectCreate.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import Data.Text qualified as Text
import Data.UUID.V4 qualified as UUID
import System.Random.Shuffle qualified as RandomShuffle
import U.Codebase.Sqlite.DbId
import U.Codebase.Sqlite.ProjectBranch qualified as Sqlite
import U.Codebase.Sqlite.Queries qualified as Queries
import Unison.Cli.DownloadUtils (downloadProjectBranchFromShare)
import Unison.Cli.Monad (Cli)
Expand All @@ -22,11 +21,11 @@ import Unison.Codebase qualified as Codebase
import Unison.Codebase.Branch qualified as Branch
import Unison.Codebase.Editor.Output qualified as Output
import Unison.Codebase.Path qualified as Path
import Unison.Codebase.SqliteCodebase.Operations qualified as Ops
import Unison.NameSegment qualified as NameSegment
import Unison.Prelude
import Unison.Project (ProjectAndBranch (..), ProjectBranchName, ProjectName)
import Unison.Project (ProjectAndBranch (..), ProjectName)
import Unison.Share.API.Hash qualified as Share.API
import Unison.Sqlite qualified as Sqlite
import Unison.Sync.Common qualified as Sync.Common
import Witch (unsafeFrom)

Expand Down Expand Up @@ -73,15 +72,15 @@ projectCreate tryDownloadingBase maybeProjectName = do
projectName : projectNames ->
Queries.projectExistsByName projectName >>= \case
False -> do
insertProjectAndBranch projectId projectName branchId branchName
Ops.insertProjectAndBranch projectId projectName branchId branchName
pure projectName
True -> loop projectNames
loop randomProjectNames
Just projectName -> do
Cli.runTransactionWithRollback \rollback -> do
Queries.projectExistsByName projectName >>= \case
False -> do
insertProjectAndBranch projectId projectName branchId branchName
Ops.insertProjectAndBranch projectId projectName branchId branchName
pure projectName
True -> rollback (Output.ProjectNameAlreadyExists projectName)

Expand Down Expand Up @@ -152,18 +151,6 @@ projectCreate tryDownloadingBase maybeProjectName = do
Nothing -> "project.create"
Just projectName -> "project.create " <> into @Text projectName

insertProjectAndBranch :: ProjectId -> ProjectName -> ProjectBranchId -> ProjectBranchName -> Sqlite.Transaction ()
insertProjectAndBranch projectId projectName branchId branchName = do
Queries.insertProject projectId projectName
Queries.insertProjectBranch
Sqlite.ProjectBranch
{ projectId,
branchId,
name = branchName,
parentBranchId = Nothing
}
Queries.setMostRecentBranch projectId branchId

-- An infinite list of random project names that looks like
--
-- [
Expand Down
28 changes: 24 additions & 4 deletions unison-cli/src/Unison/Codebase/TranscriptParser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import Data.List (isSubsequenceOf)
import Data.Map qualified as Map
import Data.Text qualified as Text
import Data.These (These (..))
import Data.UUID.V4 qualified as UUID
import Ki qualified
import Network.HTTP.Client qualified as HTTP
import System.Directory (doesFileExist)
Expand All @@ -39,7 +40,11 @@ import System.Exit (die)
import System.IO qualified as IO
import System.IO.Error (catchIOError)
import Text.Megaparsec qualified as P
import U.Codebase.Sqlite.DbId qualified as Db
import U.Codebase.Sqlite.Operations qualified as Operations
import U.Codebase.Sqlite.Project (Project (..))
import U.Codebase.Sqlite.ProjectBranch (ProjectBranch (..))
import U.Codebase.Sqlite.Queries qualified as Q
import Unison.Auth.CredentialManager qualified as AuthN
import Unison.Auth.HTTPClient qualified as AuthN
import Unison.Auth.Tokens qualified as AuthN
Expand Down Expand Up @@ -70,6 +75,7 @@ import Unison.Project (ProjectAndBranch (..), ProjectAndBranchNames (ProjectAndB
import Unison.Runtime.Interface qualified as RTI
import Unison.Server.Backend qualified as Backend
import Unison.Server.CodebaseServer qualified as Server
import Unison.Sqlite qualified as Sqlite
import Unison.Symbol (Symbol)
import Unison.Syntax.Parser qualified as Parser
import Unison.Util.Pretty qualified as Pretty
Expand Down Expand Up @@ -349,10 +355,24 @@ run verbosity dir stanzas codebase runtime sbRuntime nRuntime config ucmVersion
if curPath == path
then pure Nothing
else pure $ Just (SwitchBranchI (Path.absoluteToPath' path))
UcmContextProject (ProjectAndBranch projectName branchName) -> do
ProjectAndBranch project branch <-
ProjectUtils.expectProjectAndBranchByTheseNames (These projectName branchName)
let projectAndBranchIds = ProjectAndBranch (project ^. #projectId) (branch ^. #branchId)
UcmContextProject (ProjectAndBranch projectName branchName) -> Cli.runTransaction do
Project {projectId, name = projectName} <-
Q.loadProjectByName projectName
>>= \case
Nothing -> do
projectId <- Sqlite.unsafeIO (Db.ProjectId <$> UUID.nextRandom)
Q.insertProject projectId projectName
pure $ Project {projectId, name = projectName}
Just project -> pure project
projectBranch <-
Q.loadProjectBranchByName projectId branchName >>= \case
Nothing -> do
branchId <- Sqlite.unsafeIO (Db.ProjectBranchId <$> UUID.nextRandom)
let projectBranch = ProjectBranch {projectId, parentBranchId = Nothing, branchId, name = branchName}
Q.insertProjectBranch projectBranch
pure projectBranch
Just projBranch -> pure projBranch
let projectAndBranchIds = ProjectAndBranch projectBranch.projectId projectBranch.branchId
pure
if curPath == ProjectUtils.projectBranchPath projectAndBranchIds
then Nothing
Expand Down
1 change: 0 additions & 1 deletion unison-src/transcripts-manual/gen-racket-libs.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ When we start out, `./scheme-libs/racket` contains a bunch of library files that
Next, we'll download the jit project and generate a few Racket files from it.

```ucm
.> project.create-empty jit-setup
jit-setup/main> lib.install @unison/internal/releases/0.0.17
```

Expand Down
5 changes: 2 additions & 3 deletions unison-src/transcripts/definition-diff-api.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
```ucm
.> project.create-empty diffs
diffs/main> builtins.merge
```

```unison
term =
term =
_ = "Here's some text"
1 + 1
Expand All @@ -17,7 +16,7 @@ diffs/main> branch.create new
```

```unison
term =
term =
_ = "Here's some different text"
1 + 2
Expand Down
20 changes: 2 additions & 18 deletions unison-src/transcripts/definition-diff-api.output.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,11 @@
```ucm
.> project.create-empty diffs
πŸŽ‰ I've created the project diffs.
🎨 Type `ui` to explore this project's code in your browser.
πŸ”­ Discover libraries at https://share.unison-lang.org
πŸ“– Use `help-topic projects` to learn more about projects.
Write your first Unison code with UCM:
1. Open scratch.u.
2. Write some Unison code and save the file.
3. In UCM, type `add` to save it to your new project.
πŸŽ‰ πŸ₯³ Happy coding!
diffs/main> builtins.merge
Done.
```
```unison
term =
term =
_ = "Here's some text"
1 + 1
Expand Down Expand Up @@ -59,7 +43,7 @@ diffs/main> branch.create new
```
```unison
term =
term =
_ = "Here's some different text"
1 + 2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
This is a regression test, previously `delete.namespace` allowed a delete as long as the deletions had a name _anywhere_ in your codebase, it should only check the current project branch.

```ucm:hide
.> project.create-empty myproject
myproject/main> builtins.merge
```

Expand Down
1 change: 0 additions & 1 deletion unison-src/transcripts/delete-project-branch.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ Deleting the branch you are on takes you to its parent (though this is impossibl
your working directory with each command).

```ucm
.> project.create-empty foo
foo/main> branch topic
foo/topic> delete.branch /topic
```
Expand Down
16 changes: 0 additions & 16 deletions unison-src/transcripts/delete-project-branch.output.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,6 @@ Deleting the branch you are on takes you to its parent (though this is impossibl
your working directory with each command).

```ucm
.> project.create-empty foo
πŸŽ‰ I've created the project foo.
🎨 Type `ui` to explore this project's code in your browser.
πŸ”­ Discover libraries at https://share.unison-lang.org
πŸ“– Use `help-topic projects` to learn more about projects.
Write your first Unison code with UCM:
1. Open scratch.u.
2. Write some Unison code and save the file.
3. In UCM, type `add` to save it to your new project.
πŸŽ‰ πŸ₯³ Happy coding!
foo/main> branch topic
Done. I've created the topic branch based off of main.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ If `foo#old` exists in old, and `foo#new` exists in new, you might think `upgrad
`#old` with references to `#new`. And it will... !!unless!! `#old` still exists in new.

```ucm:hide
.> project.create-empty foo
foo/main> builtins.merge lib.builtin
```

Expand Down
1 change: 0 additions & 1 deletion unison-src/transcripts/edit-namespace.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
```ucm:hide
.> project.create-empty project
project/main> builtins.mergeio lib.builtin
```

Expand Down
1 change: 0 additions & 1 deletion unison-src/transcripts/fix-ls.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
```ucm
.> project.create-empty test-ls
test-ls/main> builtins.merge
```

Expand Down
16 changes: 0 additions & 16 deletions unison-src/transcripts/fix-ls.output.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,4 @@
```ucm
.> project.create-empty test-ls
πŸŽ‰ I've created the project test-ls.
🎨 Type `ui` to explore this project's code in your browser.
πŸ”­ Discover libraries at https://share.unison-lang.org
πŸ“– Use `help-topic projects` to learn more about projects.
Write your first Unison code with UCM:
1. Open scratch.u.
2. Write some Unison code and save the file.
3. In UCM, type `add` to save it to your new project.
πŸŽ‰ πŸ₯³ Happy coding!
test-ls/main> builtins.merge
Done.
Expand Down
1 change: 0 additions & 1 deletion unison-src/transcripts/fix4482.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
```ucm:hide
.> project.create-empty myproj
myproj/main> builtins.merge
```

Expand Down
1 change: 0 additions & 1 deletion unison-src/transcripts/fix4515.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
```ucm:hide
.> project.create-empty myproject
myproject/main> builtins.merge
```

Expand Down
1 change: 0 additions & 1 deletion unison-src/transcripts/fix4528.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
```ucm:hide
.> project.create-empty foo
foo/main> builtins.merge
```

Expand Down
1 change: 0 additions & 1 deletion unison-src/transcripts/fix5055.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
```ucm
.> project.create-empty test-5055
test-5055/main> builtins.merge
```

Expand Down
16 changes: 0 additions & 16 deletions unison-src/transcripts/fix5055.output.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,4 @@
```ucm
.> project.create-empty test-5055
πŸŽ‰ I've created the project test-5055.
🎨 Type `ui` to explore this project's code in your browser.
πŸ”­ Discover libraries at https://share.unison-lang.org
πŸ“– Use `help-topic projects` to learn more about projects.
Write your first Unison code with UCM:
1. Open scratch.u.
2. Write some Unison code and save the file.
3. In UCM, type `add` to save it to your new project.
πŸŽ‰ πŸ₯³ Happy coding!
test-5055/main> builtins.merge
Done.
Expand Down
1 change: 0 additions & 1 deletion unison-src/transcripts/fuzzy-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ Namespace args
Project Branch args

```ucm
.> project.create-empty myproject
myproject/main> branch mybranch
.> debug.fuzzy-options switch _
```
16 changes: 0 additions & 16 deletions unison-src/transcripts/fuzzy-options.output.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,22 +65,6 @@ Namespace args
Project Branch args

```ucm
.> project.create-empty myproject
πŸŽ‰ I've created the project myproject.
🎨 Type `ui` to explore this project's code in your browser.
πŸ”­ Discover libraries at https://share.unison-lang.org
πŸ“– Use `help-topic projects` to learn more about projects.
Write your first Unison code with UCM:
1. Open scratch.u.
2. Write some Unison code and save the file.
3. In UCM, type `add` to save it to your new project.
πŸŽ‰ πŸ₯³ Happy coding!
myproject/main> branch mybranch
Done. I've created the mybranch branch based off of main.
Expand Down
Loading

0 comments on commit 815c1b1

Please sign in to comment.