mirror of
https://github.com/dolthub/dolt.git
synced 2026-04-21 02:57:46 -05:00
Merge pull request #4636 from dolthub/pavel/dolt_commit-amend
Support --amend in dolt_commit
This commit is contained in:
+4
-1
@@ -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,
|
||||
|
||||
@@ -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}},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user