diff --git a/go/cmd/dolt/commands/clean.go b/go/cmd/dolt/commands/clean.go index e8bcd6da96..9cd0a29f1e 100644 --- a/go/cmd/dolt/commands/clean.go +++ b/go/cmd/dolt/commands/clean.go @@ -15,12 +15,14 @@ package commands import ( + "bytes" "context" + "github.com/gocraft/dbr/v2" + "github.com/gocraft/dbr/v2/dialect" + "github.com/dolthub/dolt/go/cmd/dolt/cli" - "github.com/dolthub/dolt/go/cmd/dolt/errhand" "github.com/dolthub/dolt/go/libraries/doltcore/env" - "github.com/dolthub/dolt/go/libraries/doltcore/env/actions" "github.com/dolthub/dolt/go/libraries/utils/argparser" ) @@ -64,34 +66,61 @@ func (cmd CleanCmd) ArgParser() *argparser.ArgParser { return cli.CreateCleanArgParser() } +func (cmd CleanCmd) RequiresRepo() bool { + return false +} + // Exec executes the command func (cmd CleanCmd) Exec(ctx context.Context, commandStr string, args []string, dEnv *env.DoltEnv, cliCtx cli.CliContext) int { ap := cli.CreateCleanArgParser() - help, usage := cli.HelpAndUsagePrinters(cli.CommandDocsForCommandString(commandStr, cleanDocContent, ap)) + help, _ := cli.HelpAndUsagePrinters(cli.CommandDocsForCommandString(commandStr, cleanDocContent, ap)) apr := cli.ParseArgsOrDie(ap, args, help) - if dEnv.IsLocked() { - return HandleVErrAndExitCode(errhand.VerboseErrorFromError(env.ErrActiveServerLock.New(dEnv.LockFile())), help) - } - - roots, err := dEnv.Roots(ctx) + queryist, sqlCtx, closeFunc, err := cliCtx.QueryEngine(ctx) if err != nil { - return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage) + cli.Println(err.Error()) + return 1 } - - ws, err := dEnv.WorkingSet(ctx) - if err != nil { - return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage) + if closeFunc != nil { + defer closeFunc() } - roots, err = actions.CleanUntracked(ctx, roots, apr.Args, apr.Contains(DryrunCleanParam), false) - if err != nil { - return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage) + var params []interface{} + + firstParamDone := false + var buffer bytes.Buffer + buffer.WriteString("CALL DOLT_CLEAN(") + if apr.Contains(cli.DryRunFlag) { + buffer.WriteString("\"--dry-run\"") + firstParamDone = true } - err = dEnv.UpdateWorkingSet(ctx, ws.WithWorkingRoot(roots.Working).WithStagedRoot(roots.Staged).ClearMerge()) + if apr.NArg() > 0 { + // loop over apr.Args() and add them to the buffer + for i := 0; i < apr.NArg(); i++ { + if firstParamDone { + buffer.WriteString(", ") + } + buffer.WriteString("?") + params = append(params, apr.Arg(i)) + firstParamDone = true + } + } + buffer.WriteString(")") + query := buffer.String() + + if len(params) > 0 { + query, err = dbr.InterpolateForDialect(query, params, dialect.MySQL) + if err != nil { + cli.Println(err.Error()) + return 1 + } + } + + _, err = GetRowsForSql(queryist, sqlCtx, query) if err != nil { - return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage) + cli.Println(err.Error()) + return 1 } - return handleResetError(err, usage) + return 0 } diff --git a/go/cmd/dolt/dolt.go b/go/cmd/dolt/dolt.go index 7390ee5319..2a0ecee1a1 100644 --- a/go/cmd/dolt/dolt.go +++ b/go/cmd/dolt/dolt.go @@ -121,7 +121,6 @@ var doltSubCommands = []cli.Command{ } var commandsWithoutCliCtx = []cli.Command{ - commands.CleanCmd{}, admin.Commands, sqlserver.SqlServerCmd{VersionStr: Version}, sqlserver.SqlClientCmd{VersionStr: Version}, diff --git a/integration-tests/bats/helper/local-remote.bash b/integration-tests/bats/helper/local-remote.bash index 8415fc702d..66813fdd6c 100644 --- a/integration-tests/bats/helper/local-remote.bash +++ b/integration-tests/bats/helper/local-remote.bash @@ -81,7 +81,6 @@ SKIP_SERVER_TESTS=$(cat <<-EOM ~large-update.bats~ ~remotes.bats~ ~create-views.bats~ -~sql-clean.bats~ ~blame.bats~ ~multiple-tables.bats~ ~json-new-fmt.bats~ diff --git a/integration-tests/bats/sql-clean.bats b/integration-tests/bats/sql-clean.bats index 513744b708..2398aacd06 100644 --- a/integration-tests/bats/sql-clean.bats +++ b/integration-tests/bats/sql-clean.bats @@ -23,8 +23,7 @@ teardown() { # call proc dolt sql -q "create table test2 (pk int primary key)" - run dolt sql -q "call dolt_clean()" - [ $status -eq 0 ] + dolt sql -q "call dolt_clean()" run dolt status [ "$status" -eq 0 ] @@ -33,8 +32,7 @@ teardown() { # call dproc dolt sql -q "create table test2 (pk int primary key)" - run dolt sql -q "call dclean('--dry-run')" - [ $status -eq 0 ] + dolt sql -q "call dclean('--dry-run')" run dolt status [ "$status" -eq 0 ] diff --git a/integration-tests/bats/sql-local-remote.bats b/integration-tests/bats/sql-local-remote.bats index 5a733f5d72..c10a9e3cd1 100644 --- a/integration-tests/bats/sql-local-remote.bats +++ b/integration-tests/bats/sql-local-remote.bats @@ -795,6 +795,44 @@ SQL [[ $output =~ 'Revert "Commit ABCDEF"' ]] || false } +@test "sql-local-remote: Ensure that dolt clean works for each mode" { + dolt reset --hard + dolt sql -q "create table tbl (pk int primary key)" + + start_sql_server altDB + + run dolt --verbose-engine-setup clean --dry-run + [ $status -eq 0 ] + [[ $output =~ "starting remote mode" ]] || false + + run dolt status + [ $status -eq 0 ] + [[ $output =~ "Untracked tables" ]] || false + + dolt clean + + run dolt status + [ $status -eq 0 ] + [[ $output =~ "nothing to commit, working tree clean" ]] || false + + stop_sql_server 1 + + dolt sql -q "create table tbl (pk int primary key)" + run dolt --verbose-engine-setup clean --dry-run + [ $status -eq 0 ] + [[ $output =~ "starting local mode" ]] || false + + run dolt status + [ $status -eq 0 ] + [[ $output =~ "Untracked tables" ]] || false + + dolt clean + + run dolt status + [ $status -eq 0 ] + [[ $output =~ "nothing to commit, working tree clean" ]] || false +} + @test "sql-local-remote: verify dolt tag behavior" { cd altDB