mirror of
https://github.com/dolthub/dolt.git
synced 2026-01-31 20:38:55 -06:00
Three dot dolt diff syntax
This commit is contained in:
@@ -275,6 +275,44 @@ func (dArgs *diffArgs) applyDiffRoots(ctx context.Context, dEnv *env.DoltEnv, ar
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// `dolt diff from_commit...to_commit ...tables`
|
||||
if strings.Contains(args[0], "...") {
|
||||
refs := strings.Split(args[0], "...")
|
||||
var fromRoot *doltdb.RootValue
|
||||
var toRoot *doltdb.RootValue
|
||||
ok := true
|
||||
|
||||
if len(refs[0]) > 0 {
|
||||
right := refs[1]
|
||||
// Use current HEAD if right side of `...` does not exist
|
||||
if len(refs[1]) == 0 {
|
||||
right = "HEAD"
|
||||
}
|
||||
|
||||
mergeBaseStr, verr := getMergeBaseFromStrings(ctx, dEnv, refs[0], right)
|
||||
if verr != nil {
|
||||
return nil, verr
|
||||
}
|
||||
|
||||
if fromRoot, ok = maybeResolve(ctx, dEnv, mergeBaseStr); !ok {
|
||||
return nil, fmt.Errorf("merge base invalid %s", mergeBaseStr)
|
||||
}
|
||||
|
||||
dArgs.fromRoot = fromRoot
|
||||
dArgs.fromRef = mergeBaseStr
|
||||
}
|
||||
|
||||
if len(refs[1]) > 0 {
|
||||
if toRoot, ok = maybeResolve(ctx, dEnv, refs[1]); !ok {
|
||||
return nil, fmt.Errorf("to ref in two dot diff must be valid ref: %s", refs[1])
|
||||
}
|
||||
dArgs.toRoot = toRoot
|
||||
dArgs.toRef = refs[1]
|
||||
}
|
||||
|
||||
return args[1:], nil
|
||||
}
|
||||
|
||||
// `dolt diff from_commit..to_commit ...tables`
|
||||
if strings.Contains(args[0], "..") {
|
||||
refs := strings.Split(args[0], "..")
|
||||
@@ -286,20 +324,14 @@ func (dArgs *diffArgs) applyDiffRoots(ctx context.Context, dEnv *env.DoltEnv, ar
|
||||
if fromRoot, ok = maybeResolve(ctx, dEnv, refs[0]); !ok {
|
||||
return nil, fmt.Errorf("from ref in two dot diff must be valid ref: %s", refs[0])
|
||||
}
|
||||
dArgs.fromRoot = fromRoot
|
||||
dArgs.fromRef = refs[0]
|
||||
}
|
||||
|
||||
if len(refs[1]) > 0 {
|
||||
if toRoot, ok = maybeResolve(ctx, dEnv, refs[1]); !ok {
|
||||
return nil, fmt.Errorf("to ref in two dot diff must be valid ref: %s", refs[1])
|
||||
}
|
||||
}
|
||||
|
||||
if fromRoot != nil {
|
||||
dArgs.fromRoot = fromRoot
|
||||
dArgs.fromRef = refs[0]
|
||||
}
|
||||
|
||||
if toRoot != nil {
|
||||
dArgs.toRoot = toRoot
|
||||
dArgs.toRef = refs[1]
|
||||
}
|
||||
|
||||
@@ -80,24 +80,33 @@ func (cmd MergeBaseCmd) Exec(ctx context.Context, commandStr string, args []stri
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(env.ErrActiveServerLock.New(dEnv.LockFile())), help)
|
||||
}
|
||||
|
||||
left, verr := ResolveCommitWithVErr(dEnv, apr.Arg(0))
|
||||
mergeBaseStr, verr := getMergeBaseFromStrings(ctx, dEnv, apr.Arg(0), apr.Arg(1))
|
||||
if verr != nil {
|
||||
return HandleVErrAndExitCode(verr, usage)
|
||||
}
|
||||
|
||||
right, verr := ResolveCommitWithVErr(dEnv, apr.Arg(1))
|
||||
cli.Println(mergeBaseStr)
|
||||
return 0
|
||||
}
|
||||
|
||||
func getMergeBaseFromStrings(ctx context.Context, dEnv *env.DoltEnv, leftStr, rightStr string) (string, errhand.VerboseError) {
|
||||
left, verr := ResolveCommitWithVErr(dEnv, leftStr)
|
||||
if verr != nil {
|
||||
return HandleVErrAndExitCode(verr, usage)
|
||||
return "", verr
|
||||
}
|
||||
|
||||
right, verr := ResolveCommitWithVErr(dEnv, rightStr)
|
||||
if verr != nil {
|
||||
return "", verr
|
||||
}
|
||||
|
||||
mergeBase, err := merge.MergeBase(ctx, left, right)
|
||||
if err != nil {
|
||||
verr = errhand.BuildDError("could not find merge-base for args %s", apr.Args).AddCause(err).Build()
|
||||
return HandleVErrAndExitCode(verr, usage)
|
||||
verr = errhand.BuildDError("could not find merge-base for args %s %s", leftStr, rightStr).AddCause(err).Build()
|
||||
return "", verr
|
||||
}
|
||||
|
||||
cli.Println(mergeBase.String())
|
||||
return 0
|
||||
return mergeBase.String(), nil
|
||||
}
|
||||
|
||||
func ResolveCommitWithVErr(dEnv *env.DoltEnv, cSpecStr string) (*doltdb.Commit, errhand.VerboseError) {
|
||||
|
||||
@@ -91,6 +91,112 @@ teardown() {
|
||||
[[ "$output" =~ "+ | 0" ]] || false
|
||||
}
|
||||
|
||||
@test "diff: two and three dot diff" {
|
||||
dolt checkout main
|
||||
dolt sql -q 'insert into test values (0,0,0,0,0,0)'
|
||||
dolt add .
|
||||
dolt commit -m table
|
||||
dolt checkout -b branch1
|
||||
dolt sql -q 'insert into test values (1,1,1,1,1,1)'
|
||||
dolt add .
|
||||
dolt commit -m row
|
||||
dolt checkout main
|
||||
dolt sql -q 'insert into test values (2,2,2,2,2,2)'
|
||||
dolt add .
|
||||
dolt commit -m newrow
|
||||
|
||||
# Two dot shows all changes between branches
|
||||
run dolt diff branch1
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "- | 1" ]] || false
|
||||
[[ "$output" =~ "+ | 2" ]] || false
|
||||
|
||||
run dolt diff branch1..
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "- | 1" ]] || false
|
||||
[[ "$output" =~ "+ | 2" ]] || false
|
||||
|
||||
run dolt diff branch1..main
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "- | 1" ]] || false
|
||||
[[ "$output" =~ "+ | 2" ]] || false
|
||||
|
||||
run dolt diff branch1 main
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "- | 1" ]] || false
|
||||
[[ "$output" =~ "+ | 2" ]] || false
|
||||
|
||||
run dolt diff ..branch1
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "+ | 1" ]] || false
|
||||
[[ "$output" =~ "- | 2" ]] || false
|
||||
|
||||
run dolt diff main..branch1
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "+ | 1" ]] || false
|
||||
[[ "$output" =~ "- | 2" ]] || false
|
||||
|
||||
run dolt diff main branch1
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "+ | 1" ]] || false
|
||||
[[ "$output" =~ "- | 2" ]] || false
|
||||
|
||||
# Three dot shows changes between common ancestor and branch
|
||||
run dolt diff branch1...
|
||||
[ "$status" -eq 0 ]
|
||||
[[ ! "$output" =~ "- | 1" ]] || false
|
||||
[[ "$output" =~ "+ | 2" ]] || false
|
||||
|
||||
run dolt diff branch1...main
|
||||
[ "$status" -eq 0 ]
|
||||
[[ ! "$output" =~ "- | 1" ]] || false
|
||||
[[ "$output" =~ "+ | 2" ]] || false
|
||||
|
||||
run dolt diff main...branch1
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "+ | 1" ]] || false
|
||||
[[ ! "$output" =~ "- | 2" ]] || false
|
||||
|
||||
run dolt diff main...branch1 test
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "+ | 1" ]] || false
|
||||
[[ ! "$output" =~ "- | 2" ]] || false
|
||||
|
||||
run dolt diff $(dolt merge-base branch1 main) main
|
||||
[ "$status" -eq 0 ]
|
||||
[[ ! "$output" =~ "- | 1" ]] || false
|
||||
[[ "$output" =~ "+ | 2" ]] || false
|
||||
|
||||
run dolt diff $(dolt merge-base main branch1) branch1
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "+ | 1" ]] || false
|
||||
[[ ! "$output" =~ "- | 2" ]] || false
|
||||
|
||||
# Dots work with --summary
|
||||
run dolt diff main..branch1 --summary
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1 Row Unmodified (50.00%)" ]] || false
|
||||
[[ "$output" =~ "1 Row Added (50.00%)" ]] || false
|
||||
[[ "$output" =~ "1 Row Deleted (50.00%)" ]] || false
|
||||
[[ "$output" =~ "0 Rows Modified (0.00%)" ]] || false
|
||||
[[ "$output" =~ "6 Cells Added (50.00%)" ]] || false
|
||||
[[ "$output" =~ "6 Cells Deleted (50.00%)" ]] || false
|
||||
[[ "$output" =~ "0 Cells Modified (0.00%)" ]] || false
|
||||
[[ "$output" =~ "(2 Row Entries vs 2 Row Entries)" ]] || false
|
||||
|
||||
run dolt diff main...branch1 --summary
|
||||
echo $output
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1 Row Unmodified (100.00%)" ]] || false
|
||||
[[ "$output" =~ "1 Row Added (100.00%)" ]] || false
|
||||
[[ "$output" =~ "0 Rows Deleted (0.00%)" ]] || false
|
||||
[[ "$output" =~ "0 Rows Modified (0.00%)" ]] || false
|
||||
[[ "$output" =~ "6 Cells Added (100.00%)" ]] || false
|
||||
[[ "$output" =~ "0 Cells Deleted (0.00%)" ]] || false
|
||||
[[ "$output" =~ "0 Cells Modified (0.00%)" ]] || false
|
||||
[[ "$output" =~ "(1 Row Entry vs 2 Row Entries)" ]] || false
|
||||
}
|
||||
|
||||
@test "diff: data and schema changes" {
|
||||
dolt sql <<SQL
|
||||
drop table test;
|
||||
@@ -284,6 +390,7 @@ EOF
|
||||
[[ "$output" =~ "table fake does not exist in either revision" ]] || false
|
||||
}
|
||||
|
||||
|
||||
@test "diff: with table and branch of the same name" {
|
||||
dolt sql -q 'create table dolomite (pk int not null primary key)'
|
||||
dolt add .
|
||||
|
||||
Reference in New Issue
Block a user