mirror of
https://github.com/dolthub/dolt.git
synced 2026-04-30 03:26:47 -05:00
update dolt commit to use sql queries
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user