Merge pull request #4636 from dolthub/pavel/dolt_commit-amend

Support --amend in dolt_commit
This commit is contained in:
Pavel Safronov
2022-11-01 15:23:02 -07:00
committed by GitHub
5 changed files with 398 additions and 6 deletions
+4 -1
View File
@@ -28,6 +28,7 @@ type CommitStagedProps struct {
Message string
Date time.Time
AllowEmpty bool
Amend bool
Force bool
Name string
Email string
@@ -157,7 +158,9 @@ func GetCommitStaged(
stagedTblNames = append(stagedTblNames, n)
}
if len(staged) == 0 && !mergeActive && !props.AllowEmpty {
isEmpty := len(staged) == 0
allowEmpty := mergeActive || props.AllowEmpty || props.Amend
if isEmpty && !allowEmpty {
return nil, NothingStaged{notStaged}
}
@@ -92,9 +92,23 @@ func DoDoltCommit(ctx *sql.Context, args []string) (string, error) {
email = dSess.Email()
}
amend := apr.Contains(cli.AmendFlag)
msg, msgOk := apr.GetValue(cli.MessageArg)
if !msgOk {
return "", fmt.Errorf("Must provide commit message.")
if amend {
commit, err := dSess.GetHeadCommit(ctx, dbName)
if err != nil {
return "", err
}
commitMeta, err := commit.GetCommitMeta(ctx)
if err != nil {
return "", err
}
msg = commitMeta.Description
} else {
return "", fmt.Errorf("Must provide commit message.")
}
}
t := ctx.QueryTime()
@@ -111,6 +125,7 @@ func DoDoltCommit(ctx *sql.Context, args []string) (string, error) {
Message: msg,
Date: t,
AllowEmpty: apr.Contains(cli.AllowEmptyFlag),
Amend: amend,
Force: apr.Contains(cli.ForceFlag),
Name: name,
Email: email,
+27 -2
View File
@@ -468,14 +468,39 @@ func (d *DoltSession) NewPendingCommit(ctx *sql.Context, dbName string, roots do
return nil, err
}
headCommit := sessionState.headCommit
headHash, _ := headCommit.HashOf()
var mergeParentCommits []*doltdb.Commit
if sessionState.WorkingSet.MergeActive() {
mergeParentCommits = []*doltdb.Commit{sessionState.WorkingSet.MergeState().Commit()}
} else if props.Amend {
numParentsHeadForAmend := headCommit.NumParents()
for i := 0; i < numParentsHeadForAmend; i++ {
parentCommit, err := headCommit.GetParent(ctx, i)
if err != nil {
return nil, err
}
mergeParentCommits = append(mergeParentCommits, parentCommit)
}
err = actions.ResetSoftToRef(ctx, sessionState.dbData, "HEAD~1")
if err != nil {
return nil, err
}
}
pendingCommit, err := actions.GetCommitStaged(ctx, roots, sessionState.WorkingSet.MergeActive(), mergeParentCommits, sessionState.dbData.Ddb, props)
if _, ok := err.(actions.NothingStaged); err != nil && !ok {
return nil, err
if err != nil {
if props.Amend {
err = actions.ResetSoftToRef(ctx, sessionState.dbData, headHash.String())
if err != nil {
return nil, err
}
}
if _, ok := err.(actions.NothingStaged); err != nil && !ok {
return nil, err
}
}
return pendingCommit, nil
@@ -7703,9 +7703,24 @@ var DoltCommitTests = []queries.ScriptTest{
Expected: []sql.Row{{sql.NewOkResult(1)}},
},
{
Query: "CALL DOLT_COMMIT('-ALL', '-m', 'update table t');",
Query: "CALL DOLT_COMMIT('-ALL', '-m', 'update table terminator');",
SkipResultsCheck: true,
},
// check last commit
{
Query: "select message from dolt_log limit 1",
Expected: []sql.Row{{"update table terminator"}},
},
// amend last commit
{
Query: "CALL DOLT_COMMIT('-amend', '-m', 'update table t');",
SkipResultsCheck: true,
},
// check amended commit
{
Query: "select message from dolt_log limit 1",
Expected: []sql.Row{{"update table t"}},
},
{
Query: "CALL DOLT_RESET('--hard');",
Expected: []sql.Row{{0}},
@@ -7737,9 +7752,19 @@ var DoltCommitTests = []queries.ScriptTest{
Expected: []sql.Row{{sql.NewOkResult(0)}},
},
{
Query: "CALL DOLT_COMMIT('-Am', 'add table 2');",
Query: "CALL DOLT_COMMIT('-Am', 'add table 21');",
SkipResultsCheck: true,
},
// amend last commit
{
Query: "CALL DOLT_COMMIT('-amend', '-m', 'add table 2');",
SkipResultsCheck: true,
},
// check amended commit
{
Query: "select message from dolt_log limit 1",
Expected: []sql.Row{{"add table 2"}},
},
{
Query: "CALL DOLT_RESET('--hard');",
Expected: []sql.Row{{0}},
@@ -7767,4 +7792,296 @@ var DoltCommitTests = []queries.ScriptTest{
},
},
},
{
Name: "CALL DOLT_COMMIT('-amend') works to update commit message",
SetUpScript: []string{
"SET @@AUTOCOMMIT=0;",
"CREATE TABLE test (id INT PRIMARY KEY );",
"INSERT INTO test (id) VALUES (2)",
"CALL DOLT_ADD('.');",
"CALL DOLT_COMMIT('-m', 'original commit message');",
},
Assertions: []queries.ScriptTestAssertion{
{
Query: "SELECT message FROM dolt_log;",
Expected: []sql.Row{
{"original commit message"},
{"author: somebody"},
{"add table 2"},
{"drop table t"},
{"update table t"},
{"add table t"},
{"checkpoint enginetest database mydb"},
{"Initialize data repository"},
},
},
{
Query: "SELECT to_id, from_id, diff_type FROM dolt_diff_test;",
Expected: []sql.Row{{2, nil, "added"}},
},
{
Query: "CALL DOLT_COMMIT('--amend', '-m', 'amended commit message');",
SkipResultsCheck: true, // commit hash is being returned, skip check
},
{
Query: "SELECT message FROM dolt_log;",
Expected: []sql.Row{
{"amended commit message"},
{"author: somebody"},
{"add table 2"},
{"drop table t"},
{"update table t"},
{"add table t"},
{"checkpoint enginetest database mydb"},
{"Initialize data repository"},
},
},
{
Query: "SELECT to_id, from_id, diff_type FROM dolt_diff_test;",
Expected: []sql.Row{{2, nil, "added"}},
},
},
},
{
Name: "CALL DOLT_COMMIT('-amend') works to add changes to a commit",
SetUpScript: []string{
"SET @@AUTOCOMMIT=0;",
"INSERT INTO test (id) VALUES (3)",
"CALL DOLT_ADD('.');",
"CALL DOLT_COMMIT('-m', 'original commit message for adding changes to a commit');",
},
Assertions: []queries.ScriptTestAssertion{
{
Query: "SELECT to_id, from_id, diff_type FROM dolt_diff_test;",
Expected: []sql.Row{
{3, nil, "added"},
{2, nil, "added"},
},
},
{
Query: "SELECT COUNT(*) FROM dolt_status;",
Expected: []sql.Row{{0}},
},
{
Query: "SELECT message FROM dolt_log;",
Expected: []sql.Row{
{"original commit message for adding changes to a commit"},
{"amended commit message"},
{"author: somebody"},
{"add table 2"},
{"drop table t"},
{"update table t"},
{"add table t"},
{"checkpoint enginetest database mydb"},
{"Initialize data repository"},
},
},
{
Query: "INSERT INTO test (id) VALUES (4)",
Expected: []sql.Row{{sql.NewOkResult(1)}},
},
{
Query: "SELECT COUNT(*) FROM dolt_status;",
Expected: []sql.Row{{1}},
},
{
Query: "CALL DOLT_ADD('.');",
Expected: []sql.Row{{0}},
},
{
Query: "CALL DOLT_COMMIT('--amend');",
SkipResultsCheck: true, // commit hash is being returned, skip check
},
{
Query: "SELECT message FROM dolt_log;",
Expected: []sql.Row{
{"original commit message for adding changes to a commit"},
{"amended commit message"},
{"author: somebody"},
{"add table 2"},
{"drop table t"},
{"update table t"},
{"add table t"},
{"checkpoint enginetest database mydb"},
{"Initialize data repository"},
},
},
{
Query: "SELECT to_id, from_id, diff_type FROM dolt_diff_test;",
Expected: []sql.Row{
{4, nil, "added"},
{3, nil, "added"},
{2, nil, "added"},
},
},
{
Query: "INSERT INTO test (id) VALUES (5)",
Expected: []sql.Row{{sql.NewOkResult(1)}},
},
{
Query: "SELECT COUNT(*) FROM dolt_status;",
Expected: []sql.Row{{1}},
},
{
Query: "CALL DOLT_ADD('.');",
Expected: []sql.Row{{0}},
},
{
Query: "CALL DOLT_COMMIT('--amend', '-m', 'amended commit with added changes');",
SkipResultsCheck: true, // commit hash is being returned, skip check
},
{
Query: "SELECT COUNT(*) FROM dolt_status;",
Expected: []sql.Row{{0}},
},
{
Query: "SELECT message FROM dolt_log;",
Expected: []sql.Row{
{"amended commit with added changes"},
{"amended commit message"},
{"author: somebody"},
{"add table 2"},
{"drop table t"},
{"update table t"},
{"add table t"},
{"checkpoint enginetest database mydb"},
{"Initialize data repository"},
},
},
{
Query: "SELECT to_id, from_id, diff_type FROM dolt_diff_test;",
Expected: []sql.Row{
{5, nil, "added"},
{4, nil, "added"},
{3, nil, "added"},
{2, nil, "added"},
},
},
},
},
{
Name: "CALL DOLT_COMMIT('-amend') works to remove changes from a commit",
SetUpScript: []string{
"SET @@AUTOCOMMIT=0;",
"INSERT INTO test (id) VALUES (6)",
"INSERT INTO test (id) VALUES (7)",
"CALL DOLT_ADD('.');",
"CALL DOLT_COMMIT('-m', 'original commit message');",
},
Assertions: []queries.ScriptTestAssertion{
{
Query: "SELECT * FROM test;",
Expected: []sql.Row{{2}, {3}, {4}, {5}, {6}, {7}},
},
{
Query: "SELECT to_id, from_id, diff_type FROM dolt_diff_test;",
Expected: []sql.Row{
{7, nil, "added"},
{6, nil, "added"},
{5, nil, "added"},
{4, nil, "added"},
{3, nil, "added"},
{2, nil, "added"},
},
},
{
Query: "DELETE FROM test WHERE id = 6",
Expected: []sql.Row{{sql.NewOkResult(1)}},
},
{
Query: "CALL DOLT_ADD('.');",
Expected: []sql.Row{{0}},
},
{
Query: "CALL DOLT_COMMIT('--amend', '-m', 'amended commit with removed changes');",
SkipResultsCheck: true, // commit hash is being returned, skip check
},
{
Query: "SELECT * FROM test;",
Expected: []sql.Row{{2}, {3}, {4}, {5}, {7}},
},
{
Query: "SELECT message FROM dolt_log;",
Expected: []sql.Row{
{"amended commit with removed changes"},
{"amended commit with added changes"},
{"amended commit message"},
{"author: somebody"},
{"add table 2"},
{"drop table t"},
{"update table t"},
{"add table t"},
{"checkpoint enginetest database mydb"},
{"Initialize data repository"},
},
},
{
Query: "SELECT to_id, from_id, diff_type FROM dolt_diff_test;",
Expected: []sql.Row{
{7, nil, "added"},
{5, nil, "added"},
{4, nil, "added"},
{3, nil, "added"},
{2, nil, "added"},
},
},
},
},
{
Name: "CALL DOLT_COMMIT('-amend') works to update a merge commit",
SetUpScript: []string{
"SET @@AUTOCOMMIT=0;",
"CREATE TABLE test2 (id INT PRIMARY KEY, id2 INT);",
"CALL DOLT_ADD('.');",
"CALL DOLT_COMMIT('-m', 'original table');",
"CALL DOLT_CHECKOUT('-b','test-branch');",
"INSERT INTO test2 (id, id2) VALUES (0, 2)",
"CALL DOLT_ADD('.');",
"CALL DOLT_COMMIT('-m', 'conflicting commit message');",
"CALL DOLT_CHECKOUT('main');",
"INSERT INTO test2 (id, id2) VALUES (0, 1)",
"CALL DOLT_ADD('.');",
"CALL DOLT_COMMIT('-m', 'original commit message');",
"CALL DOLT_MERGE('test-branch');",
"CALL DOLT_CONFLICTS_RESOLVE('--theirs', '.');",
"CALL DOLT_COMMIT('-m', 'final merge');",
},
Assertions: []queries.ScriptTestAssertion{
{
Query: "CALL DOLT_COMMIT('--amend', '-m', 'new merge');",
SkipResultsCheck: true, // commit hash is being returned, skip check
},
{
Query: "SELECT message FROM dolt_log;",
Expected: []sql.Row{
{"new merge"},
{"original commit message"},
{"conflicting commit message"},
{"original table"},
{"amended commit with removed changes"},
{"amended commit with added changes"},
{"amended commit message"},
{"author: somebody"},
{"add table 2"},
{"drop table t"},
{"update table t"},
{"add table t"},
{"checkpoint enginetest database mydb"},
{"Initialize data repository"},
},
},
{
Query: "SET @hash=(SELECT commit_hash FROM dolt_log LIMIT 1);",
Expected: []sql.Row{{}},
},
{
Query: "SELECT COUNT(parent_hash) FROM dolt_commit_ancestors WHERE commit_hash= @hash;",
Expected: []sql.Row{{2}},
},
},
},
}
+32
View File
@@ -253,3 +253,35 @@ SQL
[[ "$commitmeta" =~ "$shaparent1" ]] || false
[[ "$commitmeta" =~ "$shaparent2" ]] || false
}
@test "checkout: dolt_commit --amend on merge commits does not modify metadata of merged parents" {
dolt sql -q "create table test (id int primary key, id2 int);"
dolt add .
dolt commit -m "original table"
dolt checkout -b test-branch
dolt sql -q 'insert into test (id, id2) values (0, 2);'
dolt add .
dolt commit -m "conclicting commit message"
shaparent1=$(dolt log --oneline --decorate=no | head -n 1 | cut -d ' ' -f 1)
# remove special characters (color)
shaparent1=$(echo $shaparent1 | sed -E "s/[[:cntrl:]]\[[0-9]{1,3}m//g")
dolt checkout main
dolt sql -q 'insert into test (id, id2) values (0, 1);'
dolt add .
dolt commit -m "original commit message"
shaparent2=$(dolt log --oneline --decorate=no | head -n 1 | cut -d ' ' -f 1)
# remove special characters (color)
shaparent2=$(echo $shaparent2 | sed -E "s/[[:cntrl:]]\[[0-9]{1,3}m//g")
dolt merge test-branch
dolt conflicts resolve --theirs .
dolt commit -m "final merge"
dolt sql -q "call dolt_commit('--amend', '-m', 'new merge');"
commitmeta=$(dolt log --oneline --parents | head -n 1)
[[ "$commitmeta" =~ "$shaparent1" ]] || false
[[ "$commitmeta" =~ "$shaparent2" ]] || false
}