update dolt commit to use sql queries

This commit is contained in:
Stephanie You
2023-06-06 17:11:25 -07:00
parent f553258ef7
commit 950d7388c3
7 changed files with 166 additions and 103 deletions
+3 -3
View File
@@ -293,14 +293,14 @@ fatal: empty ident name not allowed
// CheckUserNameAndEmail returns true if the user name and email are set for this environment, or prints an error and
// returns false if not.
func CheckUserNameAndEmail(dEnv *env.DoltEnv) bool {
_, err := dEnv.Config.GetString(env.UserEmailKey)
func CheckUserNameAndEmail(config *env.DoltCliConfig) bool {
_, err := config.GetString(env.UserEmailKey)
if err != nil {
PrintErr(userNameRequiredError)
return false
}
_, err = dEnv.Config.GetString(env.UserNameKey)
_, err = config.GetString(env.UserNameKey)
if err != nil {
PrintErr(userNameRequiredError)
return false
+1 -1
View File
@@ -84,7 +84,7 @@ func (cmd CherryPickCmd) Exec(ctx context.Context, commandStr string, args []str
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(env.ErrActiveServerLock.New(dEnv.LockFile())), help)
}
// This command creates a commit, so we need user identity
if !cli.CheckUserNameAndEmail(dEnv) {
if !cli.CheckUserNameAndEmail(cliCtx.Config()) {
return 1
}
+112 -71
View File
@@ -22,6 +22,9 @@ import (
"os"
"strings"
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
"github.com/dolthub/go-mysql-server/sql"
"github.com/fatih/color"
goisatty "github.com/mattn/go-isatty"
@@ -77,7 +80,7 @@ func (cmd CommitCmd) ArgParser() *argparser.ArgParser {
// Exec executes the command
func (cmd CommitCmd) Exec(ctx context.Context, commandStr string, args []string, dEnv *env.DoltEnv, cliCtx cli.CliContext) int {
res, skipped := performCommit(ctx, commandStr, args, dEnv)
res, skipped := performCommit(ctx, commandStr, args, dEnv, cliCtx)
if res == 1 {
return res
}
@@ -94,7 +97,23 @@ func (cmd CommitCmd) Exec(ctx context.Context, commandStr string, args []string,
// performCommit creates a new Dolt commit using the specified |commandStr| and |args| for the specified Dolt environment
// |dEnv|. The response is an integer status code indicating success or failure, as well as a boolean that indicates
// if the commit was skipped (e.g. because --skip-empty was specified as an argument).
func performCommit(ctx context.Context, commandStr string, args []string, dEnv *env.DoltEnv) (int, bool) {
func performCommit(ctx context.Context, commandStr string, args []string, dEnv *env.DoltEnv, cliCtx cli.CliContext) (int, bool) {
_, sqlCtx, closeFunc, err := cliCtx.QueryEngine(ctx)
if err != nil {
iohelp.WriteLine(cli.CliOut, err.Error())
return 1, false
}
if closeFunc != nil {
defer closeFunc()
}
err = branch_control.CheckAccess(sqlCtx, branch_control.Permissions_Write)
if err != nil {
iohelp.WriteLine(cli.CliOut, err.Error())
return 1, false
}
dbName := sqlCtx.GetCurrentDatabase()
ap := cli.CreateCommitArgParser()
help, usage := cli.HelpAndUsagePrinters(cli.CommandDocsForCommandString(commandStr, commitDocs, ap))
apr := cli.ParseArgsOrDie(ap, args, help)
@@ -106,59 +125,58 @@ func performCommit(ctx context.Context, commandStr string, args []string, dEnv *
allFlag := apr.Contains(cli.AllFlag)
upperCaseAllFlag := apr.Contains(cli.UpperCaseAllFlag)
if dEnv.IsLocked() {
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(env.ErrActiveServerLock.New(dEnv.LockFile())), help), false
}
roots, err := dEnv.Roots(ctx)
if err != nil {
return HandleVErrAndExitCode(errhand.BuildDError("Couldn't get working root").AddCause(err).Build(), usage), false
dSess := dsess.DSessFromSess(sqlCtx.Session)
roots, ok := dSess.GetRoots(sqlCtx, dbName)
if !ok {
iohelp.WriteLine(cli.CliOut, fmt.Sprintf("Could not load database %s", dbName))
return 1, false
}
if upperCaseAllFlag {
roots, err = actions.StageAllTables(ctx, roots, true)
if err != nil {
return handleCommitErr(ctx, dEnv, err, help), false
return handleCommitErr(ctx, sqlCtx, err, help), false
}
} else if allFlag {
roots, err = actions.StageModifiedAndDeletedTables(ctx, roots)
if err != nil {
return handleCommitErr(ctx, dEnv, err, help), false
return handleCommitErr(ctx, sqlCtx, err, help), false
}
}
headCommit, _ := dEnv.HeadCommit(ctx)
headHash, _ := headCommit.HashOf()
var name, email string
// Check if the author flag is provided otherwise get the name and email stored in configs
if authorStr, ok := apr.GetValue(cli.AuthorParam); ok {
name, email, err = cli.ParseAuthor(authorStr)
} else {
// This command creates a commit, so we need user identity
if !cli.CheckUserNameAndEmail(dEnv) {
if !cli.CheckUserNameAndEmail(cliCtx.Config()) {
return 1, false
}
name, email, err = env.GetNameAndEmail(dEnv.Config)
name, email, err = env.GetNameAndEmail(cliCtx.Config())
}
if err != nil {
return handleCommitErr(ctx, dEnv, err, usage), false
return handleCommitErr(ctx, sqlCtx, err, usage), false
}
msg, msgOk := apr.GetValue(cli.MessageArg)
if !msgOk {
amendStr := ""
if apr.Contains(cli.AmendFlag) {
commitMeta, cmErr := headCommit.GetCommitMeta(ctx)
commit, cmErr := dSess.GetHeadCommit(sqlCtx, dbName)
if cmErr != nil {
return handleCommitErr(ctx, dEnv, cmErr, usage), false
return handleCommitErr(ctx, sqlCtx, cmErr, usage), false
}
commitMeta, err := commit.GetCommitMeta(sqlCtx)
if cmErr != nil {
iohelp.WriteLine(cli.CliOut, err.Error())
return 1, false
}
amendStr = commitMeta.Description
}
msg, err = getCommitMessageFromEditor(ctx, dEnv, "", amendStr, false)
msg, err = getCommitMessageFromEditor(ctx, sqlCtx, "", amendStr, false, cliCtx)
if err != nil {
return handleCommitErr(ctx, dEnv, err, usage), false
return handleCommitErr(ctx, sqlCtx, err, usage), false
}
}
@@ -172,6 +190,12 @@ func performCommit(ctx context.Context, commandStr string, args []string, dEnv *
}
}
headCommit, err := dSess.GetHeadCommit(sqlCtx, dbName)
if err != nil {
iohelp.WriteLine(cli.CliOut, err.Error())
return 1, false
}
var parentsHeadForAmend []*doltdb.Commit
if apr.Contains(cli.AmendFlag) {
numParentsHeadForAmend := headCommit.NumParents()
@@ -182,35 +206,33 @@ func performCommit(ctx context.Context, commandStr string, args []string, dEnv *
}
}
newRoots, err := actions.ResetSoftToRef(ctx, dEnv.DbData(), "HEAD~1")
dbData, ok := dSess.GetDbData(sqlCtx, dbName)
if !ok {
iohelp.WriteLine(cli.CliOut, fmt.Sprintf("Could not load database %s", dbName))
return 1, false
}
newRoots, err := actions.ResetSoftToRef(ctx, dbData, "HEAD~1")
if err != nil {
return handleResetError(err, usage), false
}
err = dEnv.UpdateStagedRoot(ctx, newRoots.Staged)
ws, err := dSess.WorkingSet(sqlCtx, dbName)
if err != nil {
return handleResetError(err, usage), false
}
err = dSess.SetWorkingSet(sqlCtx, dbName, ws.WithWorkingRoot(newRoots.Working).WithStagedRoot(newRoots.Staged))
if err != nil {
iohelp.WriteLine(cli.CliOut, err.Error())
return 1, false
}
}
ws, err := dEnv.WorkingSet(ctx)
ws, err := dSess.WorkingSet(sqlCtx, dbName)
if err != nil {
return HandleVErrAndExitCode(errhand.BuildDError("Couldn't get working set").AddCause(err).Build(), usage), false
}
prevHash, err := ws.HashOf()
if err != nil {
return HandleVErrAndExitCode(errhand.BuildDError("Couldn't get working set").AddCause(err).Build(), usage), false
}
var mergeParentCommits []*doltdb.Commit
if ws.MergeActive() {
mergeParentCommits = []*doltdb.Commit{ws.MergeState().Commit()}
} else if apr.Contains(cli.AmendFlag) && len(parentsHeadForAmend) > 1 {
mergeParentCommits = parentsHeadForAmend
}
pendingCommit, err := actions.GetCommitStaged(ctx, roots, ws, mergeParentCommits, dEnv.DbData().Ddb, actions.CommitStagedProps{
pendingCommit, err := dSess.NewPendingCommit(sqlCtx, dbName, roots, actions.CommitStagedProps{
Message: msg,
Date: t,
AllowEmpty: apr.Contains(cli.AllowEmptyFlag) || apr.Contains(cli.AmendFlag),
@@ -221,17 +243,27 @@ func performCommit(ctx context.Context, commandStr string, args []string, dEnv *
})
if err != nil {
if apr.Contains(cli.AmendFlag) {
newRoots, errRes := actions.ResetSoftToRef(ctx, dEnv.DbData(), headHash.String())
dbData, ok := dSess.GetDbData(sqlCtx, dbName)
if !ok {
iohelp.WriteLine(cli.CliOut, fmt.Sprintf("Could not load database %s", dbName))
return 1, false
}
headHash, err := headCommit.HashOf()
if err != nil {
iohelp.WriteLine(cli.CliOut, err.Error())
return 1, false
}
newRoots, errRes := actions.ResetSoftToRef(ctx, dbData, headHash.String())
if errRes != nil {
return handleResetError(errRes, usage), false
}
err = dEnv.UpdateStagedRoot(ctx, newRoots.Staged)
err = dSess.SetWorkingSet(sqlCtx, dbName, ws.WithWorkingRoot(newRoots.Working).WithStagedRoot(newRoots.Staged))
if err != nil {
return handleResetError(err, usage), false
}
}
return handleCommitErr(ctx, dEnv, err, usage), false
return handleCommitErr(ctx, sqlCtx, err, usage), false
}
// If no error was reported and there is no pending commit, then no commit was created, likely
@@ -240,28 +272,30 @@ func performCommit(ctx context.Context, commandStr string, args []string, dEnv *
return 0, true
}
headRef, err := dEnv.RepoStateReader().CWBHeadRef()
if err != nil {
return handleCommitErr(ctx, dEnv, err, usage), false
}
_, err = dEnv.DoltDB.CommitWithWorkingSet(
ctx,
headRef,
ws.Ref(),
_, err = dSess.DoltCommit(
sqlCtx,
dbName,
dSess.GetTransaction(),
pendingCommit,
ws.WithStagedRoot(pendingCommit.Roots.Staged).WithWorkingRoot(pendingCommit.Roots.Working).ClearMerge(),
prevHash,
dEnv.NewWorkingSetMeta(fmt.Sprintf("Updated by %s %s", commandStr, strings.Join(args, " "))),
nil,
)
if err != nil {
if apr.Contains(cli.AmendFlag) {
newRoots, errRes := actions.ResetSoftToRef(ctx, dEnv.DbData(), headHash.String())
headHash, err := headCommit.HashOf()
if err != nil {
iohelp.WriteLine(cli.CliOut, err.Error())
return 1, false
}
dbData, ok := dSess.GetDbData(sqlCtx, dbName)
if !ok {
iohelp.WriteLine(cli.CliOut, fmt.Sprintf("Could not load database %s", dbName))
return 1, false
}
newRoots, errRes := actions.ResetSoftToRef(ctx, dbData, headHash.String())
if errRes != nil {
return handleResetError(errRes, usage), false
}
err = dEnv.UpdateStagedRoot(ctx, newRoots.Staged)
err = dSess.SetWorkingSet(sqlCtx, dbName, ws.WithWorkingRoot(newRoots.Working).WithStagedRoot(newRoots.Staged))
if err != nil {
return handleResetError(err, usage), false
}
@@ -272,7 +306,7 @@ func performCommit(ctx context.Context, commandStr string, args []string, dEnv *
return 0, false
}
func handleCommitErr(ctx context.Context, dEnv *env.DoltEnv, err error, usage cli.UsagePrinter) int {
func handleCommitErr(ctx context.Context, sqlCtx *sql.Context, err error, usage cli.UsagePrinter) int {
if err == nil {
return 0
}
@@ -300,7 +334,7 @@ func handleCommitErr(ctx context.Context, dEnv *env.DoltEnv, err error, usage cl
if actions.IsNothingStaged(err) {
notStagedTbls := actions.NothingStagedTblDiffs(err)
n, newErr := PrintDiffsNotStaged(ctx, dEnv, cli.CliOut, notStagedTbls, false, false, 0, merge.ArtifactStatus{})
n, newErr := PrintDiffsNotStaged(ctx, sqlCtx, cli.CliOut, notStagedTbls, false, false, 0, merge.ArtifactStatus{})
if newErr != nil {
bdr := errhand.BuildDError(`No changes added to commit (use "dolt add")\nCould not print diff because of additional error`)
bdr.AddCause(newErr)
@@ -325,7 +359,7 @@ func handleCommitErr(ctx context.Context, dEnv *env.DoltEnv, err error, usage cl
// getCommitMessageFromEditor opens editor to ask user for commit message if none defined from command line.
// suggestedMsg will be returned if no-edit flag is defined or if this function was called from sql dolt_merge command.
func getCommitMessageFromEditor(ctx context.Context, dEnv *env.DoltEnv, suggestedMsg, amendString string, noEdit bool) (string, error) {
func getCommitMessageFromEditor(ctx context.Context, sqlCtx *sql.Context, suggestedMsg, amendString string, noEdit bool, cliCtx cli.CliContext) (string, error) {
if cli.ExecuteWithStdioRestored == nil || noEdit {
return suggestedMsg, nil
}
@@ -335,7 +369,7 @@ func getCommitMessageFromEditor(ctx context.Context, dEnv *env.DoltEnv, suggeste
}
var finalMsg string
initialMsg, err := buildInitalCommitMsg(ctx, dEnv, suggestedMsg)
initialMsg, err := buildInitalCommitMsg(ctx, sqlCtx, suggestedMsg)
if err != nil {
return "", err
}
@@ -349,7 +383,7 @@ func getCommitMessageFromEditor(ctx context.Context, dEnv *env.DoltEnv, suggeste
backupEd = ed
}
// try getting Dolt config core.editor
editorStr := dEnv.Config.GetStringOrDefault(env.DoltEditor, backupEd)
editorStr := cliCtx.Config().GetStringOrDefault(env.DoltEditor, backupEd)
cli.ExecuteWithStdioRestored(func() {
commitMsg, cErr := editor.OpenCommitEditor(editorStr, initialMsg)
@@ -376,18 +410,20 @@ func checkIsTerminal() bool {
return isTerminal
}
func buildInitalCommitMsg(ctx context.Context, dEnv *env.DoltEnv, suggestedMsg string) (string, error) {
func buildInitalCommitMsg(ctx context.Context, sqlCtx *sql.Context, suggestedMsg string) (string, error) {
initialNoColor := color.NoColor
color.NoColor = true
roots, err := dEnv.Roots(ctx)
if err != nil {
panic(err)
dSess := dsess.DSessFromSess(sqlCtx.Session)
dbName := sqlCtx.GetCurrentDatabase()
roots, ok := dSess.GetRoots(sqlCtx, dbName)
if !ok {
panic(fmt.Errorf("Could not load database %s", dbName))
}
stagedTblDiffs, notStagedTblDiffs, _ := diff.GetStagedUnstagedTableDeltas(ctx, roots)
ws, err := dEnv.WorkingSet(ctx)
ws, err := dSess.WorkingSet(sqlCtx, dbName)
if err != nil {
return "", err
}
@@ -399,12 +435,16 @@ func buildInitalCommitMsg(ctx context.Context, dEnv *env.DoltEnv, suggestedMsg s
buf := bytes.NewBuffer([]byte{})
n := printStagedDiffs(buf, stagedTblDiffs, true)
n, err = PrintDiffsNotStaged(ctx, dEnv, buf, notStagedTblDiffs, true, false, n, as)
n, err = PrintDiffsNotStaged(ctx, sqlCtx, buf, notStagedTblDiffs, true, false, n, as)
if err != nil {
return "", err
}
currBranch, err := dEnv.RepoStateReader().CWBHeadRef()
dbData, ok := dSess.GetDbData(sqlCtx, sqlCtx.GetCurrentDatabase())
if !ok {
return "", fmt.Errorf("Could not load database %s", dbName)
}
currBranch, err := dbData.Rsr.CWBHeadRef()
if err != nil {
return "", err
}
@@ -436,7 +476,7 @@ func parseCommitMessage(cm string) string {
func PrintDiffsNotStaged(
ctx context.Context,
dEnv *env.DoltEnv,
sqlCtx *sql.Context,
wr io.Writer,
notStagedTbls []diff.TableDelta,
printHelp bool,
@@ -444,9 +484,10 @@ func PrintDiffsNotStaged(
linesPrinted int,
as merge.ArtifactStatus,
) (int, error) {
roots, err := dEnv.Roots(ctx)
if err != nil {
return 0, err
dSess := dsess.DSessFromSess(sqlCtx.Session)
roots, ok := dSess.GetRoots(sqlCtx, sqlCtx.GetCurrentDatabase())
if !ok {
return 0, fmt.Errorf("Could not load database %s", sqlCtx.GetCurrentDatabase())
}
inCnfSet := set.NewStrSet(as.DataConflictTables)
+1 -1
View File
@@ -117,7 +117,7 @@ func (cmd InitCmd) Exec(ctx context.Context, commandStr string, args []string, d
if len(name) == 0 || len(email) == 0 {
// This command creates a commit, so we need user identity
if !cli.CheckUserNameAndEmail(dEnv) {
if !cli.CheckUserNameAndEmail(cliCtx.Config()) {
return 1
}
}
+34 -23
View File
@@ -21,6 +21,8 @@ import (
"sort"
"strconv"
"github.com/dolthub/dolt/go/libraries/utils/iohelp"
"github.com/dolthub/go-mysql-server/sql"
"github.com/fatih/color"
"github.com/dolthub/dolt/go/cmd/dolt/cli"
@@ -79,6 +81,15 @@ func (cmd MergeCmd) EventType() eventsapi.ClientEventType {
// Exec executes the command
func (cmd MergeCmd) Exec(ctx context.Context, commandStr string, args []string, dEnv *env.DoltEnv, cliCtx cli.CliContext) int {
_, sqlCtx, closeFunc, err := cliCtx.QueryEngine(ctx)
if err != nil {
iohelp.WriteLine(cli.CliOut, err.Error())
return 1
}
if closeFunc != nil {
defer closeFunc()
}
ap := cli.CreateMergeArgParser()
help, usage := cli.HelpAndUsagePrinters(cli.CommandDocsForCommandString(commandStr, mergeDocs, ap))
apr := cli.ParseArgsOrDie(ap, args, help)
@@ -89,7 +100,7 @@ func (cmd MergeCmd) Exec(ctx context.Context, commandStr string, args []string,
}
// This command may create a commit, so we need user identity
if !cli.CheckUserNameAndEmail(dEnv) {
if !cli.CheckUserNameAndEmail(cliCtx.Config()) {
return 1
}
@@ -126,7 +137,7 @@ func (cmd MergeCmd) Exec(ctx context.Context, commandStr string, args []string,
if err != nil {
verr = errhand.BuildDError("error: invalid date").AddCause(err).Build()
return handleCommitErr(ctx, dEnv, verr, usage)
return handleCommitErr(ctx, sqlCtx, verr, usage)
}
}
@@ -146,7 +157,7 @@ func (cmd MergeCmd) Exec(ctx context.Context, commandStr string, args []string,
roots, err := dEnv.Roots(ctx)
if err != nil {
return handleCommitErr(ctx, dEnv, err, usage)
return handleCommitErr(ctx, sqlCtx, err, usage)
}
var name, email string
@@ -156,12 +167,12 @@ func (cmd MergeCmd) Exec(ctx context.Context, commandStr string, args []string,
name, email, err = env.GetNameAndEmail(dEnv.Config)
}
if err != nil {
return handleCommitErr(ctx, dEnv, err, usage)
return handleCommitErr(ctx, sqlCtx, err, usage)
}
headRef, err := dEnv.RepoStateReader().CWBHeadRef()
if err != nil {
return handleCommitErr(ctx, dEnv, err, usage)
return handleCommitErr(ctx, sqlCtx, err, usage)
}
suggestedMsg := fmt.Sprintf("Merge branch '%s' into %s", commitSpecStr, headRef.GetPath())
@@ -175,25 +186,25 @@ func (cmd MergeCmd) Exec(ctx context.Context, commandStr string, args []string,
}
spec, err := merge.NewMergeSpec(ctx, dEnv.RepoStateReader(), dEnv.DoltDB, roots, name, email, msg, commitSpecStr, apr.Contains(cli.SquashParam), apr.Contains(cli.NoFFParam), apr.Contains(cli.ForceFlag), apr.Contains(cli.NoCommitFlag), apr.Contains(cli.NoEditFlag), t)
if err != nil {
return handleCommitErr(ctx, dEnv, errhand.VerboseErrorFromError(err), usage)
return handleCommitErr(ctx, sqlCtx, errhand.VerboseErrorFromError(err), usage)
}
if spec == nil {
cli.Println("Everything up-to-date")
return handleCommitErr(ctx, dEnv, nil, usage)
return handleCommitErr(ctx, sqlCtx, nil, usage)
}
err = validateMergeSpec(ctx, spec)
if err != nil {
return handleCommitErr(ctx, dEnv, err, usage)
return handleCommitErr(ctx, sqlCtx, err, usage)
}
tblToStats, mergeErr := performMerge(ctx, dEnv, spec, suggestedMsg)
tblToStats, mergeErr := performMerge(ctx, sqlCtx, dEnv, spec, suggestedMsg, cliCtx)
hasConflicts, hasConstraintViolations := printSuccessStats(tblToStats)
return handleMergeErr(ctx, dEnv, mergeErr, hasConflicts, hasConstraintViolations, usage)
return handleMergeErr(ctx, sqlCtx, dEnv, mergeErr, hasConflicts, hasConstraintViolations, usage)
}
}
return handleCommitErr(ctx, dEnv, verr, usage)
return handleCommitErr(ctx, sqlCtx, verr, usage)
}
func isMergeActive(ctx context.Context, denv *env.DoltEnv) (bool, error) {
@@ -436,7 +447,7 @@ func fillStringWithChar(ch rune, strLen int) string {
return string(runes)
}
func handleMergeErr(ctx context.Context, dEnv *env.DoltEnv, mergeErr error, hasConflicts, hasConstraintViolations bool, usage cli.UsagePrinter) int {
func handleMergeErr(ctx context.Context, sqlCtx *sql.Context, dEnv *env.DoltEnv, mergeErr error, hasConflicts, hasConstraintViolations bool, usage cli.UsagePrinter) int {
ws, err := dEnv.WorkingSet(ctx)
if err != nil {
cli.PrintErrln(err.Error())
@@ -470,7 +481,7 @@ func handleMergeErr(ctx context.Context, dEnv *env.DoltEnv, mergeErr error, hasC
verr = errhand.VerboseErrorFromError(mergeErr)
cli.Println("Unable to stage changes: add and commit to finish merge")
}
return handleCommitErr(ctx, dEnv, verr, usage)
return handleCommitErr(ctx, sqlCtx, verr, usage)
}
return 0
@@ -485,19 +496,19 @@ func handleMergeErr(ctx context.Context, dEnv *env.DoltEnv, mergeErr error, hasC
//
// FF merges will not surface constraint violations on their own; constraint verify --all
// is required to reify violations.
func performMerge(ctx context.Context, dEnv *env.DoltEnv, spec *merge.MergeSpec, suggestedMsg string) (map[string]*merge.MergeStats, error) {
func performMerge(ctx context.Context, sqlCtx *sql.Context, dEnv *env.DoltEnv, spec *merge.MergeSpec, suggestedMsg string, cliCtx cli.CliContext) (map[string]*merge.MergeStats, error) {
if ok, err := spec.HeadC.CanFastForwardTo(ctx, spec.MergeC); err != nil && !errors.Is(err, doltdb.ErrUpToDate) {
return nil, err
} else if ok {
if spec.Noff {
return executeNoFFMergeAndCommit(ctx, dEnv, spec, suggestedMsg)
return executeNoFFMergeAndCommit(ctx, sqlCtx, dEnv, spec, suggestedMsg, cliCtx)
}
return nil, merge.ExecuteFFMerge(ctx, dEnv, spec)
}
return executeMergeAndCommit(ctx, dEnv, spec, suggestedMsg)
return executeMergeAndCommit(ctx, sqlCtx, dEnv, spec, suggestedMsg, cliCtx)
}
func executeNoFFMergeAndCommit(ctx context.Context, dEnv *env.DoltEnv, spec *merge.MergeSpec, suggestedMsg string) (map[string]*merge.MergeStats, error) {
func executeNoFFMergeAndCommit(ctx context.Context, sqlCtx *sql.Context, dEnv *env.DoltEnv, spec *merge.MergeSpec, suggestedMsg string, cliCtx cli.CliContext) (map[string]*merge.MergeStats, error) {
tblToStats, err := merge.ExecNoFFMerge(ctx, dEnv, spec)
if err != nil {
return tblToStats, err
@@ -524,7 +535,7 @@ func executeNoFFMergeAndCommit(ctx context.Context, dEnv *env.DoltEnv, spec *mer
mergeParentCommits = []*doltdb.Commit{ws.MergeState().Commit()}
}
msg, err := getCommitMsgForMerge(ctx, dEnv, spec.Msg, suggestedMsg, spec.NoEdit)
msg, err := getCommitMsgForMerge(ctx, sqlCtx, spec.Msg, suggestedMsg, spec.NoEdit, cliCtx)
if err != nil {
return tblToStats, err
}
@@ -562,7 +573,7 @@ func executeNoFFMergeAndCommit(ctx context.Context, dEnv *env.DoltEnv, spec *mer
return tblToStats, err
}
func executeMergeAndCommit(ctx context.Context, dEnv *env.DoltEnv, spec *merge.MergeSpec, suggestedMsg string) (map[string]*merge.MergeStats, error) {
func executeMergeAndCommit(ctx context.Context, sqlCtx *sql.Context, dEnv *env.DoltEnv, spec *merge.MergeSpec, suggestedMsg string, cliCtx cli.CliContext) (map[string]*merge.MergeStats, error) {
tblToStats, err := merge.ExecuteMerge(ctx, dEnv, spec)
if err != nil {
return tblToStats, err
@@ -577,14 +588,14 @@ func executeMergeAndCommit(ctx context.Context, dEnv *env.DoltEnv, spec *merge.M
return tblToStats, nil
}
msg, err := getCommitMsgForMerge(ctx, dEnv, spec.Msg, suggestedMsg, spec.NoEdit)
msg, err := getCommitMsgForMerge(ctx, sqlCtx, spec.Msg, suggestedMsg, spec.NoEdit, cliCtx)
if err != nil {
return tblToStats, err
}
author := fmt.Sprintf("%s <%s>", spec.Name, spec.Email)
res, skipped := performCommit(ctx, "commit", []string{"-m", msg, "--author", author}, dEnv)
res, skipped := performCommit(ctx, "commit", []string{"-m", msg, "--author", author}, dEnv, cliCtx)
if res != 0 || skipped {
return nil, fmt.Errorf("dolt commit failed after merging")
}
@@ -593,12 +604,12 @@ func executeMergeAndCommit(ctx context.Context, dEnv *env.DoltEnv, spec *merge.M
}
// getCommitMsgForMerge returns user defined message if exists; otherwise, get the commit message from editor.
func getCommitMsgForMerge(ctx context.Context, dEnv *env.DoltEnv, userDefinedMsg, suggestedMsg string, noEdit bool) (string, error) {
func getCommitMsgForMerge(ctx context.Context, sqlCtx *sql.Context, userDefinedMsg, suggestedMsg string, noEdit bool, cliCtx cli.CliContext) (string, error) {
if userDefinedMsg != "" {
return userDefinedMsg, nil
}
msg, err := getCommitMessageFromEditor(ctx, dEnv, suggestedMsg, "", noEdit)
msg, err := getCommitMessageFromEditor(ctx, sqlCtx, suggestedMsg, "", noEdit, cliCtx)
if err != nil {
return msg, err
}
+14 -3
View File
@@ -27,7 +27,9 @@ import (
"github.com/dolthub/dolt/go/libraries/doltcore/merge"
"github.com/dolthub/dolt/go/libraries/doltcore/ref"
"github.com/dolthub/dolt/go/libraries/utils/argparser"
"github.com/dolthub/dolt/go/libraries/utils/iohelp"
"github.com/dolthub/dolt/go/store/datas"
"github.com/dolthub/go-mysql-server/sql"
)
var pullDocs = cli.CommandDocumentationContent{
@@ -69,6 +71,15 @@ func (cmd PullCmd) EventType() eventsapi.ClientEventType {
// Exec executes the command
func (cmd PullCmd) Exec(ctx context.Context, commandStr string, args []string, dEnv *env.DoltEnv, cliCtx cli.CliContext) int {
_, sqlCtx, closeFunc, err := cliCtx.QueryEngine(ctx)
if err != nil {
iohelp.WriteLine(cli.CliOut, err.Error())
return 1
}
if closeFunc != nil {
defer closeFunc()
}
ap := cli.CreatePullArgParser()
help, usage := cli.HelpAndUsagePrinters(cli.CommandDocsForCommandString(commandStr, pullDocs, ap))
@@ -102,7 +113,7 @@ func (cmd PullCmd) Exec(ctx context.Context, commandStr string, args []string, d
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
}
err = pullHelper(ctx, dEnv, pullSpec)
err = pullHelper(ctx, sqlCtx, dEnv, pullSpec, cliCtx)
if err != nil {
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
}
@@ -110,7 +121,7 @@ func (cmd PullCmd) Exec(ctx context.Context, commandStr string, args []string, d
}
// pullHelper splits pull into fetch, prepare merge, and merge to interleave printing
func pullHelper(ctx context.Context, dEnv *env.DoltEnv, pullSpec *env.PullSpec) error {
func pullHelper(ctx context.Context, sqlCtx *sql.Context, dEnv *env.DoltEnv, pullSpec *env.PullSpec, cliCtx cli.CliContext) error {
srcDB, err := pullSpec.Remote.GetRemoteDBWithoutCaching(ctx, dEnv.DoltDB.ValueReadWriter().Format(), dEnv)
if err != nil {
return fmt.Errorf("failed to get remote db; %w", err)
@@ -208,7 +219,7 @@ func pullHelper(ctx context.Context, dEnv *env.DoltEnv, pullSpec *env.PullSpec)
}
suggestedMsg := fmt.Sprintf("Merge branch '%s' of %s into %s", pullSpec.Branch.GetPath(), pullSpec.Remote.Url, headRef.GetPath())
tblStats, err := performMerge(ctx, dEnv, mergeSpec, suggestedMsg)
tblStats, err := performMerge(ctx, sqlCtx, dEnv, mergeSpec, suggestedMsg, cliCtx)
printSuccessStats(tblStats)
if err != nil {
return err
+1 -1
View File
@@ -70,7 +70,7 @@ func (cmd RevertCmd) Exec(ctx context.Context, commandStr string, args []string,
apr := cli.ParseArgsOrDie(ap, args, help)
// This command creates a commit, so we need user identity
if !cli.CheckUserNameAndEmail(dEnv) {
if !cli.CheckUserNameAndEmail(cliCtx.Config()) {
return 1
}