@@ -17,15 +17,16 @@ package createchunk
17
17
import (
18
18
"bytes"
19
19
"context"
20
-
21
- "github.com/dolthub/go-mysql-server/sql"
22
- "github.com/gocraft/dbr/v2"
23
- "github.com/gocraft/dbr/v2/dialect"
20
+ "errors"
24
21
25
22
"github.com/dolthub/dolt/go/cmd/dolt/cli"
26
23
"github.com/dolthub/dolt/go/cmd/dolt/errhand"
24
+ "github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
27
25
"github.com/dolthub/dolt/go/libraries/doltcore/env"
26
+ "github.com/dolthub/dolt/go/libraries/doltcore/ref"
28
27
"github.com/dolthub/dolt/go/libraries/utils/argparser"
28
+ "github.com/dolthub/dolt/go/store/datas"
29
+ "github.com/dolthub/dolt/go/store/hash"
29
30
)
30
31
31
32
// CreateCommitCmd creates a new commit chunk, printing the new chunk's hash on success.
@@ -121,7 +122,7 @@ func (cmd CreateCommitCmd) ArgParser() *argparser.ArgParser {
121
122
return cli .CreateCreateCommitParser ()
122
123
}
123
124
124
- func (cmd CreateCommitCmd ) Exec (ctx context.Context , commandStr string , args []string , _ * env.DoltEnv , cliCtx cli.CliContext ) int {
125
+ func (cmd CreateCommitCmd ) Exec (ctx context.Context , commandStr string , args []string , dEnv * env.DoltEnv , cliCtx cli.CliContext ) int {
125
126
ap := cmd .ArgParser ()
126
127
usage , _ := cli .HelpAndUsagePrinters (cli .CommandDocsForCommandString (commandStr , cli.CommandDocumentationContent {}, ap ))
127
128
@@ -133,39 +134,94 @@ func (cmd CreateCommitCmd) Exec(ctx context.Context, commandStr string, args []s
133
134
return 1
134
135
}
135
136
136
- queryist , sqlCtx , closeFunc , err := cliCtx .QueryEngine (ctx )
137
- if err != nil {
138
- cli .PrintErrln (errhand .VerboseErrorFromError (err ))
137
+ desc , _ := apr .GetValue ("desc" )
138
+ root , _ := apr .GetValue ("root" )
139
+ parents , _ := apr .GetValueList ("parents" )
140
+ branch , isBranchSet := apr .GetValue (cli .BranchParam )
141
+ force := apr .Contains (cli .ForceFlag )
142
+
143
+ var name , email string
144
+ var err error
145
+ if authorStr , ok := apr .GetValue (cli .AuthorParam ); ok {
146
+ name , email , err = cli .ParseAuthor (authorStr )
147
+ if err != nil {
148
+ cli .PrintErrln (errhand .VerboseErrorFromError (err ))
149
+ return 1
150
+ }
151
+ } else {
152
+ name , email , err = env .GetNameAndEmail (cliCtx .Config ())
153
+ if err != nil {
154
+ cli .PrintErrln (errhand .VerboseErrorFromError (err ))
155
+ return 1
156
+ }
157
+ }
158
+
159
+ db := dEnv .DbData (ctx ).Ddb
160
+ commitRootHash , ok := hash .MaybeParse (root )
161
+ if ! ok {
162
+ cli .PrintErrf ("invalid root value hash" )
139
163
return 1
140
164
}
141
- if closeFunc != nil {
142
- defer closeFunc ()
165
+
166
+ var parentCommits []hash.Hash
167
+ for _ , parent := range parents {
168
+ commitSpec , err := doltdb .NewCommitSpec (parent )
169
+ if err != nil {
170
+ cli .PrintErrln (errhand .VerboseErrorFromError (err ))
171
+ return 1
172
+ }
173
+
174
+ headRef := dEnv .RepoState .CWBHeadRef ()
175
+
176
+ optionalCommit , err := db .Resolve (ctx , commitSpec , headRef )
177
+ if err != nil {
178
+ cli .PrintErrln (errhand .VerboseErrorFromError (err ))
179
+ return 1
180
+ }
181
+ parentCommits = append (parentCommits , optionalCommit .Addr )
143
182
}
144
183
145
- querySql , params , err := generateCreateCommitSQL ( cliCtx , apr )
184
+ commitMeta , err := datas . NewCommitMeta ( name , email , desc )
146
185
if err != nil {
147
186
cli .PrintErrln (errhand .VerboseErrorFromError (err ))
148
187
return 1
149
188
}
150
- interpolatedQuery , err := dbr .InterpolateForDialect (querySql , params , dialect .MySQL )
189
+
190
+ // This isn't technically an amend, but the Amend field controls whether the commit must be a child of the ref's current commit (if any)
191
+ commitOpts := datas.CommitOptions {
192
+ Parents : parentCommits ,
193
+ Meta : commitMeta ,
194
+ Amend : force ,
195
+ }
196
+
197
+ rootVal , err := db .ValueReadWriter ().ReadValue (ctx , commitRootHash )
151
198
if err != nil {
152
199
cli .PrintErrln (errhand .VerboseErrorFromError (err ))
153
200
return 1
154
201
}
155
202
156
- _ , rowIter , _ , err := queryist .Query (sqlCtx , interpolatedQuery )
203
+ var commit * doltdb.Commit
204
+ if isBranchSet {
205
+ commit , err = db .CommitValue (ctx , ref .NewBranchRef (branch ), rootVal , commitOpts )
206
+ if errors .Is (err , datas .ErrMergeNeeded ) {
207
+ cli .PrintErrf ("branch %s already exists. If you wish to overwrite it, add the --force flag" , branch )
208
+ return 1
209
+ }
210
+ } else {
211
+ commit , err = db .CommitDangling (ctx , rootVal , commitOpts )
212
+ }
157
213
if err != nil {
158
214
cli .PrintErrln (errhand .VerboseErrorFromError (err ))
159
215
return 1
160
216
}
161
217
162
- rows , err := sql . RowIterToRows ( sqlCtx , rowIter )
218
+ commitHash , err := commit . HashOf ( )
163
219
if err != nil {
164
220
cli .PrintErrln (errhand .VerboseErrorFromError (err ))
165
221
return 1
166
222
}
167
223
168
- cli .Println (rows [ 0 ][ 0 ] )
224
+ cli .Println (commitHash . String () )
169
225
170
226
return 0
171
227
}
0 commit comments