dolt log works with ^ ancestor spec

This commit is contained in:
Taylor Bantle
2022-10-20 16:10:32 -07:00
parent 47edc3e0f7
commit 409dd36bbb
4 changed files with 70 additions and 18 deletions

View File

@@ -271,7 +271,7 @@ func getCommitOrTableFromString(ctx context.Context, str string, dEnv *env.DoltE
}
// ^<ref>
if strings.Contains(str, "^") {
if strings.HasPrefix(str, "^") {
commit := strings.TrimPrefix(str, "^")
notCs, err := getCommitSpec(commit)
if err != nil {

View File

@@ -289,35 +289,42 @@ func (ltf *LogTableFunction) invalidArgDetailsErr(expr sql.Expression, reason st
}
func (ltf *LogTableFunction) validateRevisionExpressions() error {
// We must convert the expressions to strings before making string comparisons
// For dolt_log('^main'), ltf.revisionExpr.String() = "'^main'"" and revisionStr = "^main"
revisionStr := ""
secondRevisionStr := ""
if ltf.revisionExpr != nil {
revisionStr = mustExpressionToString(ltf.ctx, ltf.revisionExpr)
if !sql.IsText(ltf.revisionExpr.Type()) {
return sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.revisionExpr.String())
}
if ltf.secondRevisionExpr == nil && strings.Contains(ltf.revisionExpr.String(), "^") {
if ltf.secondRevisionExpr == nil && strings.HasPrefix(revisionStr, "^") {
return ltf.invalidArgDetailsErr(ltf.revisionExpr, "second revision must exist if first revision contains '^'")
}
if strings.Contains(ltf.revisionExpr.String(), "..") && strings.Contains(ltf.revisionExpr.String(), "^") {
if strings.Contains(revisionStr, "..") && strings.HasPrefix(revisionStr, "^") {
return ltf.invalidArgDetailsErr(ltf.revisionExpr, "revision cannot contain both '..' and '^'")
}
}
if ltf.secondRevisionExpr != nil {
secondRevisionStr = mustExpressionToString(ltf.ctx, ltf.secondRevisionExpr)
if !sql.IsText(ltf.secondRevisionExpr.Type()) {
return sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.secondRevisionExpr.String())
}
if strings.Contains(ltf.secondRevisionExpr.String(), "..") {
if strings.Contains(secondRevisionStr, "..") {
return ltf.invalidArgDetailsErr(ltf.secondRevisionExpr, "second revision cannot contain '..'")
}
if strings.Contains(ltf.revisionExpr.String(), "..") {
if strings.Contains(revisionStr, "..") {
return ltf.invalidArgDetailsErr(ltf.revisionExpr, "revision cannot contain '..' if second revision exists")
}
}
if ltf.revisionExpr != nil && ltf.secondRevisionExpr != nil {
if strings.Contains(ltf.revisionExpr.String(), "^") && strings.Contains(ltf.secondRevisionExpr.String(), "^") {
if strings.HasPrefix(revisionStr, "^") && strings.HasPrefix(secondRevisionStr, "^") {
return ltf.invalidArgDetailsErr(ltf.revisionExpr, "both revisions cannot contain '^'")
}
if !strings.Contains(ltf.revisionExpr.String(), "^") && !strings.Contains(ltf.secondRevisionExpr.String(), "^") {
if !strings.HasPrefix(revisionStr, "^") && !strings.HasPrefix(secondRevisionStr, "^") {
return ltf.invalidArgDetailsErr(ltf.revisionExpr, "one revision must contain '^' if two revisions provided")
}
}
@@ -326,16 +333,16 @@ func (ltf *LogTableFunction) validateRevisionExpressions() error {
if ltf.revisionExpr == nil && ltf.secondRevisionExpr == nil {
return ltf.invalidArgDetailsErr(ltf.revisionExpr, "must have revision in order to use --not")
}
if ltf.revisionExpr != nil && (strings.Contains(ltf.revisionExpr.String(), "..") || strings.Contains(ltf.revisionExpr.String(), "^")) {
if ltf.revisionExpr != nil && (strings.Contains(revisionStr, "..") || strings.HasPrefix(revisionStr, "^")) {
return ltf.invalidArgDetailsErr(ltf.revisionExpr, "cannot use --not if '..' or '^' present in revision")
}
if ltf.secondRevisionExpr != nil && strings.Contains(ltf.secondRevisionExpr.String(), "^") {
if ltf.secondRevisionExpr != nil && strings.HasPrefix(secondRevisionStr, "^") {
return ltf.invalidArgDetailsErr(ltf.secondRevisionExpr, "cannot use --not if '^' present in second revision")
}
if strings.Contains(ltf.notRevision, "..") {
return sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), fmt.Sprintf("%s - %s", ltf.notRevision, "--not revision cannot contain '..'"))
}
if strings.Contains(ltf.notRevision, "^") {
if strings.HasPrefix(ltf.notRevision, "^") {
return sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), fmt.Sprintf("%s - %s", ltf.notRevision, "--not revision cannot contain '^'"))
}
}
@@ -483,16 +490,33 @@ func (ltf *LogTableFunction) evaluateArguments() (string, string, error) {
return revisionValStr, excludingRevisionValStr, nil
}
// Gets revisionName and/or excludingRevisionName from sql expression
func getRevisionsFromExpr(ctx *sql.Context, expr sql.Expression, canDot bool) (string, string, error) {
revisionVal, err := expr.Eval(ctx, nil)
func mustExpressionToString(ctx *sql.Context, expr sql.Expression) string {
str, err := expressionToString(ctx, expr)
if err != nil {
return "", "", err
return ""
}
return str
}
func expressionToString(ctx *sql.Context, expr sql.Expression) (string, error) {
val, err := expr.Eval(ctx, nil)
if err != nil {
return "", err
}
revisionValStr, ok := revisionVal.(string)
valStr, ok := val.(string)
if !ok {
return "", "", fmt.Errorf("received '%v' when expecting revision string", revisionVal)
return "", fmt.Errorf("received '%v' when expecting string", val)
}
return valStr, nil
}
// Gets revisionName and/or excludingRevisionName from sql expression
func getRevisionsFromExpr(ctx *sql.Context, expr sql.Expression, canDot bool) (string, string, error) {
revisionValStr, err := expressionToString(ctx, expr)
if err != nil {
return "", "", err
}
if canDot && strings.Contains(revisionValStr, "..") {
@@ -500,7 +524,7 @@ func getRevisionsFromExpr(ctx *sql.Context, expr sql.Expression, canDot bool) (s
return refs[1], refs[0], nil
}
if strings.Contains(revisionValStr, "^") {
if strings.HasPrefix(revisionValStr, "^") {
return "", strings.TrimPrefix(revisionValStr, "^"), nil
}

View File

@@ -5142,6 +5142,10 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
Query: "SELECT count(*) from dolt_log('new-branch');",
Expected: []sql.Row{{5}},
},
{
Query: "SELECT count(*) from dolt_log('main^');",
Expected: []sql.Row{{3}},
},
},
},
{
@@ -5205,6 +5209,14 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
Query: "SELECT count(*) from dolt_log('^main~', 'main');",
Expected: []sql.Row{{1}},
},
{
Query: "SELECT count(*) from dolt_log('^main^', 'main');",
Expected: []sql.Row{{1}},
},
{
Query: "SELECT count(*) from dolt_log('^main', 'main^');",
Expected: []sql.Row{{0}},
},
{
Query: "SELECT count(*) from dolt_log('^main', @Commit3);",
Expected: []sql.Row{{1}},

View File

@@ -89,6 +89,22 @@ teardown() {
[[ ! "$output" =~ "BRANCH1" ]] || false
run dolt log main..main
[ $status -eq 0 ]
run dolt log main^..branch1
[ $status -eq 0 ]
[[ ! "$output" =~ "MAIN" ]] || false
[[ ! "$output" =~ "AFTER" ]] || false
[[ "$output" =~ "BRANCH1" ]] || false
run dolt log ^main^ branch1
[ $status -eq 0 ]
[[ ! "$output" =~ "MAIN" ]] || false
[[ ! "$output" =~ "AFTER" ]] || false
[[ "$output" =~ "BRANCH1" ]] || false
run dolt log branch1 --not main^
[ $status -eq 0 ]
[[ ! "$output" =~ "MAIN" ]] || false
[[ ! "$output" =~ "AFTER" ]] || false
[[ "$output" =~ "BRANCH1" ]] || false
# Invalid two dot
run dolt log main..branch1 testtable
@@ -115,7 +131,7 @@ teardown() {
[ $status -eq 1 ]
run dolt log branch1 --not main branch1
[ $status -eq 1 ]
run dolt log branch1 --not main --not branch1
run dolt log branch1 --not main --not branch1
[ $status -eq 1 ]
run dolt log main...branch1